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


CListCtrlのヘッダーのオーナー描画

  CListCtrlのヘッダーのオーナー描画のメモです。

1.CHeaderCtrlの派生クラスCHeaderCtrlTestを作成します。

2.各ヘッダーのタイトルを描画する為に、CHeaderCtrlTest::OnPaint()を実装します。

3.CListCtrlの派生クラスCListCtrlTestを作成し、CHeaderCtrlTest型でm_Headerメンバーを追加します。

4.CListCtrlTest::PreSubclassWindow()を実装し、m_HeaderCListCtrl::GetHeaderCtrl()で取得したHWNDをサブブラス化します。以上です。

ソースは下記です

 

ソースコード:

void CHeaderCtrlTest::OnPaint()
{
    CPaintDC dc(this); // device context for painting
    int nItem; 
    nItem = GetItemCount();
    for(int i = 0; i < nItem; i ++) 
    { 
        CRect tRect;
        GetItemRect(i, &tRect);
        if (i == m_iSelectedSubItem)
        {
            dc.DrawFrameControl(tRect,DFC_BUTTON,DFCS_BUTTONPUSH | DFCS_PUSHED);
        }
        else
        {
            dc.DrawFrameControl(tRect,DFC_BUTTON,DFCS_BUTTONPUSH);
        }
        CString strTitle;
        HDITEM hdi;
        TCHAR  lpBuffer[256];
        memset(lpBuffer, 0, sizeof(lpBuffer));

        hdi.mask = HDI_TEXT;
        hdi.pszText = lpBuffer;
        hdi.cchTextMax = 256;
        GetItem(i, &hdi);
        strTitle =lpBuffer;
        dc.SetBkMode(TRANSPARENT);

        LOGFONT logfont;
        memset(&logfont, 0, sizeof(logfont));
        logfont.lfHeight = 12;
        logfont.lfWidth = 0;
        logfont.lfWeight = FW_NORMAL;
        logfont.lfCharSet = DEFAULT_CHARSET;
        wcscpy(logfont.lfFaceName, FONT_NAME);

        CFont font;
        font.CreateFontIndirect(&logfont);
        CFont* oldfont = dc.SelectObject(&font); 

        dc.DrawText(strTitle, tRect, DT_CENTER | DT_SINGLELINE | DT_NOPREFIX | DT_VCENTER);
        dc.SelectObject(oldfont);
    }
}

void CListCtrlTest::PreSubclassWindow()
{
    CListCtrlWithEdit::PreSubclassWindow();
    CHeaderCtrl *pHeader = GetHeaderCtrl(); 
    m_Header.SubclassWindow(pHeader->GetSafeHwnd());
}