您的位置:首页 > 其它

MFC对话框static、radio和checkbox背景透明

2013-04-11 15:49 267 查看
一般是这么做

1.对话框添加两个消息处理。

afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);


2.这样来写具体实现

View Code

HBRUSH CConfigDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

switch (pWnd->GetDlgCtrlID())
{
case IDC_RADIO_R1:
pDC->SetBkMode(TRANSPARENT);//背景透明
//pDC->SetTextColor(RGB(255,0,0)); //字体颜色
return   HBRUSH(GetStockObject(NULL_BRUSH));
case IDC_RADIO_R2:
pDC->SetBkMode(TRANSPARENT);
return   HBRUSH(GetStockObject(NULL_BRUSH));
case IDC_RADIO_R3:
pDC->SetBkMode(TRANSPARENT);
return   (HBRUSH)GetStockObject(NULL_BRUSH);
case IDC_CHECK_OPEN:
pDC->SetBkMode(TRANSPARENT);
return   (HBRUSH)GetStockObject(NULL_BRUSH);
default:
pDC->SetBkMode(TRANSPARENT);
return   (HBRUSH)GetStockObject(NULL_BRUSH);
}

//     if (( nCtlColor == IDC_RADIO_R1 )||( nCtlColor == IDC_RADIO_R2 )||( nCtlColor == IDC_RADIO_R3 )||( nCtlColor == IDC_CHECK_OPEN ))
//这种写法不行
//调试的时候可以看出来 nCtlColor 不会等于 IDC_RADIO_R1 IDC_RADIO_R2以及IDC_RADIO_R3等
//     {
//         pDC->SetBkMode(TRANSPARENT);
//         pDC->SetTextColor(RGB(255,255,0));
//         //return (HBRUSH)::GetStockObject( NULL_BRUSH);
//         return (HBRUSH)::GetStockObject(HOLLOW_BRUSH);
//     }
return hbr;
}


我这里有3个radio ---> IDC_RADIO_R1,IDC_RADIO_R2,IDC_RADIO_R3和一个checkbox ---> IDC_CHECK_OPEN

一般情况下,这几种控件就是透明的。

但是在windows xp使用xp风格主题下,checkbox会变成黑色背景。如果NULL_BRUSH换成GRAY_BRUSH,checkbox会变成灰色背景。

所以这里可以定义一个和背景色相同的画刷,来替换NULL_BRUSH。

或者将checkbox的chaption设为空,后面放一个static文本框来写checkbox的chaption。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: