如何解决C#Winform Panel清除/完全更新---用于鼠标的多项选择
我想在面板中选择一些结构(多边形和矩形)。我使用了新的ExtendedPanel
类,以实现鼠标面板的不透明性。panel1
用于结构,extendedPanel1
用于鼠标的选定区域。 (SetSelectionRect()
就是选择区域的集合)
在下图中,红色是我在panel1上绘制的图形,绿色是由鼠标选择的矩形。实际上,它应该显示一个绿色矩形,这是鼠标选择结束时的矩形,但是现在有很多。这表明extendetPanel1
中的透明度设置在extendedPanel1.Invalidate();
之后起作用,但是绘制的历史矩形不会消失。
您能告诉我,如何在面板中编写鼠标选择代码?
我实际上想实现一些多边形并进行编辑。我在panel1
中绘制了一些多边形(矩形),现在我想使用鼠标来选择一些部分并进行一些更改(例如删除一些多边形)。
我对此的想法是:在panel1
上绘制多边形,panel2
用鼠标显示选择,但是panel2
的底部是透明的。
然后,根据坐标计算等,判断panel1
中的几何图形是否在panel2
中选择的区域中。如果是,那么我将其删除。我不知道我的想法是否合理。
如果您能提供合适的解决方案,我非常感谢。
extendetpanel代码:
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 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();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。