zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    第九章 ZYNQ-MIZ701 片上ADC的使用
    第八章 ZYNQ-MIZ701 软硬调试高级技巧
    第七章 ZYNQ-MIZ701 GPIO使用之EMIO
    第六章 ZYNQ-MIZ701 GPIO使用之MIO
    第十章 MIZ702 ZYNQ制作UBOOT固化程序
    bzoj1070 [SCOI2007]修车
    bzoj1449 [JSOI2009]球队收益
    bzoj2007 [Noi2010]海拔
    bzoj1001 [BeiJing2006]狼抓兔子
    网络流的一类经典问题--二元费用问题
  • 原文地址:https://www.cnblogs.com/zzugyl/p/3014630.html
Copyright © 2011-2022 走看看