2009-08-18 197 views
2

我正在创建一个非侵入式弹出窗口,以在处理耗时操作时通知用户。包含不透明文本和按钮的透明窗口

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

然而我想文字和关闭按钮出现不透明(它并不完全看:目前我通过调用SetLayeredWindowAttributes这给我一个合理的结果设定其透明度正确与白色文本),同时保持背景透明 - 有没有办法做到这一点?

+1

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

回答

10

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

实现这一目标,我知道的最彻底的方法是:

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

创建该方法应该可用于控制被吸入一切的alpha通道:透明的背景,不透明的文本和按钮。

而且,因为你将要输出的文本,我建议您致电SystemParametersInfo获得默认抗锯齿设置(SPI_GETFONTSMOOTHING),然后在图形SetTextRenderingHint对象设置抗锯齿类型是同一类型由用户配置,以获得更好的外观。

0

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

至于文字,你可以把在自己的框架与一组背景和前景颜色,并修改其属性分层,使背景色透明...

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

3

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

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