今回はMFCアプリで頻繁に使うコントロールの一つ、
CListCtrlクラスの操作方法について。
いつも自分がよく使う操作の備忘録と書いてますが、
今回はいつもに増して自分用の備忘録。
活用方法はたくさんありますが、
基本的に自分が使う方法の紹介…。
準備
プロジェクト作成
プロジェクトの作成方法、コントロールの配置方法は
こちらをご覧ください。
今回のプロジェクト名は「CListCtrlTest」にします。
コントロールID
今回はリストコントロールを用意。
配置後、IDを変更します。
変更方法は、以前CStaticの操作時に書いてますのでご参考に。
今回はボタンをIDC_LIST_TESTに。
前準備
ビルド前に前準備。
コントロールを配置したのち、幅を広げておきます。
初期状態では少し小さいので。

続いてリストコントロールを選択、プロパティ画面へ。
「ビュー」項目が初期では「Icon」になってるかもしれないので、
「レポート」に変更します。

変更すると、リソースの見た目も少し変化します。

ビルド
一度ビルドしておきます。

ヘッダー設定
今回もGetDlgItem方式で進めていきます。
プロジェクト名をCListCtrlTestで作成したので、
CListCtrlTestDlg.cppを開きます。
OnInitDialogでヘッダー作成。
BOOL CCListCtrlTestDlg::OnInitDialog()
{
// 略
// TODO: 初期化をここに追加します。
CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_TEST);
pListCtrl->InsertColumn(0, _T("列1(左寄せ)"), LVCFMT_LEFT, 200);
pListCtrl->InsertColumn(1, _T("列2(中央寄せ)"), LVCFMT_CENTER, 200);
pListCtrl->InsertColumn(2, _T("列3(右寄せ)"), LVCFMT_RIGHT, 200);
return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}InsertColumnで列を追加します。
引数3つ目はオプション。

これで列ヘッダーが追加されました。
行追加
続けて処理を書きます。
行を追加するにはLVITEM構造体を使用。
BOOL CCListCtrlTestDlg::OnInitDialog()
{
// 略
// TODO: 初期化をここに追加します。
CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_TEST);
pListCtrl->InsertColumn(0, _T("列1(左寄せ)"), LVCFMT_LEFT, 200);
pListCtrl->InsertColumn(1, _T("列2(中央寄せ)"), LVCFMT_CENTER, 200);
pListCtrl->InsertColumn(2, _T("列3(右寄せ)"), LVCFMT_RIGHT, 200);
LVITEM lvItem{};
lvItem.mask = LVIF_TEXT;
CString strTemp = _T("");
lvItem.iItem = 0; // 行番号
// 1行目
lvItem.iSubItem = 0; // 列番号
strTemp = _T("行1列1");
lvItem.pszText = strTemp.GetBuffer();
pListCtrl->InsertItem(&lvItem);
lvItem.iSubItem = 1; // 列番号
strTemp = _T("行1列2");
lvItem.pszText = strTemp.GetBuffer();
pListCtrl->SetItem(&lvItem);
lvItem.iSubItem = 2; // 列番号
strTemp = _T("行1列3");
lvItem.pszText = strTemp.GetBuffer();
pListCtrl->SetItem(&lvItem);
lvItem.iItem = 1; // 行番号
// 2行目
lvItem.iSubItem = 0; // 列番号
strTemp = _T("行2列1");
lvItem.pszText = strTemp.GetBuffer();
pListCtrl->InsertItem(&lvItem);
lvItem.iSubItem = 1; // 列番号
strTemp = _T("行2列2");
lvItem.pszText = strTemp.GetBuffer();
pListCtrl->SetItem(&lvItem);
lvItem.iSubItem = 2; // 列番号
strTemp = _T("行2列3");
lvItem.pszText = strTemp.GetBuffer();
pListCtrl->SetItem(&lvItem);
return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}- lvItem.iItem:行番号に当たります
- lvItem.iSubItem:列番号に当たります
- lvItem.pszText:挿入する文字列
- pListCtrl->InsertItem(&lvItem):構造体を挿入します
- pListCtrl->SetItem(&lvItem):構造体をセットします
注意なのが、行を一番最初に挿入する場合はInsertItem、
既に挿入した同行に別の列情報を追加する場合はSetItemを使います。
1列目はInsertItem、それ以外はSetItemって覚えれば大丈夫そうです。
ビルドした結果は。

このようになりました。
参考サイト
基本的に自分が使うのは紹介した通りです。
他にもオプションがありますので、
こちらのサイトがすごい参考になります。
実際自分もすごい助けられました。
簡易例
実際に使う場面は色々あると思います。
以下は簡単な具体例です。

名前は、個人情報テストデータ作成ツールなるものから拝借。
選択した行の色が変わる、などの処理を入れてもいいかもしれませんが、
今回は力尽きて断念…。
終わりに
今回はCListCtrlに関する処理で、
自分が主に使うものを軽くまとめてみました。
ひとまず備忘録紹介記事はこれにて終了予定です。
また気が向いたら書くかもしれません。

コメント