ツリーアイテムの文字色を変更する

CTreeCtrlクラスにはオーナードローの機能がないが、 OnPaint関数をオーバーライドすることで描画をコントロールすることは可能である。 ここではアイテムの文字色を変更するツリーコントロールクラスを作成する。

新しいクラス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() を呼び出してはいけません
	}

目次へ