リストビューの列の属性を変更する

Visual C++プログラミングのメモ

【Visual C++ 2008】【MFC】

 「【C++/MFC】リストビューの基本的な使い方」の「列の挿入」にて述べた通り、 CListCtrl::InsertColumnの引数に右寄せ、中央寄せを指定しても、一番左側の列は左寄せになる。

 一番左側の列を右寄せ、中央寄せにする手順は以下の通り。
(CListCtrlクラスに該当するメンバ変数をm_wndListCtrlとする)

(1)
 列を挿入(インデックスはゼロ開始)


    m_wndListCtrl.InsertColumn(インデックス, 列のヘッダー文字列, 配置, 列幅の初期値);

または


    m_wndListCtrl.InsertColumn(インデックス, 列のヘッダー文字列);

(2)
 LVCOLUMN構造体にマスクを設定する。配置(寄せ)のみを変更するには、


    LVCOLUMN column;
    column.mask = LVCF_FMT;

列幅のみを変更するには、


    column.mask = LVCF_WIDTH;

同時に両方変更するには、


    column.mask = LVCF_FMT|LVCF_WIDTH;

(3)
 現在の属性を取得後、新しい属性を上書きする


    // 現在の属性を取得
    m_wndListCtrl.GetColumn(インデックス, &column);

    // 新しい配置(LVCFMT_LEFT/LVCFMT_RIGHT/LVCFMT_CENTER)
    column.fmt = 配置;

    // 新しい列幅(ピクセル数)
    column.cx = 列幅;

    // 新しい属性を上書き
    m_wndListCtrl.SetColumn(インデックス, &column);

 何故このような面倒な仕様になっているのか、MFCのソースを読んでみても、 最終的にSendMessage APIにてLVM_INSERTCOLUMNメッセージを飛ばしているだけである。 真実は、APIのソースに隠されている。

(メモ)

  • 参考までにCListCtrlクラスのソースは、
    • C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc\winctrl2.cpp
    • C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\afxcmn.inl
  • 引数の型、配置や列幅以外の属性については、MSDNライブラリの「CListCtrl::InsertColumn」「CListCtrl::GetColumn」「CListCtrl::SetColumn」「LVCOLUMN Structure」を参照のこと