我有一個Windows窗體應用程序,需要能夠選擇窗體上的對象,就像您通過左鍵單擊來選擇桌面上的文件一樣拖過這些文件,如下圖所示:使用System.Drawing.DrawRectangle繪製選擇矩形來選擇東西
我有我我自己寫了下面的代碼,但它是可怕的。這是不對的。我現在不太擔心它的「選擇」部分,我主要關心如何畫這樣的畫面?
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()之後,沒有任何東西會繪製在窗體上。我顯然做錯了什麼,但是什麼?
不要那樣做。相反,處理'Paint'事件並重繪所有內容。 – SLaks
@SLaks,謝謝,但我不明白。如果我處理表單或面板的Paint事件,如果沒有MouseDown/MouseMove事件,它將如何知道我要拖動的時間? – 0550
調用'Invalidate()'強制重繪。 – SLaks