是否有人知道如何分配窗口区域(SetWindowRgn或WinForms中的Control.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文章有关,它说:
只要一个窗口有一个非空区域(SetWindowRgn),UxTheme管理器就会假设这是一个专门的窗口,并且该窗口不会使用视觉样式。
...hence UxThemes假设它是一个专门的窗口。有没有一种方法可以让UxTheme管理器显式地以窗口为主题?
发布于 2011-06-16 02:03:44
你的问题的答案是你不能。
但是,为了在表单中给出一个透明的部分,解决办法是将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
);然后,你可以把你的“透明”区域作为石灰绿色:

然后在运行时是透明的:

更新:当我使用分层窗口具有完全透明的鼠标事件时,会缓慢地传输到下面的内容。注意“旗帜”图标突出显示:

另请参阅
https://stackoverflow.com/questions/6313510
复制相似问题