2016-04-21 96 views
1

我有一個圖表(myChart)和更多ChartArea在MyArea中是ChartAreasCollection。我必須確定是否在集合的某個ChartArea中進行了雙擊以選擇它。通過下面編寫的代碼,每個ChartArea都具有相同的限制值(x,y),因此if條件始終爲真,即使點擊是在第一個區域完成的。檢測哪個ChartArea被雙擊

每個chartarea都可以看到或不可見,所以使用這個函數我必須檢查計數器ActiveAreas是否可見多於一個。

private void chartInForm_DoubleClick(object sender, EventArgs e) 
{ 
    if (ActiveAreas > 1) 
    { 
     Point mouse = ((MouseEventArgs)e).Location; 

     foreach (ChartArea ca in MyArea) 
     { 
      if (mouse.X > ca.Position.X && 
       mouse.X < ca.Position.X + ca.Position.Width * myChart.Width/100 && 
       mouse.Y > ca.Position.Y && 
       mouse.Y < ca.Position.Y + ca.Position.Height * myChart.Height/100) 
      MessageBox.Show(ca.Name); 
     } 

    } 
} 
+0

我認爲你捕捉同一方法中所有圖表的點擊事件,是否正確? – Zalomon

回答

0

這應有助於:

private void chartInForm_MouseDoubleClick(object sender, MouseEventArgs e) 
{ 
    foreach(ChartArea ca in chartInForm.ChartAreas) 
    { 
     if (ChartAreaClientRectangle(chartInForm, ca).Contains(e.Location)) 
     { 
      Console.WriteLine(" You have double-clicked on chartarea " + ca.Name; 
      break; 
     } 
    } 
} 

計算CA的像素位置時的關鍵是使用Position.ToRectangleF;它甚至會帶回來的結果,當ChartArea自動定位..:

RectangleF ChartAreaClientRectangle(Chart chart, ChartArea CA) 
{ 
    RectangleF CAR = CA.Position.ToRectangleF(); 
    float pw = chart.ClientSize.Width/100f; 
    float ph = chart.ClientSize.Height/100f; 
    return new RectangleF(pw * CAR.X, ph * CAR.Y, pw * CAR.Width, ph * CAR.Height); 
} 

注意,隱形ChartAreas默認情況下不會被點擊也不會對他們佔用空間和其他人將移動到自己的位置。但是,如果你設置了固定頭寸可能更改,你可能確實需要添加一個支票ca.Visible ...