ボタンのオーナー描画(VC++) ボタンのオーナー描画のメモです。簡単な描画で、キャプション、フォント、色、絵、状態を描画します。 1.リソースエディターで、ダイアログにボタンを貼り付け、プロパティの「オーナー描画」を有効します。 2.CButtonクラスからCOwnerDrawButtonクラスを派生します。 3.ClassWizardで、ボタンにCOwnerDrawButtonクラスの型で变量を宣言します。 4.void COwnerDrawButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) をオーバーライド、実装します。 void COwnerDrawButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); //描画范围の取得 CRect rct = lpDrawItemStruct->rcItem; CRect rctFocus = rct; CRect rctSft = rct; if(lpDrawItemStruct->itemAction & (ODA_DRAWENTIRE | ODA_SELECT)) { UINT uiFlag = DFCS_ADJUSTRECT | DFCS_BUTTONPUSH; if(lpDrawItemStruct->itemState & ODS_SELECTED) //押下状態 { uiFlag |= DFCS_PUSHED; rctSft.OffsetRect(1, 1); } pDC->DrawFrameControl(rct, DFC_BUTTON, uiFlag); //ボタンの描画 CString strWindowText; GetWindowText(strWindowText); if (strWindowText.GetLength()) { //書体を変更 LOGFONT logfont; memset(&logfont, 0, sizeof(logfont)); logfont.lfHeight = 18; logfont.lfWidth = 0; logfont.lfWeight = FW_BLACK; logfont.lfCharSet = DEFAULT_CHARSET; CFont font; font.CreateFontIndirect(&logfont); pDC->SelectObject(&font); //打印按钮的文字列 int nBkMode = pDC->SetBkMode(TRANSPARENT); COLORREF colorref =pDC->SetTextColor(RGB(255,0,0)); pDC->DrawText(strWindowText, &rctSft, DT_SINGLELINE | DT_CENTER | DT_VCENTER); pDC->SetTextColor(colorref); //絵の描画 pDC->DrawState(CPoint(rctSft.left + 10, rctSft.top + 10), CSize(32,32), AfxGetApp()->LoadIcon(IDR_MAINFRAME), DST_ICON, HBRUSH(NULL)); } } //フォーカスの描画 if( (lpDrawItemStruct->itemState & ODS_FOCUS)) { rctFocus.DeflateRect(4, 4); pDC->DrawFocusRect(rctFocus); } } |