2012-07-26 3 views
1

이 일반 사항은 향후 제공 될 수 있도록 계속 노력하겠습니다.패널의 개체에 대한 "클릭 앤 드래그 - 마우스 오버"동작

양식에 사각형이있는 사각형 ("점"으로 개별적으로 언급하는 RectangleShapes)이 있다고 가정 해 보겠습니다.이 격자의 크기는 양식이로드되기 전에 달라질 수 있으므로 모든 점을 우리가 처음으로 양식을로드 할 때 패널을 사용할 수 있습니다 ...

foreach (Squares point in mySquares) 

... 우리는 행동이나 외관을 변경하고 싶습니다. 이제는 사용자가 왼쪽이나 오른쪽을 클릭 할 때 각 개별 점의 색상을 변경하는 코드를 이미 개발했습니다. 다음과 같이 표시됩니다.

private void panelGrid_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left || e.Button == MouseButtons.Right) 
    { 
     foreach (Squares point in mySquares) 
     { 
      if (point.Rectangle.Contains(e.Location))  // determine which point to use 
      { 
       if (e.Button == MouseButtons.Left) 
       { 
        Pencil(point);  // left-click to fill color 
       } 
       else 
       { 
        Erase(point);  // right-click to erase color 
       } 
      } 
     } 
    panelGrid.Invalidate();   // refreshes grid 
    } 
} 

그리고 이것은 매력처럼 작동합니다. 그러나이 코드를 변경해야한다고 가정하십시오. 이제 마우스 버튼을 누르고 커서를 새 점으로 이동하면 색상이 변경되기를 원합니다. (MS-Paint와 유사합니다 : 연필 도구를 여러 픽셀 위로 끌면 차례로 채워집니다.)

이 동작을 올바르게 구현하는 올바른 방법은 무엇입니까? 나의 이해에, 나는 때 연필/지우개 방법은 호출 할 것이다 :

A.) 마우스는 버튼이 이미 누르고 A "지점"을 입력합니다.

OR

B.) 마우스 버튼을 누르면된다. 위의 코드는

입니다. 여기에 새로운 체크를 구현하는 가장 좋은 방법과 그리드의 개별 지점에서 수행하는 방법이 필요합니다. 어떤 팁?

private void MouseStuff(MouseEventArgs e) { 
    if (e.Button == MouseButtons.Left || e.Button == MouseButtons.Right) 
    { 
    foreach (Squares point in mySquares) { 
     if (point.Square.Contains(e.Location)) { 
     if (e.Button == MouseButtons.Left) { 
      Pencil(point); 
     } else { 
      Erase(point); 
     } 
     } 
    } 
    panelGrid.Invalidate(); 
    } 
} 

다음 두 이벤트에서 호출 시도 : 더블 버퍼링 패널을 사용하여에

private void panelGrid_MouseDown(object sender, MouseEventArgs e) { 
    MouseStuff(e); 
} 

private void panelGrid_MouseMove(object sender, MouseEventArgs e) { 
    MouseStuff(e); 
} 

봐 당신이 MouseDown 및 MouseMove 이벤트 이벤트가 같은 일을 할 것처럼

답변

1

는 소리 MouseMove 이벤트에서 패널을 무효화하면 컨트롤이 덜 번쩍 거리게됩니다.

public class BufferedPanel : Panel { 
    public BufferedPanel() { 
    this.DoubleBuffered = true; 
    this.ResizeRedraw = true; 
    } 
} 
+0

솔루션이 너무 단순 할 때 나는 그것을 좋아하지만, 나는 그것을 놓치기 만하면 항상 싫어합니다. 완벽하게 작동합니다! - 또한 BufferedPanel 팁에 대해 특별히 감사드립니다. 여러 가지 다른 문제가 수정되었습니다. – 4444

+0

@Doc 문제 없습니다. 기꺼이 도와주세요. – LarsTech