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