程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Win32開發入門(15):ListView控件

Win32開發入門(15):ListView控件

編輯:關於C++

這個控件其實不用阿拉來介紹,因為它太常見了,就好像我們一出門就會看到妹子一樣常見。當然 也可以說,它是對ListBox的擴充。

在使用該控件之前,我先介紹VS的一個相當好玩的功能。

在代碼文件的#include指令上右擊,從彈出的菜單中選擇“生成包含文件關系圖”,如下圖:

然後你喝一口咖啡,你會看到這樣的東西:

這個關系圖,演示了你的項目中的頭文件,源文件以及外部引用文件之間的關系。把鼠標移到上面 ,滾動滑輪,可以縮放大小。把鼠標移到“外部”節點上,點擊左邊的向下箭頭,可以看到本項目與外 部頭文件的關系。

所以,如果你的程序比較復雜,頭文件眾多,不妨試試這功能。

下面我們來使用ListView來顯示一組數據,我定義了一個結構體:

// 用於測試的結構體  

   
struct STUDENTINFO     
{     
    WCHAR Name[15];     
    WCHAR Age[3];     
    WCHAR Address[50];     
};

假設它代表了一位學員的信息——姓名、年齡、地址。

我們要用ListView來顯示一 些學員的信息,顯然,每一個學員信息都有三個字段,ListView有多種視圖,如圖:

列表小圖 標

大圖標

平鋪

詳細視圖

我們要顯示多個字段,故應選擇最後一種視圖。

好,下面我們就做一個練習,實例是 檢驗學習成果的唯一標准。

1、新建一個對話框資源,在設計器中拖一個List Control和兩個 Button,List Control其實就是ListView控件。

設置View屬性為Report。

2、在對話框消息處理函數中,處理WM_INITDIALOG消息,向ListView添加列。

case 

WM_INITDIALOG:     
    // 獲取ListView控件的句柄     
    hListview = GetDlgItem(hDlg, IDC_LV);     
    // 設置ListView的列     
    LVCOLUMN vcl;     
    vcl.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;     
    // 第一列     
    vcl.pszText = L"姓名";//列標題     
    vcl.cx = 90;//列寬     
    vcl.iSubItem = 0;//子項索引,第一列無子項     
    ListView_InsertColumn(hListview, 0, &vcl);     
    // 第二列     
    vcl.pszText = L"年齡";     
    vcl.cx = 90;     
    vcl.iSubItem = 1;//子項索引     
    ListView_InsertColumn(hListview, 1, &vcl);     
    // 第三列     
    vcl.pszText = L"地址";     
    vcl.cx = 200;     
    vcl.iSubItem = 2;     
    ListView_InsertColumn(hListview, 2, &vcl);     
    return 0;

向LV添加列,調用ListView_InsertColumn宏,注意它是宏不是函數(你也可 以發送LVM_INSERTCOLUMN消息),其中有一個參數是指向LVCOLUMN結構體的指針,關於這個結構體的成 員我就不說了,有興趣的看MSDN。

這樣,LV控件就有了三個列了,就像這樣。

3、另外兩個按鈕, 一個用來向LV中添加項,後一個是清除所有項。

還記得吧,要響 應按鈕單擊,要處理WM_COMMAND消息,然後通過wParam參數的低字節位來判斷用戶點擊了哪個按鈕,指 示了對應按鈕的ID。

case WM_COMMAND:     
    if (LOWORD(wParam) == IDC_BTNADD)     
    {     
        STUDENTINFO stu[ ] = {     
            { L"小劉", L"20", L"火星" },     
            { L"老趙", L"21", L"木星" },     
            { L"小胡", L"30", L"水星" },     
            { L"老高", L"32", L"山溝一號" },     
            { L"黃牛", L"24", L"不知哪個星球來的" },     
            { L"王七", L"28", L"超人之鄉" }     
        };     
                 
        //求出數組中元素的個數     
        int arrCount = (int)(sizeof(stu) / sizeof(stu[0]));     
        LVITEM vitem;     
        vitem.mask = LVIF_TEXT;     
        for (int i = 0; i < arrCount; i++)     
        {     
            /*    
                策略:    
                先添加項再設置子項內容    
            */ 
            vitem.pszText = stu[i].Name;     
            vitem.iItem = i;     
            vitem.iSubItem = 0;     
            ListView_InsertItem(hListview, &vitem);     
            // 設置子項     
            vitem.iSubItem = 1;     
            vitem.pszText = stu[i].Age;     
            ListView_SetItem( hListview, &vitem);     
            vitem.iSubItem = 2;     
            vitem.pszText = stu[i].Address;     
            ListView_SetItem(hListview, &vitem);     
        }     
    }     
    else if(LOWORD(wParam) == IDC_BTNCLEAR)     
    {     
        // 清除ListView中的所有項     
        ListView_DeleteAllItems(hListview);     
    }     
    return 0;

首先,為了在LV中加入數據,聲明了一個STUDENT數組,STUDENT結構體在前面 定義的,表示一位學員的信息。由於這個數組在聲明的時候,並沒有指定元素個數,在後面執行for循 環添加項之前,先要知道數組中有多少個元素。

方法是用sizeof運算符取出整個數組的字節長 度,然後除以第一個元素的長度,這樣就求出元素的個數了。

向LV添加項,調用 ListView_InsertItem宏,注意添加方法,要先添加項,隨後再用ListView_SetItem宏來設置子項的內 容。由於兩個宏使用相同的參數,所以在循環前,我們都用一個LVITEM,在循環中我們只改變它的項索 引值和文本內容再傳到ListView_InsertItem宏或ListView_SetItem宏,這樣也免得多次分配內存數據 。

清除LV中的所有項,直接用ListView_DeleteAllItems宏就可以了。

以上操作也可以 通過發送對應消息來完成,不過,直接調用宏似乎比SendMessage方便。

最後,看一下最終結果 。

由於這個例子相對有些復雜,稍後我把代碼上傳到[資源]中。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved