设置Windows区域而不禁用主题

时间:2011-06-11 01:29:57

标签: windows winforms winapi

有没有人知道如何在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();

我猜这与this MSDN article有关:

  

只要窗口具有非NULL   区域应用于它(SetWindowRgn),   UxTheme经理假设这一点   是一个专门的窗口和窗口   不会使用视觉风格。

...因此UxThemes认为它是一个专门的窗口。有没有办法告诉UxTheme经理明确主题窗口?

1 个答案:

答案 0 :(得分:4)

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

但是,为了在表单中为您提供透明的部分,一种解决方法是将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
);

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

enter image description here

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

enter image description here


更新:当我使用分层窗口来获得完全透明的鼠标事件时,执行会渗透到底层。请注意“标志”图标突出显示:

enter image description here

另见