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);
}