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

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

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

最佳答案

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

我知道的最简单的方法如下:

  • 使用Bitmap像素格式创建一个GDI + PixelFormat32bppPARGB对象。
  • 创建一个Graphics对象以绘制此Bitmap对象。
  • 使用GDI +将所有图形绘制到该对象中。
  • 销毁在步骤2中创建的Graphics对象。
  • GetHBITMAP对象上调用Bitmap方法以获取Windows HBITMAP
  • 销毁Bitmap对象。
  • 使用CreateCompatibleDC创建一个内存DC,然后从第5步中选择HBITMAP
  • 使用内存DC作为源调用UpdateLayeredWindow。
  • 选择先前的位图并删除内存DC。
  • 销毁在步骤5中创建的HBITMAP

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

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

    07-24 09:37
    查看更多