ListView 支援五種檢視模式,透過 ListView_SetView 動態切換。本文實作 ComboBox 選擇模式、ImageList 圖示管理、多視圖同步顯示完整範例。
| 常數 | 模式 | 特徵 |
|---|---|---|
LV_VIEW_DETAILS | 詳細資訊 | 多欄表格、可排序、標準報表檢視 |
LV_VIEW_ICON | 大圖示 | 32x32 圖示、自由排列、適合圖片預覽 |
LV_VIEW_SMALLICON | 小圖示 | 16x16 圖示、列表式、緊湊 |
LV_VIEW_LIST | 列表 | 單欄、垂直排列、無圖示 (或小圖示) |
LV_VIEW_TILE | 平鋪 | 大圖示+多行文字、XP 引入、適合詳細預覽 |
// 建立大/小圖示 ImageList
HIMAGELIST hImgLarge = ImageList_Create(
GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON),
ILC_MASK | ILC_COLOR32, 1, 1);
HIMAGELIST hImgSmall = ImageList_Create(
GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON),
ILC_MASK | ILC_COLOR32, 1, 1);
// 載入圖示資源並加入
HICON hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ITEM_ICON));
ImageList_AddIcon(hImgLarge, hIcon);
ImageList_AddIcon(hImgSmall, hIcon);
DestroyIcon(hIcon); // ImageList 內部複製,原 HICON 可銷毀
// 關聯到 ListView
ListView_SetImageList(hListView, hImgLarge, LVSIL_NORMAL); // 大圖示
ListView_SetImageList(hListView, hImgSmall, LVSIL_SMALL); // 小圖示/列表/詳細
// WM_INITDIALOG 初始化 ComboBox
HWND hCombo = GetDlgItem(hDlg, IDC_COMBO_VIEW);
ComboBox_AddString(hCombo, L"大圖示");
ComboBox_AddString(hCombo, L"小圖示");
ComboBox_AddString(hCombo, L"列表");
ComboBox_AddString(hCombo, L"詳細");
ComboBox_SetCurSel(hCombo, 3); // 預設詳細
// WM_COMMAND 處理選擇變更
case IDC_COMBO_VIEW:
if (HIWORD(wParam) == CBN_SELCHANGE) {
int idx = ComboBox_GetCurSel((HWND)lParam);
DWORD viewMode;
switch (idx) {
case 0: viewMode = LV_VIEW_ICON; break;
case 1: viewMode = LV_VIEW_SMALLICON; break;
case 2: viewMode = LV_VIEW_LIST; break;
case 3: viewMode = LV_VIEW_DETAILS; break;
default: viewMode = LV_VIEW_DETAILS;
}
ListView_SetView(GetDlgItem(hDlg, IDC_LISTVIEW), viewMode);
}
break;
LVITEM item = {0};
item.mask = LVIF_TEXT | LVIF_IMAGE;
item.iImage = 0; // ImageList 中索引
for (int i = 0; i < count; i++) {
item.iItem = i;
item.iSubItem = 0;
item.pszText = data[i].name;
ListView_InsertItem(hListView, &item); // 插入主項
// 設定子項 (詳細模式需要)
item.iSubItem = 1;
item.pszText = data[i].age;
ListView_SetItem(hListView, &item);
item.iSubItem = 2;
item.pszText = data[i].address;
ListView_SetItem(hListView, &item);
}
case WM_DESTROY:
case WM_SYSCOMMAND:
if (wParam == SC_CLOSE) {
ImageList_Destroy(hImgLarge);
ImageList_Destroy(hImgSmall);
// ListView 隨視窗銷毀自動清理
}
break;




LV_VIEW_ICON 與其他模式使用的圖示。LVITEM.iImage 指定 ImageList 索引,-1 表示無圖示。ListView_SetView 無需重建項目,保留所有資料與選取狀態。LVS_EX_DOUBLEBUFFER 減少閃爍,且項目需設定 LVITEM.lParam 或子項提供多行文字。ItemsSource) + DataTemplate 定義視覺樹View 屬性切換 GridView/ListView/WrapPanel 等VirtualizingPanel) 自動處理大量資料效能