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

Win32 開發入門(16):ListView 多視圖切換 - 圖示、列表、詳細、平鋪模式動態轉換

     編輯:關於C++

ListView 支援五種檢視模式,透過 ListView_SetView 動態切換。本文實作 ComboBox 選擇模式、ImageList 圖示管理、多視圖同步顯示完整範例。

五種檢視模式常數

常數模式特徵
LV_VIEW_DETAILS詳細資訊多欄表格、可排序、標準報表檢視
LV_VIEW_ICON大圖示32x32 圖示、自由排列、適合圖片預覽
LV_VIEW_SMALLICON小圖示16x16 圖示、列表式、緊湊
LV_VIEW_LIST列表單欄、垂直排列、無圖示 (或小圖示)
LV_VIEW_TILE平鋪大圖示+多行文字、XP 引入、適合詳細預覽

圖示管理:ImageList 建立與關聯


// 建立大/小圖示 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);    // 小圖示/列表/詳細

ComboBox 動態切換檢視


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

執行結果

關鍵技巧總結

  1. ImageList 尺寸固定:單一 ImageList 所有圖示必須同尺寸,故大/小圖示需分開建立。
  2. LVSIL_NORMAL/SMALL:分別對應 LV_VIEW_ICON 與其他模式使用的圖示。
  3. 圖示索引:LVITEM.iImage 指定 ImageList 索引,-1 表示無圖示。
  4. 視圖切換即時生效:ListView_SetView 無需重建項目,保留所有資料與選取狀態。
  5. 平鋪模式:需 LVS_EX_DOUBLEBUFFER 減少閃爍,且項目需設定 LVITEM.lParam 或子項提供多行文字。

現代替代:WPF/WinUI ListView

  • 資料繫結 (ItemsSource) + DataTemplate 定義視覺樹
  • View 屬性切換 GridView/ListView/WrapPanel 等
  • 虛擬化面板 (VirtualizingPanel) 自動處理大量資料效能
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved