【问题标题】:Common Controls on a Transparent Window?透明窗口上的常用控件?
【发布时间】:2019-10-21 11:40:52
【问题描述】:

虽然这个问题有很多变体,但对于想要在使用 Win32 的透明窗口上使用内置通用控件的简单案例似乎没有具体答案。我不希望控件是透明的,我只希望它周围的边框是透明的。我不敢相信 MS 在添加时没有更新 .dll 来处理透明度,但我猜他们忘记了?有没有具体的方法有效。一个按钮可以通过 WS_EX_TRANSPARENT 接近,但在大多数情况下它工作的地方很不稳定,但有时会出现部分边框。编辑控件,根据何时获得焦点进行更改。

所以问题很简单:

有没有办法在透明窗口上制作通用控件,使其周围没有白色边框?

如果没有,是否有一个很好的替代库可以通过所有者绘制来完成?

如果有,有哪些,方法是什么?

仅仅因为控件周围的区域而重新发明轮子似乎很愚蠢。

TIA!!

【问题讨论】:

  • 基本上控件不是为此而设计的,边框设计为与背景融为一体,并且您会看到透明背景。
  • 你好,user3161924 你能提供一个关于这个问题的例子,比如代码和截图。
  • 你的windows是什么版本的?
  • Vista 或更高版本只需要支持。例如,考虑为 DeskBand 添加到 MS Win7 SDK 示例。
  • @user3161924 嗨,我想说 WS_EX_TRANSPARENT 不会使窗口透明。它告诉 Windows,如果一个 Windows 在另一个 Window 之下,它不需要绘制它的背景,因为它被覆盖了。半透明窗口可以通过分层窗口和设置不透明度来完成。正如我在答案中指出的那样

标签: winapi transparency common-controls


【解决方案1】:

如果我没记错的话,你可以采取以下步骤来达到这个效果。

1.使用PixelFormat32bppPARGB像素格式创建GDI+位图对象。

2.创建一个Graphics 对象以在此Bitmap 对象中进行绘制。

3. 使用GDI+ 将所有绘图都放入此对象。

4.销毁步骤2中创建的Graphics对象。

5.调用Bitmap对象上的GetHBITMAP方法获取WindowsHBITMAP

6.销毁Bitmap对象。

7.使用CreateCompatibleDC创建内存DC,并从步骤5中选择HBITMAP

8.使用内存 DC 作为源调用UpdateLayeredWindow

9.选择上一个位图并删除内存DC。

10.销毁第5步创建的HBITMAP

此方法应该允许您控制所有绘制的 Alpha 通道:背景透明,按钮不透明。

类似的讨论:Transparent window containing opaque text and buttons

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-21
    • 2013-02-21
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    相关资源
    最近更新 更多