mfc设置按钮透明不生效
时间: 2023-08-16 20:05:07 浏览: 172
MFC单选按钮
4星 · 用户满意度95%
要设置 MFC 按钮的透明度,需要先将按钮的风格设置为 BS_OWNERDRAW。在对话框类的头文件中添加一个成员变量来存储按钮的透明度值,例如:
```
class CMyDialog : public CDialog
{
// ...
private:
int m_nButtonAlpha;
};
```
然后,在 OnInitDialog 函数中,将按钮的风格设置为 BS_OWNERDRAW,以便使其能够被自绘制。接着,使用 SetLayeredWindowAttributes 函数来设置按钮的透明度,如下所示:
```
BOOL CMyDialog::OnInitDialog()
{
CDialog::OnInitDialog();
// 将按钮的风格设置为 BS_OWNERDRAW
GetDlgItem(IDC_MY_BUTTON)->ModifyStyle(0, BS_OWNERDRAW);
// 设置按钮的透明度为 50%
m_nButtonAlpha = 128;
SetLayeredWindowAttributes(GetDlgItem(IDC_MY_BUTTON)->GetSafeHwnd(), 0, m_nButtonAlpha, LWA_ALPHA);
return TRUE;
}
```
最后,在按钮的 OnDrawItem 函数中,使用 CDC 类的 AlphaBlend 函数来绘制半透明的按钮,如下所示:
```
void CMyDialog::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if (nIDCtl == IDC_MY_BUTTON)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rect = lpDrawItemStruct->rcItem;
// 绘制半透明的矩形
BLENDFUNCTION blend = {0};
blend.BlendOp = AC_SRC_OVER;
blend.SourceConstantAlpha = m_nButtonAlpha;
blend.AlphaFormat = AC_SRC_ALPHA;
pDC->AlphaBlend(rect.left, rect.top, rect.Width(), rect.Height(), GetDC(), rect.left, rect.top, rect.Width(), rect.Height(), blend);
}
else
{
CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
}
```
请注意,AlphaBlend 函数需要使用与按钮相同的设备上下文句柄和矩形,以确保按钮被正确地绘制。如果你想要修改按钮的透明度,只需更新 m_nButtonAlpha 变量,并再次调用 SetLayeredWindowAttributes 函数即可。
阅读全文