Static、Edit、Check Box、Radio等常用控件透明的方法

来源:互联网 发布:红警2 for mac 10.12 编辑:程序博客网 时间:2024/05/23 01:17

原理:在对话框的OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)函数里将父窗口的背景绘制到控件上。
网上流传的代码,对于Check Box\Raido的文字部分会有重影。
而我经过调试,将双缓冲绘图机制用到这里,完美解决了Check Box\Raido的文字部分会有重影的问题,且支持大多数的常用控件。
废话少说,直接上主要代码。

HBRUSH CMFCTransparentCtrlsDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){ HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); // TODO:  在此更改 DC 的任何特性 UINT id = pWnd->GetDlgCtrlID(); CString strDebug; strDebug.Format(_T("CMFCTransparentCtrlsDlg::OnCtlColor ctrl id = %d\n"), id); OutputDebugString(strDebug); switch (id) {  case IDC_STATIC1:  //case IDC_STATIC2:  case IDC_EDIT1:  //case IDC_EDIT2:  case IDC_COMBO1:   // Combo Box 会显示不正常  //case IDC_COMBO2:   // 调试时发现默认就有了透明的效果,且选择item时不正常         // 研究发现,鼠标移到Combo Box时, 会有多个id触发,默认的有1000,1001         // 当有设置透明的id等于1000,1001,将导致Combo Box显示不正常         // 而之前IDC_STATIC1=1000,IDC_BUTTON1=1001  case IDC_STATIC_GROUP1:  //case IDC_STATIC_GROUP2:  case IDC_RADIO1:   //case IDC_RADIO2:  case IDC_CHECK1:  //case IDC_CHECK2:  case IDC_SLIDER1:  //case IDC_SLIDER2:  case IDC_LIST1:    // List 会显示不正常  //case IDC_LIST2:  case IDC_BUTTON1:  //case IDC_BUTTON2:  case IDC_SPIN1:  //case IDC_SPIN2:   // 没什么变化  case IDC_DATETIMEPICKER1: // 没什么变化  case IDC_PROGRESS1:   // 没什么变化   {    OutputDebugString(_T("******CMFCTransparentCtrlsDlg::OnCtlColor in switch******\n"));    pDC->SetBkMode(TRANSPARENT);    CRect rc;    pWnd->GetWindowRect(&rc);    ScreenToClient(&rc);    CDC* dc = GetDC();    //双缓冲机制    if (m_bIsFirstRun)    {     CRect rcParent;     GetClientRect(&rcParent);     CDC *pParentDC = GetDC();     CBitmap mBitmap;     mBitmap.CreateCompatibleBitmap(pDC, rcParent.Width(),rcParent.Height());     m_parentMemDC.CreateCompatibleDC(pDC);     CBitmap *pOldBitmap = m_parentMemDC.SelectObject(&mBitmap);     m_parentMemDC.BitBlt(0,0,rcParent.Width(),rcParent.Height(),pParentDC,0,0,SRCCOPY);     ReleaseDC(pParentDC);     mBitmap.DeleteObject();     m_bIsFirstRun = FALSE;    }    pDC->BitBlt(0,0,rc.Width(),rc.Height(),&m_parentMemDC,rc.left,rc.top,SRCCOPY);    //双缓冲机制    //通用方法会导致重影问题    //pDC->BitBlt(0,0,rc.Width(),rc.Height(),dc,rc.left,rc.top,SRCCOPY); //把父窗口背景图片先画到按钮上    ReleaseDC(dc);    hbr = (HBRUSH) ::GetStockObject(NULL_BRUSH);   }   break;  default:   break; }  // TODO:  如果默认的不是所需画笔,则返回另一个画笔 return hbr;}


源码下载地址:http://download.csdn.net/detail/lwweisen/6225045

转载请注明出处:http://blog.csdn.net/lwweisen/article/details/11253715

 

原创粉丝点击