【问题标题】:Setting a windows region without disabling theming在不禁用主题的情况下设置 Windows 区域
【发布时间】:2011-09-12 21:35:09
【问题描述】:

有谁知道如何分配一个窗口区域(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();

我猜这与this MSDN article 说:

只要一个窗口有一个非NULL 应用到它的区域(SetWindowRgn), UxTheme 管理器假定这 是一个专门的窗口和窗口 不会使用视觉样式。

...因此 UxThemes 假定它是一个专门的窗口。有没有办法明确告诉 UxTheme 管理器为窗口设置主题?

【问题讨论】:

  • 这只是一个随机的想法,我对表单应用程序很生疏 - 但是如果你将一个容器放在停靠在所有 4 个侧面的表单中,然后将所有其他控件放在其中,那么设置容器区域而不是表单区域,让表单父区域不受影响?
  • @Greebo:这将导致表单通过“孔”而不是其他窗口显示。
  • 啊——我确实说过我生锈了;)

标签: windows winforms winapi


【解决方案1】:

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

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

然后你可以把你的“透明”区域设置为石灰绿色:

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


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

另见

【讨论】:

  • +1 - 这就是我目前正在做的事情 :) 问题是鼠标事件不会通过,除非你应用 WS_EX_TRANSPARENT 并且影响整个窗口
  • P.S.鼠标事件不会通过的事实似乎是 Windows 7 / Vista 错误:social.msdn.microsoft.com/Forums/en/winforms/thread/…
  • 是的:我使用的是 Win7 64 位。如果透明度键设置为黑色,则鼠标事件会溢出,但不会出现任何其他颜色!不过,相同的代码在 WinXP 虚拟机上也能完美运行。
  • @Joe Albahari:看到上面的截图了吗?我使用绿色作为我的透明度键;它工作正常。
  • 同意,但我不能使用这种技术,除非它适用于所有机器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 2018-05-18
  • 2019-02-23
相关资源
最近更新 更多