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

一般是这么做

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

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

2.这样来写具体实现

View Code
 1 BOOL CConfigDlg::OnEraseBkgnd(CDC* pDC)
 2 {
 3     CRect rt;
 4     GetClientRect( &rt);
 5     HDC hdc = pDC->GetSafeHdc();
 6     HDC hMemdc = CreateCompatibleDC( hdc);
 7     HBITMAP hMembmp = CreateCompatibleBitmap( hdc, rt.Width(), rt.Height());
 8     HBITMAP hOldbmp = (HBITMAP)SelectObject( hMemdc, hMembmp);
 9     Graphics graphics(hMemdc);
10     graphics.Clear( Color(254,190,216,233));
11     BitBlt( hdc, 0,0,rt.Width(), rt.Height(), hMemdc, 0,0,SRCCOPY);
12     graphics.ReleaseHDC( hMemdc);
13     SelectObject( hMemdc, hOldbmp);
14     DeleteDC( hMemdc);
15     DeleteObject( hMembmp);
16      return TRUE;
17 }
View Code
 1 HBRUSH CConfigDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
 2 {
 3     HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
 4 
 5     switch (pWnd->GetDlgCtrlID())
 6     {
 7     case IDC_RADIO_R1:
 8         pDC->SetBkMode(TRANSPARENT);//背景透明
 9         //pDC->SetTextColor(RGB(255,0,0)); //字体颜色
10         return   HBRUSH(GetStockObject(NULL_BRUSH));
11     case IDC_RADIO_R2:
12         pDC->SetBkMode(TRANSPARENT);
13         return   HBRUSH(GetStockObject(NULL_BRUSH));
14     case IDC_RADIO_R3:
15         pDC->SetBkMode(TRANSPARENT);
16         return   (HBRUSH)GetStockObject(NULL_BRUSH);
17     case IDC_CHECK_OPEN:
18         pDC->SetBkMode(TRANSPARENT);
19         return   (HBRUSH)GetStockObject(NULL_BRUSH);
20     default:
21         pDC->SetBkMode(TRANSPARENT);
22         return   (HBRUSH)GetStockObject(NULL_BRUSH);
23     }
24 
25 //     if (( nCtlColor == IDC_RADIO_R1 )||( nCtlColor == IDC_RADIO_R2 )||( nCtlColor == IDC_RADIO_R3 )||( nCtlColor == IDC_CHECK_OPEN )) 
26 //这种写法不行
27 //调试的时候可以看出来 nCtlColor 不会等于 IDC_RADIO_R1 IDC_RADIO_R2以及IDC_RADIO_R3等
28 //     {
29 //         pDC->SetBkMode(TRANSPARENT);
30 //         pDC->SetTextColor(RGB(255,255,0));
31 //         //return (HBRUSH)::GetStockObject( NULL_BRUSH);
32 //         return (HBRUSH)::GetStockObject(HOLLOW_BRUSH);
33 //     }
34     return hbr;
35 }

我这里有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。

原文地址:https://www.cnblogs.com/zzugyl/p/3014630.html