【MFC系列-第32天】控件自绘技术
生活随笔
收集整理的這篇文章主要介紹了
【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
32.2 按鈕自繪
①設置按鈕Owner draw屬性,從CButton類派生
②給按鈕關聯變量
③加載圖標
④重載虛函數
支持自繪技術的控件類型包括:
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天】控件自绘技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tpad平板电脑多少钱(apad平板电脑
- 下一篇: MFC多线程处理界面假死之红外图像数据获