首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Win32 開發入門(15):ListView 控制項基礎 - 報表視圖、欄位插入、項目管理

     編輯:關於C++

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

資源編輯器建立 ListView

  1. 對話方塊編輯器拖曳 **List Control**
  2. 屬性頁 → **View** 設為 **Report** (詳細資訊)
  3. 設定 ID (如 IDC_LISTVIEW)
  4. 可勾選 Full Row Select、Grid Lines 增強可讀性

VS 專案相依性圖表功能

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

欄位插入:WM_INITDIALOG


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;
}

LVCOLUMN 關鍵成員

成員用途
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"超人之鄉"}
};

新增按鈕處理:WM_COMMAND


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移除所有項目,保留欄位定義

執行結果

進階擴充方向

  1. 圖示支援:LVIF_IMAGE + ImageList (見第 16 篇)
  2. 排序:ListView_SortItems + 自訂比較函式 PFNLVCOMPARE
  3. 編輯標籤:LVS_EDITLABELS 樣式 + LVN_BEGINLABELEDIT/ENDLABELEDIT
  4. 虛擬模式:LVS_OWNERDATA 大量資料 (百萬列) 按需回呼 LVN_GETDISPINFO
  5. 自訂繪製:NM_CUSTOMDRAW 階段式繪製控制

常見錯誤

  1. ListView_InsertColumn 索引重複或跳號 → 欄位順序錯亂
  2. LVITEM.iSubItem 未設為 0 就 InsertItem → 插入失敗
  3. 字串緩衝區壽命結束但 LVITEM.pszText 仍指向 → 顯示亂碼 (需 LVS_OWNERDATA 或複製字串)
  4. 未設定 LVCOLUMN.mask 包含 LVCF_SUBITEM → 子項對應失效
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved