2012-07-11 5 views
0

나는 이미지의 일부를 선택하기 위해 도구를 만들고 있습니다. 나는 그것을 만들기 위해 PictrureBox, 간단한 방법이있다 : 나는 마우스를 오른쪽으로 이동하고 아래로하면Windows에서 이미지의 일부분을 선택하십시오.

void StartPanel(object sender, MouseEventArgs args) 
{ 
    xStart = args.X; 
    yStart = args.Y; 
    panelStarted = true; 
    pan.Location = new Point(xStart, yStart); 
} 
void FinishPanel(object sender, MouseEventArgs args) 
{ 
    xFinish = args.X; 
    yFinish = args.Y; 
    panelStarted = false; 
} 

void UpdatePanel(object sender, MouseEventArgs args) 
{ 
    if (panelStarted) 
    { 
     int x = args.X; 
     int y = args.Y; 

     int newxstart = xStart; 
     int newystart = yStart; 
     int neww = 0; 
     int newh = 0; 

     if (x >= xStart) 
      neww = x - xStart; 
     else 
     { 
      neww = xStart - x; 
      newxstart = x; 
     } 
     if (y >= yStart) 
      newh = y - yStart; 
     else 
     { 
      newh = yStart - y; 
      newystart = y; 
     } 

     pan.Size = new Size(neww, newh); 
     pan.Location = new Point(newxstart, newystart); 
    } 
} 

, 절대적으로 괜찮습니다. 하지만 왼쪽이나 위로 움직이면 내 영역에서 깜박 거리는 것을 볼 수 있습니다. Panel.Location이 변경 되었기 때문에 마우스를 왼쪽 또는 위로 움직이면 패널이 다시 그려지고, 마우스를 오른쪽/아래로 움직이면 위치가 변경되지 않고 크기 만 변경되므로 이해합니다. 다시 그려지지 않으면 일부 픽셀 만 패널에 추가됩니다. 이것에 대한 표준 솔루션은 무엇입니까?

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

표준 해결책은 Paint 이벤트에서 Panel 컨트롤을 사용하는 대신 e.Graphics.FillRectangle()을 사용하는 것입니다. –

답변

0

그것은이다 : 패널 크기를 조정할 때 그리기 문제를 설명하고 있기 때문에

0

은 아마 가장 쉬운 수정은 이중 버퍼 및 크기 조정에 이벤트를 무효화 하나를 사용하는 패널을 교체하는 것입니다 당신이하려고하는 것을보기 위해 쉽지는 않지만, 당신은 아래처럼 이미지의 일부를 캡쳐하는 그림 상자 표면 위로 드래그 할 수있는 드래그 가능한 컨트롤로서 패널을 사용하고 있다고 생각합니다 - 네?

그렇다면이 방법이 최선의 방법은 아닙니다. picturebox 표면에 직사각형을 그려서 드래그하는 것이 좋습니다. 마우스 이벤트를 사용하여 왼쪽 위 모서리를 설정하고 onpaint를 사용하여 이미지 위에 채워지지 않은 사각형을 그리는 것만으로 간단합니다. 준비가되었을 때 이미지를 캡처하는 것은 원하는 이벤트를 사용하여 간단합니다. 그런 다음 동일한 위치를 제공하는 이미지를 새 비트 맵에 복사하십시오.

하나의 컨트롤을 다른 컨트롤 위에두면 종종 이중 버퍼링이있는 경우에도 깜박임이 발생합니다. 또한 훨씬 더 많은 코드가 필요합니다.

관련 문제