有没有人知道如何在WinForms中分配窗口区域(SetWindowRgn
或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();
我猜这与this MSDN article有关:
只要窗口具有非NULL 区域应用于它(SetWindowRgn), UxTheme经理假设这一点 是一个专门的窗口和窗口 不会使用视觉风格。
...因此UxThemes认为它是一个专门的窗口。有没有办法告诉UxTheme经理明确主题窗口?
答案 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
);
然后你可以把你的“透明”区域变成柠檬绿:
然后在运行时将是透明的:
更新:当我使用分层窗口来获得完全透明的鼠标事件时,执行会渗透到底层。请注意“标志”图标突出显示: