c# - C# Winform Panel clear / full update --- 用于鼠标多选
问题描述
我想在面板中选择一些结构(多边形和矩形)。我使用了新的ExtendedPanel
类,用于鼠标面板的不透明度。
panel1
用于结构,extendedPanel1
用于鼠标的选定区域。(SetSelectionRect()
是选择区域的集合)
下图中,红色是我在panel1上绘制的图形,绿色是鼠标选中的矩形。其实应该是呈现一个绿色的矩形,就是鼠标选择结束时的那个矩形,不过现在多了很多。这说明extendetPanel1
之后作品中的透明度设置extendedPanel1.Invalidate();
,但绘制的历史矩形并没有消失。
你能告诉我,我应该如何在面板中编写鼠标选择的代码?
我实际上想实现一些多边形和编辑。我在 中画了一些多边形(矩形)panel1
,现在我想用鼠标选择一些部分并进行一些更改(例如删除一些多边形)。
我对此的想法是:在 上绘制多边形panel1
,并panel2
通过鼠标显示选择,但底部panel2
是透明的。
然后根据坐标计算等,判断 中的几何图形是否在panel1
中选择的区域内panel2
。如果是,那我就删了。我不知道我的想法是否合理。如果您能提供合适的解决方案,我将不胜感激。
扩展面板代码:
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();
}
解决方案
推荐阅读
- google-chrome-extension - `chrome.identity.launchWebAuthFlow` 在 Chrome 退出时忘记会话
- r - 制作分组箱线图时出现“二元运算符错误的非数字参数”
- python - 从 Pandas DataFrame 中消除重复条目
- visual-studio - Visual Studio - 发布时出现 aspnet_merge.exe 错误
- macos - vs代码内部人员arm64“扩展主机意外终止”在m1 macbook上
- php - 同一页面中的linkedIn和facebook是否可以使用相同的Open graph标签?
- python - 合并python列表中的字符串
- azure - 配置 Azure 应用注册以更改 Active Directory 用户密码
- c# - 如何在 C# 项目中从 C++ dll 导入导出的 char*
- sql - 获取上个月的数据在sql server中不起作用