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

时间:2018-03-26 13:49:04

标签: winapi mfc

在对话框中,我有一个选项按钮。但是我不希望它一直可见,只有当光标在对话框上时才会显示,并且有一个很好的淡入/淡出。

我已经尝试了几项让CButton透明的内容淡入/淡出,但没有成功。

例如,我尝试了SetLayeredWindowAttributesUpdateLayeredWindow,但我无法让它们发挥作用,可能是因为CButton还是孩子。

有关如何设置CButton

的透明度的任何提示

1 个答案:

答案 0 :(得分:4)

  

我尝试过SetLayeredWindowAttributes和UpdateLayeredWindow但是我   不能让他们上班,可能是因为CButton还是个孩子。

自Windows 8以来支持

Layered child windows

  

为了使用分层子窗口,应用程序必须声明   它本身就是清单中的Windows 8感知。

为此,请通过项目属性>向您的应用程序添加这样的清单部分。 Manifest工具>输入和输出>其他清单文件:

<?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>

您可能也想宣布对other Windows versions的支持。

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

if( CWnd* pButton = GetDlgItem( IDC_OPTIONS ) )
{
    pButton->ModifyStyleEx( 0, WS_EX_LAYERED );
    pButton->SetLayeredWindowAttributes( 0, 96, LWA_ALPHA );
}

在我覆盖的CDialog::OnInitDialog()中添加此代码,我在Win 10下获得了以下结果:

Layered Child Window

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

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

pButton->ModifyStyleEx( WS_EX_LAYERED, 0 );

如果您需要支持比Windows 8更旧的操作系统,则必须使用更多相关技术来实现相同的效果。只是想到了一些想法:

  • 创建一个自绘的或自定义绘制的按钮,可以完全控制按钮的外观,并可以伪造透明度。
  • 创建一个最初隐藏的按钮。通过向其发送WM_PRINTCLIENT消息,可以看到按钮的快照。绘制快照以代替具有所需透明度的实际按钮。达到alpha值255后显示按钮。这与AnimateWindow()的工作方式类似。