OrangeMaker_logo
memo アイコン SDK-MFC 備忘録

Windows SDKやMFCに関するメモです。
(記載内容について正しいことを保証するものではありません。MSDN等で確認してください)

CMFCListCtrlクラス

2010/5/16 作成

  MFC futurePackでMFCのクラスが追加されています。基本的にこれらはRibbonインタフェースのための追加ですが、いくつかのクラスは単独でも使用できます。その中のひとつとしてCMFCListCtrlクラスがあります。
 このクラスを使用すると、リストのソート処理、行やセル単位の描画色の変更などが比較的簡単に行えます。従来のCListCtrlクラスで行おうとすると結構面倒です。
 ひとまず、背景色、及び文字色を変更する手順をメモします。
 使用方法は、

  1. CMFCListCtrlクラスを継承したクラスを作成する。(このクラスをCMyListCtrlクラスとします。)
  2. 背景を変えたい場合は、virtual COLORREF OnGetCellBkColor(int nRow,int nColumn )をオーバーライドする。
    テキストの描画色を変えたい場合はvirtual COLORREF OnGetCellTextColor(int nRow,int nColumn ) をオーバーライドする。
    戻り値がCOLORREFなので、RGBマクロでRGB(200,200,200)等で色指定ができます。
  3. リソースエディタで作成した画面の場合はCListCtrlクラスの部分をCMyListCtrlクラスに置き換えます。

基本的には、これだけです。

 実はメモしたい内容は、ここからです。上記の状態でリストを表示するとリストヘッダに関して2点問題があります。

  1. ヘッダの表示がXPスタイルにならない。
  2. ヘッダをクリックするとソートマークが表示される。

まず、簡単な方から、2のソートマークはリソースエディタのプロパティ設定でNo Sort Header をTRUEに設定するとクリックに反応しなくなります。
(ClistCtrlの場合はクリックだけでなくマウスオーバーにも反応しなくなります。)

次に、ヘッダの表示スタイルですがこれは、おそらくヘッダボタンにCMFCButtonクラスを使っているせいではないかと当たりを付けて、futureパックのVisualManagerの設定を追加するとビンゴ!でした。

プログラムの起動処理部分に、(通常はダイアログの場合、XXXAppクラスのInitInstance()にいれます。)

CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
CMFCButton::EnableWindowsTheming();

の2行を追加します。

プログラムの終了で、

CMFCVisualManager::DestroyInstance();

とやらないと、メモリリークとなります。

※ただし、XXXAppクラスがCWinAppクラスでなくCWinAppExを継承している場合はDestroyInstance()でのオブジェクトの破棄は不要です。
CWinAppExクラスの終了処理でCMFCVisualManager::DestroyInstance();を呼び出しています。