2012-04-10 6 views
3

응용 프로그램의 이미지 뷰어를 생성 중입니다. 나는 Windows에 있고 닷넷을 사용 중이다.드래그하는 동안 사각형 영역 강조 표시

내 응용 프로그램에서 드래그하는 동안 특정 영역을 강조 표시하려고합니다. 직사각형을 만들었습니다.

Rectangle areaRect = new Rectangle(100,100, 300, 300); 
Point ptOld = new Point(0, 0); 
Pen rectPen = new Pen(Brushes.White, 3); 

protected override void OnPaint(PaintEventArgs e) 
{ 
    Graphics dcPaint = e.Graphics; 
    dcPaint.DrawRectangle(rectPen, areaRect); 
} 

지금 내 마우스의 움직임과 함께이 사각형 영역을 드래그하고있다.

protected override void OnMouseMove(MouseEventArgs e) 
{ 
Point ptNew = new Point(e.X, e.Y); 
int dx = ptNew.X - ptOld.X; 
int dy = ptNew.Y - ptOld.Y; 
areaRect.Offset(dx, dy); 
MoveRect(ptNew); 
ptOld = ptNew; 
} 

여기

나는이 점은 잘 작동 될 때까지 내 마우스와 함께

void MoveRect(Point point) 
{ 
Graphics grfxClient = CreateGraphics(); 
Rectangle tempRectangle = new Rectangle(areaRect.Left, areaRect.Top, areaRect.Width, areaRect.Height); 
grfxClient.DrawRectangle(rectPen, tempRectangle); 
this.Invalidate(); 
grfxClient.Dispose(); 
} 

내 코드를이 RECT를 이동하려합니다. 이제 INVERSE 드래그 영역 (드래그 영역 밖에있는 영역)을 어둡게하고 싶습니다. 드래그하는 동안이 Rectangle 영역이 강조 표시되어야 함을 의미합니다.

어떻게 진행할 지 생각해보십시오.

감사합니다.

-Pankaj

답변

4

난 당신이 사각형의 외부 커버가 어두워 보이게하기 위해 반투명 SolidBrush로 채우기 Region 객체를 생성하여 그것을 할 수 있다고 생각.

그래픽을 만들고 OnMouseMove 이벤트에 그릴 필요는 없지만 사각형을 이동하고 그리는 컨트롤의 표면을 무효화하면됩니다.

내가 사용하는 코드는 더 많거나 적은 같은 같습니다

Rectangle areaRect = new Rectangle(100,100, 300, 300); 
Point ptOld = new Point(0, 0); 
Pen rectPen = new Pen(Brushes.White, 3); 

//A new field with a semi-transparent brush to paint the outside of the rectangle 
Brush dimmingBrush = new SolidBrush(Color.FromArgb(128, 0, 0, 0)); 

protected override void OnPaint(PaintEventArgs e) 
{ 
    Region outsideRegion = new System.Drawing.Region(e.ClipRectangle); 
    outsideRegion.Exclude(areaRect); 
    Graphics dcPaint = e.Graphics; 
    dcPaint.FillRegion(dimmingBrush, outsideRegion); 
    dcPaint.DrawRectangle(rectPen, areaRect); 
} 

protected override void OnMouseMove(MouseEventArgs e) 
{ 
    Point ptNew = new Point(e.X, e.Y); 
    int dx = ptNew.X - ptOld.X; 
    int dy = ptNew.Y - ptOld.Y; 
    areaRect.Offset(dx, dy); 
    ptOld = ptNew; 
    this.Invalidate(); 
} 

MoveRect라는 이름의 방법은 필요하지 않습니다.

이제는 원하는대로 작동하는 것 같습니다.

제안

는 또한 몇 가지 제안이있다. 당신은 그들을 사용할 필요가 없습니다, 아마 그들은 당신을 위해 도움이 될 것입니다.

Form 메서드를 무시하고 그 위에 직접 그리는 데 사용하는 컨트롤의 종류를 작성하지 않았지만 PictureBox 컨트롤을 사용하고이 컨트롤에서 파생 된 사용자 지정 컨트롤을 만들고 재정의하는 것이 좋습니다. 그 사건들. 이것은 페인팅 프로세스를 부드럽게 만들어야하고 깜빡임을 방지해야합니다. 이런 식 수행하려면 :

  • 사용자 컨트롤 ...을 추가하고 MyPictureBox
  • 변화 컨트롤의 부모 클래스, 즉 새 컨트롤의 이름을 선택하여 새 사용자 정의 컨트롤을 만들기 때문에,

    public partial class MyPictureBox : PictureBox 
    
  • 열려있는 파일 MyPictureBox.Designer : 지금은 라인을 포함해야합니다.CS 및 주석이 라인 :

    //this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
    //this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
    
  • 사본 나는이 대답에 게시 코드와 추가 라인 base.OnPaint(e);OnPaint 방법

  • 의 시작 컴파일 프로젝트

  • 지금

    을 수행해야 도구 상자에서 MyPictureBox 컨트롤을 드래그하여 추가 코드 없이도 사용할 수 있습니다.

강조 표시된 영역의 동작을 변경하여 마우스 커서가 가운데에 오도록 할 수도 있습니다. 나는 그것이 사용자에게 더 직관적이라고 생각한다.

코드에 문제가있는 경우 의견에 적어두면 도움을 드리겠습니다. :)

+0

감사합니다. Lucas, 그것은 정확하게 작동합니다. 예 사용자 정의 PictureBox 클래스의 맨 위에이 사각형을 만들고이 Rect를 움직일뿐 아니라 완벽하게 크기를 조정할 수 있습니다 (모서리 중 하나를 잡고). 다시 한 번 감사드립니다. – Pankaj

+0

도움이 된 것을 기쁘게 생각합니다. :). 내 대답을 올바른 것으로 표시 할 수 있다면 감사하게 생각합니다 :). –

관련 문제