代码之家  ›  专栏  ›  技术社区  ›  Alan

包含不透明文本和按钮的透明窗口

  •  2
  • Alan  · 技术社区  · 15 年前

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

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

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

    3 回复  |  直到 15 年前
        1
  •  10
  •   Koro    15 年前

    要在分层窗口中执行“正确”alpha,需要通过调用为窗口管理器提供一个pargb位图。 UpdateLayeredWindow .

    我所知道的最干净的方法是:

    1. 创建一个GDI+ Bitmap 对象与 PixelFormat32bppPARGB 像素格式。
    2. 创建一个 Graphics 要在此绘制的对象 位图 对象。
    3. 使用gdi+将所有图形绘制到此对象中。
    4. 销毁 绘图 在步骤2中创建的对象。
    5. 打电话给 GetHBITMAP 方法在 位图 对象以获取窗口 HBITMAP .
    6. 销毁 位图 对象。
    7. 使用创建内存DC CreateCompatibleDC 并选择 位图 从第5步开始。
    8. 使用内存DC作为源调用UpdateLayeredWindow。
    9. 选择上一个位图并删除内存dc。
    10. 销毁 位图 在步骤5中创建。

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

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

        2
  •  3
  •   Stephen Nutt    15 年前

    我怀疑你需要两个顶层的窗口而不是一个-一个是阿尔法混合的窗口,另一个是显示在第一个窗口上面的不透明文本和按钮,但是背景是透明的。要使用单个窗口完成此操作,需要使用 UpdateLayeredWindow API调用,但使用它将导致按钮在与交互时无法重新绘制(悬停突出显示、焦点等)。

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

        3
  •  0
  •   Jonathan    15 年前

    我不能肯定地说,您需要尝试它,但由于所有东西都是一个窗口,您可以尝试为按钮设置分层属性,使其不透明。

    对于文本,您可以将其放置在自己的框架中,设置背景和前景颜色,并修改其分层属性,使背景颜色透明…

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