【问题标题】:Transparent window containing opaque text and buttons包含不透明文本和按钮的透明窗口
【发布时间】:2010-11-20 15:45:13
【问题描述】:

我正在创建一个非侵入式弹出窗口,以便在处理耗时的操作时通知用户。目前我正在通过调用SetLayeredWindowAttributes 来设置它的透明度,这给了我一个合理的结果:

alt text http://img6.imageshack.us/img6/3144/transparentn.jpg

但是我希望文本和关闭按钮显示为不透明(白色文本看起来不太正确),同时保持背景透明 - 有没有办法做到这一点?

【问题讨论】:

  • 抱歉,stackoverflow 上没有 PM 功能 - 因此我必须在这里发表评论 - 你会分享最终解决方案的代码 - 类似于 Koro 指出的吗?谢谢

标签: c++ winapi mfc gdi+ gdi


【解决方案1】:

我不能肯定,您需要尝试一下,但由于一切都是一个窗口,您可以尝试为您的按钮设置分层属性以使其不透明。

至于文字,你可以把它放在自己的框架中,设置背景和前景色,并修改它的分层属性,使背景颜色透明...

但是由于这些是子窗口而不是顶级窗口,我真的不知道它会起作用。

【讨论】:

    【解决方案2】:

    我怀疑您需要两个顶级窗口,而不是一个 - 一个具有 alpha 混合,第二个显示在第一个上方,带有不透明的文本和按钮,但具有透明背景。要使用单个窗口完成此操作,您需要使用 UpdateLayeredWindow API 调用,但使用它会导致您的按钮在与之交互时不会重绘(悬停高亮、焦点等)

    如果此应用程序仅适用于 Vista,则可能有一个新的 API 调用可供您使用,但我不相信它在 XP 或更早版本中可用。

    【讨论】:

      【解决方案3】:

      为了在分层窗口中执行“正确”的 alpha,您需要通过调用 UpdateLayeredWindow 为窗口管理器提供 PARGB 位图。

      据我所知,实现这一目标的最简洁方法如下:

      1. 使用PixelFormat32bppPARGB 像素格式创建一个 GDI+ Bitmap 对象。
      2. 创建一个Graphics 对象以在此Bitmap 对象中进行绘制。
      3. 使用 GDI+ 在此对象中进行所有绘图。
      4. 销毁在步骤 2 中创建的 Graphics 对象。
      5. Bitmap 对象上调用GetHBITMAP 方法以获取Windows HBITMAP
      6. 销毁Bitmap 对象。
      7. 使用CreateCompatibleDC 创建一个内存DC,并从第5 步中选择HBITMAP
      8. 使用内存 DC 作为源调用 UpdateLayeredWindow。
      9. 选择上一个位图并删除内存 DC。
      10. 销毁在第 5 步中创建的HBITMAP

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

      另外,由于您要输出文本,我建议您调用 SystemParametersInfo 来获取默认的抗锯齿设置 (SPI_GETFONTSMOOTHING),然后在 Graphics 对象上调用 SetTextRenderingHint 将抗锯齿类型设置为与用户配置的相同类型,以获得更好的外观。

      【讨论】:

        猜你喜欢
        • 2013-02-21
        • 2014-01-05
        • 2014-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-24
        • 1970-01-01
        相关资源
        最近更新 更多