首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >淡入/淡出CButton (设置透明度)

淡入/淡出CButton (设置透明度)
EN

Stack Overflow用户
提问于 2018-03-26 13:49:03
回答 1查看 375关注 0票数 1

在对话框中,我有一个选项按钮。但我不希望它始终可见,只有当光标在对话框上,并有一个很好的淡入/退出。

我尝试了几种方法来使CButton对其透明,但并不成功。

例如,我尝试过SetLayeredWindowAttributesUpdateLayeredWindow,但我无法让它们工作,可能是因为CButton是个孩子。

设置CButton透明度的任何技巧

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-26 17:17:36

我试过SetLayeredWindowAttributes和UpdateLayeredWindow,但我无法让他们工作,可能是因为CButton还是个孩子。

支持分层子窗口,因为Windows 8:

为了使用分层子窗口,应用程序必须在清单中声明自己为windows 8。

为此,通过项目属性>报表工具>输入和输出>附加清单文件,向应用程序添加这样的清单部分:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!-- Windows 8 -->
      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
    </application>
  </compatibility>
</assembly>

您可能也希望声明对其他Windows版本的支持。

有了清单之后,我们现在可以将一个按钮转换为一个分层窗口,并设置所需的透明度(alpha)级别:

代码语言:javascript
复制
if( CWnd* pButton = GetDlgItem( IDC_OPTIONS ) )
{
    pButton->ModifyStyleEx( 0, WS_EX_LAYERED );
    pButton->SetLayeredWindowAttributes( 0, 96, LWA_ALPHA );
}

将此代码添加到重写的CDialog::OnInitDialog()中,在Win 10下得到以下结果:

请注意,该按钮看起来像禁用,但这只是巧合。

要使按钮再次完全不透明,请删除WS_EX_LAYERED位:

代码语言:javascript
复制
pButton->ModifyStyleEx( WS_EX_LAYERED, 0 );

如果您需要支持比Windows8更早的操作系统,您必须使用更多涉及到的技术来实现同样的效果。我只是想到了一些想法:

  • 创建一个所有者绘制或自定义绘制按钮,以完全控制按钮的外观,具有伪造透明度的能力。
  • 创建一个初始隐藏按钮。通过向按钮发送WM_PRINTCLIENT消息,创建按钮的快照,就像它在可见时的样子一样。用所需的透明度绘制快照以代替实际按钮。一旦达到255的alpha值,就显示该按钮。这与AnimateWindow()的工作方式类似。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49493096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档