http://www.kumei.ne.jp/c_lang/sdk2/sdk_106.htm
を参考に。
#include <windows.h> #include <commctrl.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int nShowCmd){ (省略) } LPTSTR key[] = {"key1", "key2", "key3"}; LPTSTR val[] = {"val1", "val2", "val3"}; LRESULT CALLBACK WndProc (HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam) { static HWND hList; LV_COLUMN col; LV_ITEM item; int i; switch(nMsg){ case WM_CREATE: InitCommonControls(); hList = CreateWindowEx( 0, /* 拡張ウインドウスタイル */ WC_LISTVIEW, NULL, /* クラス名 タイトル */ WS_CHILD | WS_VISIBLE | LVS_REPORT, /* ウインドウスタイル */ 0, 0, 0, 0, /* 位置、サイズ */ hWnd, /* 親ウインドウ */ (HMENU)1, /* メニューハンドル */ ((LPCREATESTRUCT)lParam)->hInstance, /* インスタンス */ NULL); /* WM_CREATE時に渡される引数 */ col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; col.fmt = LVCFMT_LEFT; col.cx = 100; col.pszText = "key"; col.iSubItem = 0; ListView_InsertColumn(hList, 0, &col); col.cx = 200; col.pszText = "value"; col.iSubItem = 1; ListView_InsertColumn(hList, 1, &col); item.mask = LVIF_TEXT; for(i=0; i<3; i++){ item.pszText = key[i]; item.iItem = i; item.iSubItem = 0; ListView_InsertItem(hList, &item); item.pszText = val[i]; item.iItem = i; item.iSubItem = 1; ListView_SetItem(hList, &item); } break; case WM_SIZE: MoveWindow(hList, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, nMsg, wParam, lParam)); } return 0; }
こんな感じ。ポイントは
- WM_CREATEを受け取ったときにリストビューを生成
- InitCommonControls()で初期化
- CreateWindowEx()で作成
- クラス名にWC_LISTVIEWを指定
- インスタンスは、lParamにCREATESTRUCT型の構造体のポインターが入っているので、そこのhInstanceから取り出す
Columnが項目名、Itemがデータ要素ということのようです。あと、一番左の要素がItemで、右側の要素はSubItemという概念のようです。
ちなみに、comctl32.libをリンクする必要があります。gccでコンパイルするときは
$ gcc wt.c -mwindows -lcomctl32
こんな感じでコンパイルします。
さてリストビューも分かった。後は項目をソートする方法を調べれば完成か?