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

时间:2009-08-18 15:54:50

标签: c++ winapi mfc gdi+ gdi

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

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

然而我希望文字和关闭按钮显示为不透明(使用白色文字看起来不太正确),同时保持背景透明 - 有没有办法做到这一点?< / p>

3 个答案:

答案 0 :(得分:10)

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

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

  1. 使用Bitmap像素格式创建GDI + PixelFormat32bppPARGB对象。
  2. 创建一个Graphics对象以在此Bitmap对象中绘制。
  3. 使用GDI +将所有绘图完成此对象。
  4. 销毁在步骤2中创建的Graphics对象。
  5. 调用GetHBITMAP对象上的Bitmap方法获取Windows HBITMAP
  6. 销毁Bitmap对象。
  7. 使用CreateCompatibleDC创建内存DC,然后从第5步中选择HBITMAP
  8. 使用内存DC作为源来调用UpdateLayeredWindow。
  9. 选择上一个位图并删除内存DC。
  10. 销毁在步骤5中创建的HBITMAP
  11. 此方法应该允许您控制绘制的所有内容的Alpha通道:对背景透明,对文本和按钮不透明。

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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

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

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