2012-04-10 46 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