加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

.NET Windows窗体透明控件

发布时间:2020-12-13 20:19:05 所属栏目:Windows 来源:网络整理
导读:我想在 Windows Forms应用程序中模拟“Web 2.0”灯箱样式UI技术.也就是说,通过在窗口的客户区域中的所有其他内容进行“调光”来提请注意一些前台控制. 明显的解决方案是创建一个简单的部分透明矩形的控件,可以将其停靠在窗口的客户端区域,并将其带到Z-Order
我想在 Windows Forms应用程序中模拟“Web 2.0”灯箱样式UI技术.也就是说,通过在窗口的客户区域中的所有其他内容进行“调光”来提请注意一些前台控制.

明显的解决方案是创建一个简单的部分透明矩形的控件,可以将其停靠在窗口的客户端区域,并将其带到Z-Order的前面.它需要像玻璃的肮脏的疼痛,其他控制仍然可以看到(因此继续画自己).这可能吗?

我有一个很好的狩猎,并尝试了一些技巧我自己,但迄今为止没有成功.
如果不可能,还有另一种办法呢?

请参阅:http://www.useit.com/alertbox/application-design.html(在灯箱部分的屏幕截图中说明我的意思.)

你可以在.NET / C#中执行此操作吗?

是的,你当然可以,但需要一点点努力.我会推荐以下方法.创建没有边框或标题栏区域的顶级窗体,然后通过将TransparencyKey和BackColor设置为相同的值,确保它不绘制客户区域背景.所以你现在有一个没有任何东西的窗口

public class DarkenArea : Form
{
    public DarkenArea()
    {
        FormBorderStyle = FormBorderStyle.None;
        SizeGripStyle = SizeGripStyle.Hide;
        StartPosition = FormStartPosition.Manual;
        MaximizeBox = false;
        MinimizeBox = false;
        ShowInTaskbar = false;
        BackColor = Color.Magenta;
        TransparencyKey = Color.Magenta;
        Opacity = 0.5f;
    }
}

在您的窗体的客户区域创建并定位此DarkenArea窗口.然后,您需要能够显示窗口,而不需要重点,因此您将需要以下列方式调用平台来显示,而不会变为活动状态

public void ShowWithoutActivate()
{
    // Show the window without activating it (i.e. do not take focus)
    PlatformInvoke.ShowWindow(this.Handle,(short)SW_SHOWNOACTIVATE);
}

您需要使其实际上绘制一些东西,但不包括要保持突出显示的控件区域中的绘图.所以重写OnPaint处理程序并绘制黑色/蓝色或任何你想要的,但不包括你想要保持明亮的区域…

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    // Do your painting here be exclude the area you want to be brighter
}

最后你需要覆盖WndProc,以防止鼠标与窗口进行交互,如果用户尝试像点击黑色区域一样疯狂.这样的东西

protected override void WndProc(ref Message m)
{
    if (m.Msg == (int)WM_NCHITTEST)
        m.Result = (IntPtr)HTTRANSPARENT;
    else
        base.WndProc(ref m);
}

这应该足以获得预期的效果.当您准备好反转处理DarkenArea实例并继续执行的效果时.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读