今回は、ダイアログボックスにリストビューを付けます。
テキストの表示 - インコのWindowsSDK で作成したソースを修正します。
ここでは、Reseditで作成する方法も説明します。
流れ
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構造体へのポインタ );
リソースファイル
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のリソース ビュー、ResEditでの設定
ツールボックス(Toolbox)ウインドウの「ListView Cntrol」を選択
ソースコードの入力
ソースコードは下記のように入れてください。
#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, 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
Reseditで作成した場合は、これとは異なるソースコードになります。
上記の太線で示している箇所のみ追加です。
#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
Reseditで作成した場合は、これとは異なるソースコードになります。
上記の太線で示している箇所のみ追加です。