今回は、ダイアログボックスにリストビューを付けます。
テキストの表示 - インコのWindowsSDK で作成したソースを修正します。
C言語 ソースファイル
commctrl.hをインクルード
comctl32.lib を読み込む
WM_INITDIALOG
WM_INITDIALOGは、ダイアログが作成されたときに一度だけ実行されます。
1.InitCommonControls()でコモンコントロールの初期化
2.リストビューを作成します。まずは、リストビューに新しいカラム(項目)を追加するため、LVCOLUMN構造体を初期化。構造体にデータをセット。
typedef struct _LVCOLUMN {
UINT mask; // 有効メンバを示すフラグ
int fmt; // 列の配置
int cx; // カラム(項目)の幅
LPTSTR pszText; // カラムのヘッダの文字列
int cchTextMax; // pszTextのサイズ
int iSubItem; // カラムのサブアイテムインデックス
int iImage; // イメージのインデックス
int iOrder; // カラムのオフセット
} LVCOLUMN, FAR *LPLVCOLUMN;
| mask | 有効のメンバ |
| LVCF_FMT | fmtが有効 |
| LVCF_WIDTH | cxが有効 |
| LVCF_TEXT | pszTextが有効 |
| LVCF_SUBITEM | iSubItemが有効 |
| LVCF_IMAGE | iImageが有効 |
| LVCF_ORDER | iOrderが有効 |
| fmt | 機能 |
| LVCFMT_LEFT | テキストが左に配置 |
| LVCFMT_RIGH | テキストが右に配置 |
| LVCFMT_CENTER | テキストが中央に配置 |
| LVCFMT_IMAGE | アイテムはイメージリストからイメージを表示 |
| LVCFMT_BITMAP_ON_RIGHT | ビットマップをアイテムの右側に表示 |
| LVCFMT_COL_HAS_IMAGES | ヘッダアイテムはイメージリスト中のイメージを含みます。 |
3.ListView_InsertColumn()で、リストビューに新しいカラム(項目)を追加
この関数の第3引数に、先ほど作成したLVCOLUMN 構造体へのポインタをセットします。
int ListView_InsertColumn(
HWND hwnd, // リストビューのハンドル
int iCol, // 追加する列のインデックス
const LPLVCOLUMN pcol // LVCOLUMN 構造体へのポインタ
);
4.次にリストビューの項目の属性を設定します。
LVITEM構造体を初期化。構造体にデータをセット。
typedef struct _LVITEM {
UINT mask; // 有効メンバを示すフラグ
int iItem; // アイテムのインデックス
int iSubItem; // サブアイテムインデックス
UINT state; // アイテムの状態・イメージ
UINT stateMask; // state のフラグ
LPTSTR pszText; // アイテムの文字列
int cchTextMax; // pszTextのサイズ
int iImage; // イメージのインデックス
LPARAM lParam; // アイテムの持つ32ビット値
int iIndent; // インデント
#if (_WIN32_IE >= 0x560) // Internet Explorer 5.6以降で有効
int iGroupId; //
UINT cColumns; // tile view columns
PUINT puColumns; //
#endif
} LVITEM, FAR *LPLVITEM;
| mask | 有効メンバを示すフラグ | |
| LVIF_TEXT | pszTextが有効 | |
| LVIF_IMAGE | iImageが有効 | |
| LVIF_PARAM | lParamが有効 | |
| LVIF_STATE | stateが有効 | |
| LVIF_INDENT | iIndentが有効 | |
| LVIF_GROUPID | iGroupIDが有効 | |
| LVIF_COLUMNS | pszTextが有効 | |
| LVIF_TEXT | cColumnsが有効 | |
| iItem |
0 から始まるアイテムのインデックスを指定 (列の上から数えた番号) |
|
| iSubItem |
0 から始まるサブアイテムのインデックスを指定 (行の左から数えた番号) |
|
5.ListView_SetItem()でリストビューの項目の属性を設定。
この関数の第2引数に、先ほど作成したLVITEM構造体へのポインタをセットします。
BOOL ListView_SetItem(
HWND hwnd, // リストビューのハンドル
const LPLVITEM pitem // LVITEM構造体へのポインタ
);
リソースファイル
リストビュー[WC_LISTVIEW]
ソースコードを直接手入力する場合
1.リストビューを使用するため、commctrl.hをインクルード。
2.リストビュー[WC_LISTVIEW]を追加。
WC_LISTVIEWの代わりに、"SysListView32"と記述することができます。「" "」を忘れないで下さい。
この場合は、リソースファイルで、commctrl.hをインクルードする必要はありません。
ただし、"SysListView32"と記述した場合でも、Cソースファイルでは、commctrl.hのインクルードが必要です。
CONTROL "", id, WC_LISTVIEW, style, x0, y0, width, height
| id | リストビューID |
| style | リストビューのスタイル ウインドウスタイルと、リストビューのスタイルが指定可能 |
| x0 | リストビュー左上のx座標 |
| y0 | リストビュー左上のy座標 |
| width | リストビューの幅 |
| height | リストビューの高さ |
Visual Studioのリソース ビューからリストビューを追加する場合
下図のように、メニューの「表示(V)」-「ツールボックス(X)」を選択します。 左端にある縦字の「ツールボックス」をクリックしてもかまいません。
ツールボックスウインドウで、「List Control」をダブルクリックしてください。 「List Box」と間違えないでください。
リストビューのサイズを変更する場合は、プレビュー画面のDrag&Dropで変えてください。
ソースコードの入力
ソースコードは下記のように入れてください。
#include <windows.h> #include <commctrl.h> #include "Resource.h" #pragma comment(lib, "comctl32.lib") LPTSTR strItem0[] = { TEXT("TILTE1"), TEXT("TILTE2") }; int CX[] = { 80, 160 }; LPTSTR strItem1[] = { TEXT("LIST11"), TEXT("LIST12") }; LPTSTR strItem2[] = { TEXT("LIST21"), TEXT("LIST22") }; // このコード モジュールに含まれる関数の宣言を転送します: BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow ) { DialogBox(hInstance, TEXT("DIALOG_BOX"), NULL, (DLGPROC)DialogProc); return 0; } BOOL CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { LVCOLUMN lvcol; LVITEM item; UINT i; static HWND hList; switch (msg) { case WM_INITDIALOG: InitCommonControls(); hList = GetDlgItem(hWnd, IDC_LIST1); lvcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvcol.fmt = LVCFMT_LEFT; for(i = 0; i < 2; i++){ lvcol.cx = CX[i]; // 表示位置 lvcol.pszText = strItem0[i]; // 見出し lvcol.iSubItem = i; // サブアイテムの番号 ListView_InsertColumn(hList, i, &lvcol); } item.mask = LVIF_TEXT; for(i = 0; i < 2; i++){ item.pszText = strItem1[i]; // テキスト item.iItem = i; // 番号 item.iSubItem = 0; // サブアイテムの番号 ListView_InsertItem(hList, &item); item.pszText = strItem2[i]; // テキスト item.iItem = i; // 番号 item.iSubItem = 1; // サブアイテムの番号 ListView_SetItem(hList, &item); } break; case WM_CLOSE: EndDialog(hWnd, IDOK); break; default: break; } return FALSE; }
#define IDC_LIST1 400
#ifndef IDC_STATIC
#define IDC_STATIC -1
#endif
上記の太線で示している箇所のみ追加です。
#include <windows.h> #include <commctrl.h> #include "Resource.h" ///////////////////////////////////////////////////////////////////////////// // // ダイアログ // DIALOG_BOX DIALOG 0, 0, 170, 62 FONT 9, "MS UI Gothic" CAPTION "ダイアログ" BEGIN CONTROL "", IDC_LIST1, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_REPORT | LVS_ICON, 2, 2, 166, 58 END
上記の太線で示している箇所のみ追加です。