Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 包含不透明文本和按钮的透明窗口_C++_Winapi_Mfc_Gdi+_Gdi - Fatal编程技术网

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

C++ 包含不透明文本和按钮的透明窗口,c++,winapi,mfc,gdi+,gdi,C++,Winapi,Mfc,Gdi+,Gdi,我正在创建一个非侵入式弹出窗口,在处理耗时的操作时通知用户。目前,我正在通过调用SetLayeredWindowAttributes设置其透明度,这给了我一个合理的结果: 但是我希望文本和关闭按钮在保持背景透明的同时显得不透明(白色文本看起来不太合适)-有什么方法可以做到这一点吗?我不能肯定,你需要尝试一下,但是因为所有东西都是一个窗口,您可以尝试设置按钮的分层属性,使其不透明 至于文本,您可以将其放在自己的框架中,设置背景和前景颜色,并修改其分层属性以使背景颜色透明 但是,由于这些是子窗口而

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


但是我希望文本和关闭按钮在保持背景透明的同时显得不透明(白色文本看起来不太合适)-有什么方法可以做到这一点吗?

我不能肯定,你需要尝试一下,但是因为所有东西都是一个窗口,您可以尝试设置按钮的分层属性,使其不透明

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


但是,由于这些是子窗口而不是顶级窗口,我真的不知道它是否能工作。

我怀疑您需要两个顶级窗口,而不是一个-一个是alpha混合窗口,另一个是第一个窗口上方显示的不透明文本和按钮,但背景透明。要在单个窗口中实现这一点,您需要使用API调用,但使用此调用将导致按钮在与(悬停高亮显示、焦点等)交互时不会重新绘制

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

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

据我所知,实现这一目标的最干净的方法是:

  • 使用像素格式创建GDI+
    位图
    对象
  • 创建一个
    Graphics
    对象,以便在此
    位图
    对象中绘制
  • 使用GDI+将所有图形绘制到此对象中
  • 销毁在步骤2中创建的
    图形
    对象
  • 调用
    Bitmap
    对象上的
    GetHBITMAP
    方法以获取Windows
    HBITMAP
  • 销毁
    位图
    对象
  • 使用
    CreateCompatibleDC
    创建内存DC,并从步骤5中选择
    HBITMAP
  • 使用内存DC作为源调用UpdateLayeredWindow
  • 选择上一个位图并删除内存DC
  • 销毁在步骤5中创建的
    HBITMAP
  • 此方法应允许您控制绘制的所有对象的alpha通道:背景透明,文本和按钮不透明


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

    很抱歉stackoverflow上没有PM功能-因此我必须在这里发表评论-您是否可以分享最终解决方案的代码-类似于Koro所指出的?谢谢