プログラミングメモ →目次

ボタンのオーナー描画(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);
    }
}