ダイアログボックスにリストビューを付ける

リストビューの拡張スタイルを使います。下記のことができます。
・グリッドライン(LVS_EX_GRIDLINES)
・チェックボックス(LVS_EX_CHECKBOXES)

チェックボックス

・1行選択(LVS_EX_FULLROWSELECT)
1行選択

・ヘッダー部分をドラッグして列の順番の入れ替え(LVS_EX_HEADERDRAGDROP)
列の順番の入れ替え1

列の順番の入れ替え2

リストビュー1 - インコのWindowsSDK で作成したソースを修正します。

流れ

WM_INITDIALOG

1.ListView_GetExtendedListViewStyle()で、現在のリストビューのスタイルを取得。

DWORD ListView_GetExtendedListViewStyle(
    HWND hwndLV  // リストビューのハンドル
);

SendMessage(hwndLV, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0)と同等。

2.ListView_SetExtendedListViewStyle()で、現在のリストビューのスタイルを取得。

DWORD ListView_SetExtendedListViewStyle(
    HWND hwndLV,    // リストビューのハンドル
    DWORD dwExStyle // リストビューのスタイル
);

SendMessage(hwndLV, LVM_SETEXTENDEDLISTVIEWSTYLE, dwExMask, dwExStyle)と同等。
dwExMaskは、変更するリストビューのスタイル。

上記1.2.のようにListView_GetExtendedListViewStyle()と、ListView_SetExtendedListViewStyle()を使わずに、 リソースファイルに直接入れたり、CreateWindowEx()のスタイルに直接指定してもうまくいきません。

WM_COMMAND

3.ListView_GetCheckState()で、現在のリストビューのチェック状態を取得。

BOOL ListView_GetCheckState(
    HWND hwndLV,   // リストビューのハンドル
    UINT iIndex    // リストビューインデックス
);

ソースコードの入力

ソースコードは下記のように入れてください。

test.cpp
#include <windows.h>
#include <commctrl.h>
#include "resource.h"

#pragma comment(lib, "comctl32.lib")

LPCTSTR szBuf_edit1;
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;
    DWORD dwStyle;
    UINT wmId;
    BOOL check1;
    BOOL check2;
    switch (msg)
    {
        case WM_INITDIALOG:
            InitCommonControls();
            hList = GetDlgItem(hWnd, IDC_LIST1);
            dwStyle = ListView_GetExtendedListViewStyle(hList);
            dwStyle |= LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT |
                        LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP;
            ListView_SetExtendedListViewStyle(hList, dwStyle);

            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_COMMAND:
            wmId = LOWORD(wParam);
            switch (wmId)
            {
                case IDC_BUTTON1: // ボタンが押されたとき
                    // チェックが入っているか確認
                    check1 = ListView_GetCheckState(hList, 0);
                    check2 = ListView_GetCheckState(hList, 1);
                    if((check1 == 1)
                      && (check2 == 1))
                    {
                        szBuf_edit1 = TEXT("両方にチェックが入っています。");
                    }
                    else if(check1 == 1)
                    {
                        szBuf_edit1 = TEXT("チェック1だけにチェックが入っています。");
                    }
                    else if(check2 == 1)
                    {
                        szBuf_edit1 = TEXT("チェック2だけにチェックが入っています。");
                    }
                    else
                    {
                        szBuf_edit1 = TEXT("両方ともチェックが入っていません。");
                    }
                    // テキストの表示
                    SetDlgItemText(hWnd, IDC_STATIC1, szBuf_edit1); 
                    break;
            }
            break;
        case WM_CLOSE:
            EndDialog(hWnd, IDOK);
            break;
        default:
            break;
    }
    return FALSE;
}

resource.h

#define IDC_BUTTON1 1002
#define IDC_STATIC1 1003
#define IDC_LIST1 400
#ifndef IDC_STATIC
#define IDC_STATIC -1
#endif

上記の太線で示している箇所のみ追加です。

test.rc
#include <windows.h>
#include <commctrl.h>
#include "resource.h"

/////////////////////////////////////////////////////////////////////////////
//
// ダイアログ
//

DIALOG_BOX DIALOG 0, 0, 170, 100
FONT 9, "MS UI Gothic"
CAPTION "ダイアログ"
BEGIN
     CONTROL         "", IDC_LIST1,
                    WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_REPORT | LVS_ICON,
                    2, 2, 166, 58
    LTEXT           "", IDC_STATIC1, 15, 80, 152, 14
    PUSHBUTTON      "表示", IDC_BUTTON1, 103, 65, 36, 12
END

Reseditで作成した場合は、これとは異なるソースコードになります。 上記の太線で示している箇所のみ追加です。