日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【MFC系列-第32天】控件自绘技术

發布時間:2023/12/2 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【MFC系列-第32天】控件自绘技术 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

32.1 對話框背景設置

方法一

BOOL CClDlg::OnEraseBkgnd(CDC* pDC) {CRect rect;GetClientRect(rect);pDC->FillSolidRect(rect, RGB(200, 255, 255));return TRUE; }

方法二:WM_CTRLCOLOR消息

  • 按類型
  • 按句柄
  • 按控件ID
HBRUSH CMFCApplication1Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);TRACE("nID = %d\n",pWnd ->GetDlgCtrlID());if (this->GetSafeHwnd() == pWnd->GetSafeHwnd()){static CBrush br(RGB(200, 255, 255));return br;}if (pWnd->GetDlgCtrlID() == IDC_VSBAR){pDC->SetTextColor(RGB(255, 0, 0));pDC->SetBkMode(TRANSPARENT);return (HBRUSH)GetStockObject(HOLLOW_BRUSH);}//if (CTLCOLOR_DLG == nCtlColor)//{// static CBrush br(RGB(200, 255, 255));// return br;//}if (CTLCOLOR_STATIC == nCtlColor){pDC->SetTextColor(RGB(255, 0, 0));pDC->SetBkMode(TRANSPARENT);return (HBRUSH)GetStockObject(HOLLOW_BRUSH);}if (CTLCOLOR_EDIT == nCtlColor){pDC->SetTextColor(RGB(255, 255, 0));pDC->SetBkMode(TRANSPARENT);static CBrush br(RGB(0, 0, 0));return br;}if (CTLCOLOR_LISTBOX == nCtlColor){pDC->SetTextColor(RGB(0, 255, 0));pDC->SetBkMode(TRANSPARENT);static CBrush br(RGB(0, 0, 0));return br;}return hbr; } #define CTLCOLOR_MSGBOX 0 #define CTLCOLOR_EDIT 1 #define CTLCOLOR_LISTBOX 2 #define CTLCOLOR_BTN 3 #define CTLCOLOR_DLG 4 #define CTLCOLOR_SCROLLBAR 5 #define CTLCOLOR_STATIC 6 #define CTLCOLOR_MAX 7

32.2 按鈕自繪

①設置按鈕Owner draw屬性,從CButton類派生
②給按鈕關聯變量
③加載圖標
④重載虛函數

// Overridables (for owner draw only)virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);

支持自繪技術的控件類型包括:

ODT_BUTTON Owner-drawn button

ODT_COMBOBOX Owner-drawn combo box

ODT_LISTBOX Owner-drawn list box

ODT_MENU Owner-drawn menu

ODT_LISTVIEW List view control

ODT_STATIC Owner-drawn static control

ODT_TAB Tab control

// CDC * pDC = CDC::FromHandle(lpDIS->hDC);void CIconBtn::DrawItem(LPDRAWITEMSTRUCT lpDIS) {CDC dc;dc.Attach(lpDIS->hDC);CRect rect(lpDIS->rcItem);dc.SelectStockObject(WHITE_BRUSH);dc.Rectangle(&lpDIS->rcItem);if (lpDIS->itemState & ODS_SELECTED)rect.OffsetRect(1,1);int x = rect.left+(rect.Height() - 32) / 2,y=x;dc.DrawIcon(x, y, m_hIcon);CString szText;GetWindowText(szText);rect.left += 40 + x;dc.DrawText(szText, rect, DT_VCENTER | DT_SINGLELINE);//::DrawIconEx() //縮放圖標 // dc.SelectObject(pOldBrush);dc.Detach(); } CIconBtn m_ok; CIconBtn m_cancel; CIconBtn m_btn1;m_ok.SetIcon(theApp.LoadIcon(IDI_OK)); m_cancel.SetIcon(theApp.LoadIcon(IDI_CANCEL));void SetIcon(HICON hIcon) {m_hIcon = hIcon; }

32.2 按鈕自繪防閃爍

CMemoryDC類進行緩沖去閃爍

CMemoryDC m_dc;void CIconBtn::DrawItem(LPDRAWITEMSTRUCT lpDIS) {CDC dc;dc.Attach(lpDIS->hDC);CRect rect(lpDIS->rcItem);if(!m_dc.GetSafeHdc())m_dc.Create(rect.Width(), rect.Height(),&dc);m_dc.SelectObject(dc.GetCurrentFont());m_dc.SelectStockObject(WHITE_BRUSH);m_dc.Rectangle(&lpDIS->rcItem);if (lpDIS->itemState & ODS_SELECTED)rect.OffsetRect(1,1);int x = rect.left+(rect.Height() - 32) / 2,y=x;m_dc.DrawIcon(x, y, m_hIcon);CString szText;GetWindowText(szText);rect.left += 40 + x;m_dc.DrawText(szText, rect, DT_VCENTER | DT_SINGLELINE);dc.BitBlt(0, 0, lpDIS->rcItem.right, lpDIS->rcItem.bottom, &m_dc, 0, 0, SRCCOPY);//::DrawIconEx() // dc.SelectObject(pOldBrush);dc.Detach(); }

32.3 三態按鈕

m_ok.SetIcon(theApp.LoadIcon(IDI_OK)); m_cancel.SetIcon(theApp.LoadIcon(IDI_CANCEL)); m_close.SetBitmaps(IDB_CLOSE1, IDB_CLOSE3, IDB_CLOSE2);CMemoryDC m_dcNormal; CMemoryDC m_dcSelect; CMemoryDC m_dcTrack; BOOL m_bTrack; void CBitmapBtn::DrawItem(LPDRAWITEMSTRUCT lpDIS) {CDC* pDC = CDC::FromHandle(lpDIS->hDC);CRect rect(lpDIS ->rcItem);if (rect.Width() != m_dcNormal.GetWidth()|| rect.Height() != m_dcNormal.GetHeight()){SetWindowPos(NULL, 0, 0, m_dcNormal.GetWidth(), m_dcNormal.GetHeight(), SWP_NOMOVE | SWP_NOZORDER);GetClientRect(rect);}if (lpDIS->itemState & ODS_SELECTED)pDC->BitBlt(0, 0, m_dcSelect.GetWidth(), m_dcSelect.GetHeight(), &m_dcSelect, 0, 0, SRCCOPY);else{if (m_dcTrack&& m_bTrack)pDC->BitBlt(0, 0, m_dcTrack.GetWidth(), m_dcTrack.GetHeight(), &m_dcTrack, 0, 0, SRCCOPY);elsepDC->BitBlt(0, 0, m_dcNormal.GetWidth(), m_dcNormal.GetHeight(), &m_dcNormal, 0, 0, SRCCOPY);} }void CBitmapBtn::SetBitmaps(UINT nNormal, UINT nSelect, UINT nTrack) {ASSERT(m_dcNormal.LoadBitmap(nNormal));BITMAP bm;m_dcSelect.LoadBitmap(nSelect);if (-1 == nTrack)return;m_dcTrack.LoadBitmap(nTrack); }void CBitmapBtn::OnMouseMove(UINT nFlags, CPoint point) {CRect rect;GetClientRect(rect);BOOL bTrack = FALSE;if (rect.PtInRect(point)){bTrack = TRUE;if (GetCapture() != this)this->SetCapture();}elseReleaseCapture();if (bTrack != m_bTrack){m_bTrack = bTrack;if(m_bTrack)TRACE("Enter\n");elseTRACE("Leave\n");Invalidate(FALSE);}CButton::OnMouseMove(nFlags, point); }

總結

以上是生活随笔為你收集整理的【MFC系列-第32天】控件自绘技术的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。