ListView 是 Win32 最常用的清單控制項,支援多欄報表檢視。本文從資源編輯器建立、欄位插入、項目/子項管理、圖示關聯完整實作基礎報表模式 ListView。
IDC_LISTVIEW)Full Row Select、Grid Lines 增強可讀性

原始碼 #include 右鍵 → **產生包含檔關係圖**,視覺化標頭檔相依結構,適合大型專案架構分析。


case WM_INITDIALOG: {
HWND hListView = GetDlgItem(hDlg, IDC_LISTVIEW);
LVCOLUMN col = {0};
col.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
// 欄位 0:姓名
col.pszText = L"姓名";
col.cx = 90;
col.iSubItem = 0;
ListView_InsertColumn(hListView, 0, &col);
// 欄位 1:年齡
col.pszText = L"年齡";
col.cx = 90;
col.iSubItem = 1;
ListView_InsertColumn(hListView, 1, &col);
// 欄位 2:地址
col.pszText = L"地址";
col.cx = 200;
col.iSubItem = 2;
ListView_InsertColumn(hListView, 2, &col);
return TRUE;
}
| 成員 | 用途 |
|---|---|
mask | 指定有效欄位:LVCF_TEXT、LVCF_WIDTH、LVCF_SUBITEM、LVCF_FMT、LVCF_IMAGE 等 |
pszText | 欄位標題文字 |
cx | 欄位寬度 (像素) |
iSubItem | 子項索引 (對應 LVITEM.iSubItem) |
fmt | 對齊:LVCFMT_LEFT/CENTER/RIGHT |
struct STUDENTINFO {
wchar_t name[15];
wchar_t age[3];
wchar_t address[50];
};
STUDENTINFO students[] = {
{L"小劉", L"20", L"火星"},
{L"老趙", L"21", L"木星"},
{L"小胡", L"30", L"水星"},
{L"老高", L"32", L"山溝一號"},
{L"黃牛", L"24", L"不知哪個星球來的"},
{L"王七", L"28", L"超人之鄉"}
};
case WM_COMMAND:
if (LOWORD(wParam) == IDC_BTN_ADD) {
HWND hListView = GetDlgItem(hDlg, IDC_LISTVIEW);
int count = sizeof(students) / sizeof(students[0]);
LVITEM item = {0};
item.mask = LVIF_TEXT;
for (int i = 0; i < count; i++) {
// 1. 插入主項 (第 0 欄)
item.iItem = i;
item.iSubItem = 0;
item.pszText = students[i].name;
ListView_InsertItem(hListView, &item);
// 2. 設定子項 1 (年齡)
item.iSubItem = 1;
item.pszText = students[i].age;
ListView_SetItem(hListView, &item);
// 3. 設定子項 2 (地址)
item.iSubItem = 2;
item.pszText = students[i].address;
ListView_SetItem(hListView, &item);
}
}
else if (LOWORD(wParam) == IDC_BTN_CLEAR) {
ListView_DeleteAllItems(GetDlgItem(hDlg, IDC_LISTVIEW));
}
break;
| 操作 | 宏/訊息 | 用途 |
|---|---|---|
| 插入新行 | ListView_InsertItem / LVM_INSERTITEM | 建立新項目 (iItem 指定索引,-1 附加) |
| 設定子項 | ListView_SetItem / LVM_SETITEM | 更新現有項目特定子欄文字/圖示/狀態 |
| 刪除單項 | ListView_DeleteItem | 移除指定索引項目 |
| 清空所有 | ListView_DeleteAllItems | 移除所有項目,保留欄位定義 |

LVIF_IMAGE + ImageList (見第 16 篇)ListView_SortItems + 自訂比較函式 PFNLVCOMPARELVS_EDITLABELS 樣式 + LVN_BEGINLABELEDIT/ENDLABELEDITLVS_OWNERDATA 大量資料 (百萬列) 按需回呼 LVN_GETDISPINFONM_CUSTOMDRAW 階段式繪製控制ListView_InsertColumn 索引重複或跳號 → 欄位順序錯亂LVITEM.iSubItem 未設為 0 就 InsertItem → 插入失敗LVITEM.pszText 仍指向 → 顯示亂碼 (需 LVS_OWNERDATA 或複製字串)LVCOLUMN.mask 包含 LVCF_SUBITEM → 子項對應失效