在Winform中我用了一個panel畫出了一些幾何圖形,有polygon和rectangle 還有string。現在我想從圖形中選擇一部分洗掉。我的想法是在這個幾何圖上再弄一個透明的extendedPanel1, 在extendedPanel1中畫出滑鼠選擇框(類似windows中檔案選擇), 再根據坐標與面積計算底層panel中的圖形是否在這個區域,從而判斷并重畫panel。
下面是圖形與代碼:
紅色是我畫出的幾何圖, 綠色是滑鼠選擇呈現的矩形。現在的問題是, 在滑鼠選擇中出現很多之前的矩形。extendedPanel1 是給自己繼承的新panel類, 在里面定義了透明度。現在每次新畫出的滑鼠矩形框中依然存在前一步的框, 就算我用了Invalidate 還是不管用。 如果無透明度,那么可以實作這種選擇,也就是跟其他畫圖軟體一樣,但由于 extendedPanel1 是透明的,每次只是底重新加載, 但里面畫的圖不消失。試了下取消控制元件也不適合。不知該怎么解決,或者是否有更好的解決方法? (但需要在winform中)

// 新定義的透明panel
public class ExtendedPanel : Panel
{
private const int WS_EX_TRANSPARENT = 0x20;
public ExtendedPanel()
{
SetStyle(ControlStyles.Opaque, true);
}
private int opacity = 0;
[DefaultValue(0)]
public int Opacity
{
get
{
return this.opacity;
}
set
{
if (value < 0 || value > 100)
throw new ArgumentException("value must be between 0 and 100");
this.opacity = value;
}
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT;
return cp;
}
}
protected override void OnPaint(PaintEventArgs e)
{
using (var brush = new SolidBrush(Color.FromArgb(this.opacity * 255 / 100, this.BackColor)))
{
e.Graphics.FillRectangle(brush, this.ClientRectangle);
}
base.OnPaint(e);
}
}
// 滑鼠的代碼
private void SetSelectionRect()
{
int x, y;
int width, height;
x = selectionStart.X > selectionEnd.X ? selectionEnd.X : selectionStart.X;
y = selectionStart.Y > selectionEnd.Y ? selectionEnd.Y : selectionStart.Y;
width = selectionStart.X > selectionEnd.X ? selectionStart.X - selectionEnd.X : selectionEnd.X - selectionStart.X;
height = selectionStart.Y > selectionEnd.Y ? selectionStart.Y - selectionEnd.Y : selectionEnd.Y - selectionStart.Y;
selection = new Rectangle(x, y, width, height);
}
private void extendedPanel1_Paint(object sender, PaintEventArgs e)
{
base.OnPaint(e);
extendedPanel1.Opacity = 0;
if (mouseDown)
{
using (Pen pen = new Pen(Color.Green, 1F))
{
pen.DashStyle = DashStyle.Dash;
e.Graphics.DrawRectangle(pen, selection);
}
}
}
private void extendedPanel1_MouseDown(object sender, MouseEventArgs e)
{
selectionStart = extendedPanel1.PointToClient(MousePosition);
mouseDown = true;
}
private void extendedPanel1_MouseUp(object sender, MouseEventArgs e)
{
mouseDown = false;
SetSelectionRect();
extendedPanel1.Invalidate();
}
private void extendedPanel1_MouseMove(object sender, MouseEventArgs e)
{
if (!mouseDown)
return;
selectionEnd = extendedPanel1.PointToClient(MousePosition);
SetSelectionRect();
extendedPanel1.Invalidate();
}
uj5u.com熱心網友回復:
給你一個思路,在 Mouse.Move 事件中做以下處理:1、繪制新的選擇框后,將該矩形框暫存起來,以備后續使用
2、繪制新的選擇框前,需要清除步驟 1 繪制的選擇框,否則就像你的截圖一樣,留下很多以前繪制的殘留框
3、可以研究一下 ControlPaint.DrawReversibleFrame(),這是個畫矩形框的方法
uj5u.com熱心網友回復:
就在原圖上再畫一個框,后臺放一個與之相關系的狀態物件,操控這個狀態物件就是了。比如定義一個Border的物件,里邊包含圖形資料的長寬坐標半徑、z軸或深度等,如果滑鼠移到某個框上,就更改相應物件的狀態值,則邊框根據需要畫出來。洗掉某個框,就移除這個物件即可。uj5u.com熱心網友回復:
新畫的框,使用背景色。自然就蓋住了轉載請註明出處,本文鏈接:https://www.uj5u.com/net/9882.html
標籤:C#
上一篇:C# double計算問題
下一篇:C#如何控制用戶請求數?
