在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熱心網友回復:
樓主這是C/C++論壇,建議找一下C#的問一下吧轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/11104.html
標籤:C語言
上一篇:Type or namespace definition, or end-of-file expected怎么改正呢
