2014-02-09 78 views
1

我有一個Windows窗體應用程序,需要能夠選擇窗體上的對象,就像您通過左鍵單擊來選擇桌面上的文件一樣拖過這些文件,如下圖所示:使用System.Drawing.DrawRectangle繪製選擇矩形來選擇東西

enter image description here

我有我我自己寫了下面的代碼,但它是可怕的。這是不對的。我現在不太擔心它的「選擇」部分,我主要關心如何畫這樣的畫面?

private void splitContainer1_Panel1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (mouseDown) 
    { 
     // TODO: Draw Rectangle (so you can select elements on the canvas). 


     Graphics graphics = Graphics.FromHwnd(splitContainer1.Panel1.Handle); 
     graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 

     Pen pen = new Pen(Color.SlateBlue, 0.5f); 

     graphics.PageUnit = GraphicsUnit.Pixel; 

     graphics.DrawRectangle(pen, e.X, e.Y, (e.Location.X + e.X) - lastCursorLocation.X, (e.Location.Y + e.Y) - lastCursorLocation.Y); 
    } 
} 

更新

私人無效splitContainer1_Panel1_Paint(對象發件人,PaintEventArgs的E){ // TODO:繪製矩形(這樣你就可以在畫布上選擇元素)。

 Graphics graphics = Graphics.FromHwnd(splitContainer1.Panel1.Handle); 
     graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 

     Pen pen = new Pen(Color.SlateBlue, 0.5f); 

     graphics.PageUnit = GraphicsUnit.Pixel; 

     graphics.DrawRectangle(pen, 1, 1, 1, 1); 

     Invalidate(); 
    } 

將代碼放入Paint事件並調用Invalidate()之後,沒有任何東西會繪製在窗體上。我顯然做錯了什麼,但是什麼?

+0

不要那樣做。相反,處理'Paint'事件並重繪所有內容。 – SLaks

+0

@SLaks,謝謝,但我不明白。如果我處理表單或面板的Paint事件,如果沒有MouseDown/MouseMove事件,它將如何知道我要拖動的時間? – 0550

+0

調用'Invalidate()'強制重繪。 – SLaks

回答