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

Ala*_*lan 2 c++ winapi mfc gdi+ gdi

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

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

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

小智 10

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

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

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

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

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