设置一个窗口区域而不禁用主题

有没有人知道如何分配一个窗口区域(WinForms中的SetWindowRgnControl.Region )而不杀死在非客户区域的主题?

例如,运行以下命令会生成Windows 2000风格的非标题标题栏,边框等:

 var form = new Form { Width=500, Height=500, BackColor = Color.Azure }; form.Text = "But soft, what light through yonder window breaks?"; var region = new Region (new Rectangle (Point.Empty, form.Size)); region.Exclude (new Rectangle (100, 100, 300, 300)); form.Region = region; form.ShowDialog(); 

我猜这是与这个MSDN文章说:

只要一个窗口应用了一个非NULL区域(SetWindowRgn),UxTheme Manager假定这是一个专门的窗口,窗口将不会使用视觉样式。

因此,UxThemes认为这是一个专门的窗口。 有没有办法明确告诉UxTheme Manager来主题窗口?

Solutions Collecting From Web of "设置一个窗口区域而不禁用主题"

你的问题的答案是,你不能。

但是一个解决方法,在窗体中给你一个透明部分,就是将WS_EX_LAYERED扩展窗口样式添加到窗体中。 然后,您可以告诉窗口管理器您想要使用色度键来使表单的一部分透明:

 SetLayeredWindowAttributes( Form.Handle, // __in HWND hwnd, RGB(0, 255, 0), //green is the color key __in COLORREF crKey, 255, //window is opaque otherwise __in BYTE bAlpha, LWA_COLORKEY //use color-key (rather than per-pixel alpha) __in DWORD dwFlags ); 

然后你可以把你的“透明”区域变成柠檬绿:

在这里输入图像说明

然后在运行时将是透明的:

在这里输入图像说明


更新:当我使用分层窗口有完全透明鼠标事件时滴入到底下是什么。 注意“标志”图标突出显示:

在这里输入图像说明

也可以看看

  • 窗口概览 – >窗口功能 – >分层窗口
  • SetLayeredWindowAttributes函数
  • 扩展窗口样式
  • 分层的Windows