MFCプロジェクトでCListCtrlクラスを操作する

今回は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って覚えれば大丈夫そうです。

ビルドした結果は。

このようになりました。

参考サイト

基本的に自分が使うのは紹介した通りです。

他にもオプションがありますので、
こちらのサイトがすごい参考になります。

【C++/MFC】リストビューの基本的な使い方

実際自分もすごい助けられました。

簡易例

実際に使う場面は色々あると思います。

以下は簡単な具体例です。

名前は、個人情報テストデータ作成ツールなるものから拝借。

選択した行の色が変わる、などの処理を入れてもいいかもしれませんが、
今回は力尽きて断念…。

終わりに

今回はCListCtrlに関する処理で、
自分が主に使うものを軽くまとめてみました。

ひとまず備忘録紹介記事はこれにて終了予定です。

また気が向いたら書くかもしれません。

SampleSrc/CPlusPlus/ControlOpeartion/ControlTest at main ?? Tatsumath/SampleSrc
Various sources, mostly C++. Contribute to Tatsumath/SampleSrc development by creating an account on GitHub.

コメント

タイトルとURLをコピーしました