Windowsプログラミング(2) リストビュー

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

こんな感じでコンパイルします。

さてリストビューも分かった。後は項目をソートする方法を調べれば完成か?