在对话框中,我有一个选项按钮。但我不希望它始终可见,只有当光标在对话框上,并有一个很好的淡入/退出。
我尝试了几种方法来使CButton对其透明,但并不成功。
例如,我尝试过SetLayeredWindowAttributes和UpdateLayeredWindow,但我无法让它们工作,可能是因为CButton是个孩子。
设置CButton透明度的任何技巧
发布于 2018-03-26 17:17:36
我试过SetLayeredWindowAttributes和UpdateLayeredWindow,但我无法让他们工作,可能是因为CButton还是个孩子。
支持分层子窗口,因为Windows 8:
为了使用分层子窗口,应用程序必须在清单中声明自己为windows 8。
为此,通过项目属性>报表工具>输入和输出>附加清单文件,向应用程序添加这样的清单部分:
<?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)级别:
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位:
pButton->ModifyStyleEx( WS_EX_LAYERED, 0 );如果您需要支持比Windows8更早的操作系统,您必须使用更多涉及到的技术来实现同样的效果。我只是想到了一些想法:
WM_PRINTCLIENT消息,创建按钮的快照,就像它在可见时的样子一样。用所需的透明度绘制快照以代替实际按钮。一旦达到255的alpha值,就显示该按钮。这与AnimateWindow()的工作方式类似。https://stackoverflow.com/questions/49493096
复制相似问题