none
MFCのCListCtrlのヘッダー部をオーナードローでカスタマイズしたい。 RRS feed

  • 質問

  • VS2010 VC++MFCで開発しています。


    やりたいことはタイトル通りですが、
    具体的にはダイアログ内に作成したCListCtrlのヘッダー部の一部のカラムだけOwnerDrawで2行で表示したいと思っています。


    現在 CHeaderCtrlの派生クラスを作成して、DrawItem を継承メソッドとして定義しています。
    そして、CDialogの派生クラスに CListCtrlを置き、ダイアログのOnInitDialogに以下のソースを置いているのですが、
    CHeaderCtrlの派生クラスに定義したDrawItemが呼ばれません。


    CDialogの派生クラス::OnInitDialog()
    {
        // カラムを10個定義

      CHeaderCtrl* pHeader = CListCtrlのサブクラス->GetHeaderCtrl();
        if ( pHeader )
        {
     _pHeaderCtrl = new CtHeaderCtrlのサブクラス();
            _pHeaderCtrl->SubclassWindow( pHeader->m_hWnd );
             HDITEM hi;
             for ( int i = 0; i < _pHeaderCtrl->GetItemCount(); i++ )
            {
                _pHeaderCtrl->GetItem( i, &hi );
                hi.fmt |= HDF_OWNERDRAW;
                _pHeaderCtrl->SetItem( i, &hi );
            }
     _pHeaderCtrl->Invalidate();
        }
    }

    CHeaderCtrlの派生クラスのDrawItemが呼ばれる方法をご教授お願いします。

    2016年6月5日 8:18

回答

  • ご質問の条件で、CHeaderCtrl の派生クラスの DrawItem が呼ばれるようるにするには、以下のようにする必要があるようです。

    ・CDialog の派生クラス で DDX_Control を使ってダイアログに配置した List Control を CListCtrl か CListCtrlの派生クラスのコントロール変数でサブクラス化する。

    ダイアログに配置した List Control のスタイルを必ずしも Owner Draw Fixed = TRUE にする必要はないようですが、上記の List Control のサブクラス化は必要なようです。

    検証に使ったサンプルプロジェクトを http://work.vc/OwnerDrawHeaderCtrlSample.zip に置いています。

    • 編集済み kenjinoteMVP 2016年6月5日 15:35
    • 回答としてマーク AppWorks 2016年6月5日 16:02
    2016年6月5日 15:32

すべての返信

  • ご質問の条件で、CHeaderCtrl の派生クラスの DrawItem が呼ばれるようるにするには、以下のようにする必要があるようです。

    ・CDialog の派生クラス で DDX_Control を使ってダイアログに配置した List Control を CListCtrl か CListCtrlの派生クラスのコントロール変数でサブクラス化する。

    ダイアログに配置した List Control のスタイルを必ずしも Owner Draw Fixed = TRUE にする必要はないようですが、上記の List Control のサブクラス化は必要なようです。

    検証に使ったサンプルプロジェクトを http://work.vc/OwnerDrawHeaderCtrlSample.zip に置いています。

    • 編集済み kenjinoteMVP 2016年6月5日 15:35
    • 回答としてマーク AppWorks 2016年6月5日 16:02
    2016年6月5日 15:32
  • いつもありがとうございます。

    CListCtrlのサブクラスを作らないと CHeaderCtrlのオーナードローが出来ない というのは変な仕様ですが、なんとかDrawItemに来るようになりました。

    たいへんありがとうございました。

    2016年6月5日 16:02