| ツリーアイテムの文字色を変更する |
新しいクラスCColorTreeCtrlを、基本クラスをCTreeCtrlとして作成する。
クラスを作成したら、ClassWizardを使ってWM_PAINTメッセージのハンドラ関数OnPaintをオーバーライドする。
OnPaint関数の内容は以下のようにすること。
void CColorTreeCtrl::OnPaint()
{
CPaintDC dc(this); // 描画用のデバイス コンテキスト
// TODO: この位置にメッセージ ハンドラ用のコードを追加してください
// デフォルトの描画処理
// WM_PAINTメッセージでは、wParamに描画をおこなうデバイスコンテキストのハンドルを指定する
CWnd::DefWindowProc( WM_PAINT, (WPARAM)dc.m_hDC, 0 );
// ツリーコントロールのフォントを取得し、これを
// デバイスコンテキストのフォントとして設定する
LOGFONT lf;
CFont f;
GetFont()->GetLogFont(&lf);
f.CreateFontIndirect(&lf);
CFont* pOldFont = dc.SelectObject(&f);
// すべてのアイテムについてテキストを描画しなおす
HTREEITEM hItem = GetFirstVisibleItem();
do
{
// 描画色と背景色を設定
if( hItem == GetDropHilightItem() ||
(hItem == GetSelectedItem() && GetDropHilightItem() == NULL) )
{
// アイテムがドロップ先の場合、または
// 選択中でドロップ先が存在しない場合
// (ここではデフォルトと同じ色を設定している)
dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
}
else
{
// 文字色を赤に設定する
dc.SetBkColor(::GetSysColor(COLOR_WINDOW));
dc.SetTextColor(RGB(255, 0, 0));
}
// アイテムのテキストを取得し、描画する
CString strText = GetItemText(hItem);
CRect rect;
GetItemRect(hItem, &rect, TRUE);
dc.TextOut(rect.left + 2, rect.top + 1, strText);
} while(hItem = GetNextVisibleItem(hItem));
// デバイスコンテキストのフォントを元に戻す
dc.SelectObject(pOldFont);
// 描画用メッセージとして CTreeCtrl::OnPaint() を呼び出してはいけません
}