gpt4 book ai didi

c# - 如何在包含一些用户控件的面板上绘制一个半透明的矩形?

转载 作者:太空宇宙 更新时间:2023-11-03 13:02:04 24 4
gpt4 key购买 nike

我想在包含一些用户控件的面板上绘制一个半透明的矩形。

我的主要目标是创建类似于 Windows 文件资源管理器所做的选择矩形。

并尝试使用 Control.Paint 事件,但矩形显示在用户控件的下方。我希望该半透明矩形显示在面板中所有控件的顶部

这是我尝试过的:

    class test
{
public FlowLayoutPanel flp;
public test()
{
flp = new FlowLayoutPanel();
flp.Controls.Add(c);//Here c is User Control
flp.Paint += (s, pe) =>
{
Rectangle f = new Rectangle();
f.Size = new Size(100, 100);

Brush b = new System.Drawing.SolidBrush(Color.FromArgb(25, Color.Red));
pe.Graphics.FillRectangle(b, f);
b.Dispose();
};
}
}

这里 Rectangle 在用户控件下是可见的。

最佳答案

这里是一个使用 2nd Form 叠加选区的例子。

enter image description here

我正在使用 TabPage tabPage5 作为我的容器,您应该能够适应任何其他控件甚至整个表单..

我使用两个类级变量并在开始的某个地方准备覆盖表单..:

Form overlay = new Form();
Point m_Down = Point.Empty;

void prepareOverlay()
{
overlay.BackColor = Color.Fuchsia; // your selection color
overlay.Opacity = 0.2f; // tranparency
overlay.MinimizeBox = false; // prepare..
overlay.MaximizeBox = false;
overlay.Text = "";
overlay.ShowIcon = false;
overlay.ControlBox = false;
overlay.FormBorderStyle = FormBorderStyle.None;
overlay.Size = Size.Empty;
overlay.TopMost = true;
}

用户将拖过的父容器需要这些事件:

private void tabPage5_MouseDown(object sender, MouseEventArgs e)
{
m_Down = e.Location;
overlay.Size = Size.Empty;
overlay.Show();
}

private void tabPage5_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
overlay.Location = tabPage5.PointToScreen(m_Down);
overlay.Size = new Size(e.X - m_Down.X, e.Y - m_Down.Y);
}
}

private void tabPage5_MouseUp(object sender, MouseEventArgs e)
{
// do your stuff and then hide overlay..
overlay.Hide();
}

我只针对用户从左上角拖动到右下角的标准情况编写了代码。

对于其他情况,您需要使用 Math.Abs​​Math.Min 进行一些处理,以绝对值计算 Size并使用 Location..

的坐标最小值

要收集所有覆盖的控件,您必须使用 selectionRect = tabPage5.RectangleToClient (overlay.Bounds);overlay.Bounds 恢复为客户端坐标控制选择可以使用像这样的方法:

List<Control> controlSelection = new List<Control>();

List<Control> getControls(Control container, Rectangle rect)
{
controlSelection = new List<Control>();
foreach (Control ctl in container.Controls)
if (rect.Contains(ctl.Bounds))
{
controlSelection.Add(ctl);
foreach (Control ct in ctl.Controls) controlSelection.Add(ct); ;
}
return controlSelection;
}

调用它使用:

Rectangle grabRect = tabPage5.RectangleToClient (overlay.Bounds);
controlSelection = getControls(tabPage5, grabRect);
Console.WriteLine(controlSelection.Count + " Controls grabbed.");

对于多层嵌套,您将需要一个递归函数!对于这种情况,最好将 selectionRectangle 保留为屏幕坐标,并将测试控件的绑定(bind)也转换为屏幕。

当然,由您决定选择是否必须刚好t (Rectangle.IntersectsWith()) 或覆盖 目标完全;我对后者进行了编码 (Rectangle.Contains())。

关于c# - 如何在包含一些用户控件的面板上绘制一个半透明的矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32022010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com