2012-04-10 52 views
3

我正在创建图像查看器类应用程序。我在Windows上并使用.Net拖拽时突出显示矩形区域

在我的应用程序中,我试图在拖动时突出显示特定区域。 我已经创建了一个矩形。

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(); 
} 

我的代码。 现在我想将INVERSE拖拽区域(拖拽区域之外的区域)变暗,我的意思是这个矩形内的区域应该在拖拽时突出显示。

任何想法如何继续。

谢谢。

-Pankaj

回答

4

我想你可以通过创建一个Region对象覆盖的矩形以外,并与半透明SolidBrush填充它,使它看起来黑暗做到这一点。

您也不必创建图形并绘制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

感谢卢卡斯,它的工作正是我所需要的。 是的,我已经在自定义图片框类的顶部创建了这个矩形,我不仅移动了这个矩形,而且还能够完美调整它的大小(保持其中一个角) 再次感谢。 – Pankaj 2012-04-10 19:38:56

+0

我很高兴它帮助:)。如果您能将我的答案标记为正确,我将不胜感激:)。 – 2012-04-10 20:07:48