【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」を参照のこと