CListCtrlのヘッダー部分の背景色 – プログラミング – Home

CListCtrlのヘッダー部分の背景...
 
通知
すべてクリア

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


イッコウ
 イッコウ
(@イッコウ)
ゲスト
結合: 22年前
投稿: 22
Topic starter  

CListCtrlのヘッダー部分の背景色について質問があります。

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

環境
Windows XP
VC++6.0 SP5
MFC


引用解決済
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

ほかに方法があるかもしれないけど、
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
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

連投ですが、SDKのやり方は
http://ww1.enjoy.ne.jp/~turikiti/knowledge/program/backcolor.htm
にありました。

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


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

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


返信引用
イッコウ
 イッコウ
(@イッコウ)
ゲスト
結合: 22年前
投稿: 22
Topic starter  

Blueさん、PATIOさん
レスありがとうございます。
返事が遅くなりました。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました