在对话框中,我有一个选项按钮。但是我不希望它一直可见,只有当光标在对话框上时才会显示,并且有一个很好的淡入/淡出。
我已经尝试了几项让CButton
透明的内容淡入/淡出,但没有成功。
例如,我尝试了SetLayeredWindowAttributes
和UpdateLayeredWindow
,但我无法让它们发挥作用,可能是因为CButton
还是孩子。
有关如何设置CButton
答案 0 :(得分:4)
自Windows 8以来支持我尝试过SetLayeredWindowAttributes和UpdateLayeredWindow但是我 不能让他们上班,可能是因为CButton还是个孩子。
为了使用分层子窗口,应用程序必须声明 它本身就是清单中的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下获得了以下结果:
请注意,按钮看起来像已禁用,但这只是巧合。
要使按钮再次完全不透明,请删除WS_EX_LAYERED
位:
pButton->ModifyStyleEx( WS_EX_LAYERED, 0 );
如果您需要支持比Windows 8更旧的操作系统,则必须使用更多相关技术来实现相同的效果。只是想到了一些想法:
WM_PRINTCLIENT
消息,可以看到按钮的快照。绘制快照以代替具有所需透明度的实际按钮。达到alpha值255
后显示按钮。这与AnimateWindow()
的工作方式类似。