CListCtrlのヘッダー部分の背景色

[戻る]
イッコウ 2006/06/28(水) 16:36:02
CListCtrlのヘッダー部分の背景色について質問があります。

現在、ダイアログ上にCListCtrlを配置し、計算結果を表示しています。
CListCtrlの表示内容の色(テキスト&背景色)は
独自のCListCtrlクラスを作成し、OnCustomDrawで制御できたのですが、
ヘッダー部分の背景色を変更する方法が分かりません。
ヘッダー部分の背景色を変更することは不可能なのでしょうか?
ご存知の方、アドバイスをよろしくお願いします。

環境
Windows XP
VC++6.0 SP5
MFC

Blue 2006/06/28(水) 23:38:50
ほかに方法があるかもしれないけど、
CListCtrlとCHeaderCtrlをサブクラス化して、オーナードローすればいけそう。
(カスタムドローがサブクラス化によってできなくなるかどうかの検証はしていない)

1. CListCtrlとCHeaderCtrlの派生クラスをそれぞれ用意する。
   (CMyListCtrlとCMyHeaderCtrlとする)
2. CMyListCtrlにCMyHeaderCtrlのメンバ変数を追加し、
   以下のようにする。
   (PreSubclassWindowで処理すべきかどうかも定かではない)

void CMyListCtrl::PreSubclassWindow() 
{
    // TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してくだ
さい
    this->InsertColumn( 1, _T( "TEST" ), LVCFMT_LEFT, 100 );

    CHeaderCtrl* pHeader = this->GetHeaderCtrl();
    if ( pHeader )
    {
        this->m_Header.SubclassWindow( pHeader->m_hWnd );
        HDITEM hi;
        // HDF_OWNERDRAWを追加
        for ( int i = 0; i < this->m_Header.GetItemCount(); i++ )
        {
            this->m_Header.GetItem( i, &hi );
            hi.fmt |= HDF_OWNERDRAW;
            this->m_Header.SetItem( i, &hi );
        }
    }
    CListCtrl::PreSubclassWindow();
}

3. CMyHeaderCtrlのDrawItemメソッドをオーバーライドして、オナー描画する。
   以下チョー適当なサンプル(あっている保障なし)

void MyHeaderCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォル
トの処理を呼び出してください
    HDITEM hi;
    TCHAR  lpBuffer[256];
    hi.mask = HDI_TEXT;
    hi.pszText = lpBuffer;
    hi.cchTextMax = 256;
    this->GetItem( lpDrawItemStruct->itemID, &hi );
    CRect  rc( lpDrawItemStruct->rcItem );

    CDC* pDC = CDC::FromHandle( lpDrawItemStruct->hDC );
    pDC->SaveDC();

    CBrush brush(RGB(255,0,0)); // 背景色
    // ボタンの描画
    pDC->DrawFrameControl( &rc, DFC_BUTTON, DFCS_BUTTONPUSH );
    // 背景の塗りつぶし
    rc.DeflateRect( 1, 1, 3, 2);
    pDC->FillRect( &rc, &brush );
    // テキストの描画
    rc.OffsetRect( 1, 1 );
    pDC->SetBkMode( TRANSPARENT);
    pDC->DrawText( hi.pszText, lstrlen( lpBuffer ), &rc, DT_LEFT ); // 最後の引
数は適当

    pDC->RestoreDC( -1 );
}

参考)
http://forums.belution.com/ja/vc/000/276/80.shtml
http://www.athomejp.com/goldfish/mfc/button/clrbutton.asp

Blue 2006/06/29(木) 01:02:27
オーナードローのところは適当すぎるので、
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_BTowner.html
を参考にしてもらうほうがよいかも。(基本的にはボタンの背景色を変えるのと同じ)

Blue 2006/06/29(木) 01:14:24
連投ですが、SDKのやり方は
http://ww1.enjoy.ne.jp/~turikiti/knowledge/program/backcolor.htm
にありました。

いろいろと間違っているところが、出てきましたね、、、orz

PATIO 2006/06/29(木) 10:26:31
ちょっとだけ補足すると、
CListCtrlのヘッダー部分の制御は内部に抱えているCHeaderCtrlが行っているので
CListCtrlのカスタムドロウでは対処できません。
なのでCListCtrl::GetHeaderCtrlで内部に抱えているCHeaderCtrlのポインタを
取得してこれに対してオーナードロウを行う必要があるわけです。
多分、CListCtrl::GetHeaderCtrlがあるのは直接ヘッダー部分に手を入れたい
時用なのだと思います。

イッコウ 2006/06/30(金) 21:00:50
Blueさん、PATIOさん
レスありがとうございます。
返事が遅くなりました。

勉強がてら、オーナードロウを試してみようと思います。

古いスレッドには追加発言できません。