.NET Windows窗体透明控件

我想在 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实例并继续执行的效果时.

相关文章

(1)when you ping a computer from itsafe,the ping command should return the local IP address. (...
1、点击win菜单,点击设置图标 2、选择系统选项 3、选择应用与程序选项 4、拉到最下方,选择程序与功能...
目前一直直接往Windows 2008 R2 Server中复制文件(暂时还没有搭建ftp服务),突然不能复制了,于是百度...
windows下使用vscode配合xebug调试php脚本 要下载有php_xebug.dll扩展的版本,最新版可能没有这个扩展,p...
在控制面板的程序与功能里启用和关闭windows功能打开,适用于linux的windows子系统
效果演示 推荐一个非常牛的文档网站生成器:docsify 我通过这个工具,成功将码云上的个人学习笔记发布到...