リストビューの拡張スタイルを使います。下記のことができます。
・グリッドライン(LVS_EX_GRIDLINES)
・チェックボックス(LVS_EX_CHECKBOXES)
・1行選択(LVS_EX_FULLROWSELECT)
・ヘッダー部分をドラッグして列の順番の入れ替え(LVS_EX_HEADERDRAGDROP)
リストビュー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 // リストビューインデックス );
ソースコードの入力
ソースコードは下記のように入れてください。
#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; }
#define IDC_BUTTON1 1002
#define IDC_STATIC1 1003
#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, 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で作成した場合は、これとは異なるソースコードになります。 上記の太線で示している箇所のみ追加です。