前面一節中,雞啄米講了圖片控件Picture Control,本節為大家詳解列表視圖控件List Control的使用。

     列表視圖控件簡介

       列表視圖控件List Control同樣比較常見,它能夠把任何字符串內容以列表的方式顯示出來,這種顯示方式的特點是整潔、直觀,在實際應用中能為用戶帶來方便。

       列表視圖控件是對前面講到的列表框控件List Box的改進和延伸。列表視圖控件的列表項一般有圖標(Icon)和標簽(Label)兩部分。圖標是對列表項的圖形描述,標簽是文字描述。當然列表項可以只包含圖標也可以只包含標簽。

       列表視圖控件有4種風格:Icon、Small Icon、List和Report。下面簡單說下4種風格各自的特點:

       Icon大圖標風格:列表項的圖標通常為32×32像素,在圖標的下面顯示標簽。

       Small Icon小圖標風格:列表項的圖標通常為16×16像素,在圖標的右面顯示標簽。

       List列表風格:與小圖標風格類似,圖標和文字的對齊方式不同。

       Report報表風格:列表視圖控件可以包含一個列表頭來描述各列的含義。每行顯示一個列表項,通??梢园鄠€列表子項。最左邊的列表子項的標簽左邊可以添加一個圖標,而它右邊的所有子項則只能顯示文字。這種風格的列表視圖控件很適合做各種報表。

       列表視圖控件的通知消息

       雞啄米在VS2010/MFC編程入門之五(MFC消息映射機制概述)中的“各種Windows消息的消息處理函數”部分,就曾以列表視圖控件為例簡單講了WM_NOTIFY通知消息及其消息映射入口和消息處理函數的形式。如果你忘記了可以回到第五節看一看,回憶一下。

       雞啄米這里給出下一節中將要演示的列表視圖控件實例中,通知碼為NM_CLICK的通知消息的消息映射入口:

       ON_NOTIFY(NM_CLICK, IDC_PROGRAM_LANG_LIST, &CExample29Dlg::OnNMClickProgramLangList)

       還有消息處理函數自動生成時的形式:

C++代碼
  1. void CExample29Dlg::OnNMClickProgramLangList(NMHDR *pNMHDR, LRESULT *pResult)   
  2. {   
  3.     LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);   
  4.     // TODO: Add your control notification handler code here   
  5.     *pResult = 0;   
  6. }  

       我們看到,上面的代碼中將NMHDR指針類型的pNMHDR強制轉換為LPNMITEMACTIVATE類型的pNMItemActivate,那么我們就可以在函數中通過pNMHDR來訪問NMHDR結構,也可以通過pNMItemActive指針變量來訪問第一個元素為NMHDR結構體變量的擴充結構。

       當然列表視圖控件還有一些自己特有的通知消息,下面就介紹幾個其中比較常用的。

       LVN_ITEMCHANGING 和LVN_ITEMCHANGED:當列表視圖的狀態發生變化時,會發送這兩個通知消息。例如,當用戶選擇了新的列表項時,程序就會收到這兩個消息。
消息會附帶一個指向NMLISTVIEW 結構的指針,消息處理函數可從該結構中獲得狀態信息。兩個消息的不同之處在于,前者的消息處理函數如果返回TRUE,那么就阻
止選擇的改變,如果返回FALSE,則允許改變。

       LVN_KEYDOWN:該消息表明了一個鍵盤事件。消息會附帶一個指向NMLVKEYDOWN結構的指針,通過該結構程序可以獲得按鍵的信息。

       LVN_BEGINLABELEDIT 和LVN_ENDLABELEDIT:分別在用戶開始編輯和結束編輯標題時發送。消息會附帶一個指向NMLVDISPINFO結構的指針。在前者的消息處理函數中,可以調用GetEditControl成員函數返回一個指向用于編輯標題的編輯框的指針,如果處理函數返回FALSE,則允許編輯,如果返回TRUE,則禁止編輯。在后者的消息處理函數中,NMLVDISPINFO結構中的item.pszText指向編輯后的新標題,如果pszText 為NULL,那么說明用戶放棄了編輯,否則,程序應負責更新表項的標題,這可以由SetItem或SetItemText函數來完成。

VS2010/MFC編程入門之二十八(常用控件:列表視圖控件List Control 上)

       列表視圖控件的相關結構體

       下面我們來介紹一下與列表視圖控件有關的一些結構體。

       1. NMHDR結構體

C++代碼
  1. typedef struct tagNMHDR {   
  2.     HWND hwndFrom;     // 控件窗口的句柄   
  3.      UINT_PTR idFrom;   // 控件ID   
  4.     UINT code;         // 控件的通知消息碼   
  5. } NMHDR;  

        此結構體在很多情況下都是其他擴充結構體的第一個元素,比如上面的NMITEMACTIVATE結構體:

C++代碼
  1. typedef struct tagNMITEMACTIVATE {   
  2.     NMHDR hdr;   
  3.     int iItem;   
  4.     int iSubItem;   
  5.     UINT uNewState;   
  6.     UINT uOldState;   
  7.     UINT uChanged;   
  8.     POINT ptAction;   
  9.     LPARAM lParam;   
  10.     UINT uKeyFlags;   
  11. } NMITEMACTIVATE, *LPNMITEMACTIVATE;  

       2. LVITEM 結構體

       該結構體包含了列表視圖控件中列表項或列表子項的各種屬性。

C++代碼
  1. typedef struct _LVITEM {    
  2.     UINT mask;           // 掩碼位的組合(下面有對應掩碼的元素都已在括號中標出掩碼),表明哪些元素是有效的   
  3.     int iItem;           // 列表項的索引   
  4.     int iSubItem;        // 列表子項的索引   
  5.     UINT state;          // 狀態,下面會列出。(LVIF_STATE)   
  6.     UINT stateMask;      // 狀態掩碼,用來說明要獲取或設置哪些狀態。下面會列出   
  7.     LPTSTR pszText;      // 指向列表項或列表子項的標簽字符串。(LVIF_TEXT)   
  8.     int cchTextMax;      // pszText指向緩沖區的字符的個數,包括字符串結束符。(LVIF_TEXT)   
  9.     int iImage;          // 圖標的索引。(LVIF_IMAGE)   
  10.     LPARAM lParam;       // 32位的附加數據。(LVIF_PARAM)   
  11. #if (_WIN32_IE >= 0x0300)   
  12.     int iIndent;   
  13. #endif   
  14. #if (_WIN32_WINNT >= 0x501)   
  15.     int iGroupId;   
  16.     UINT cColumns; // tile view columns   
  17.     PUINT puColumns;   
  18. #endif   
  19. #if (_WIN32_WINNT >= 0x0600)   
  20.     int* piColFmt;   
  21.     int iGroup;   
  22. #endif   
  23. } LVITEM, *LPLVITEM;  

        下面是state和stateMask的取值及含義:

        狀態                     對應的狀態掩碼                   含義
        LVIS_CUT                     同左                 列表項或列表子項被選擇用來進行剪切和粘貼操作
        LVIS_DROPHILITED      同左                 列表項或列表子項成為拖動操作的目標
        LVIS_FOCUSED            同左                 列表項或列表子項具有輸入焦點
        LVIS_SELECTED           同左                 列表項或列表子項被選中

        3. LVCOLUMN結構體

        該結構體僅適用于Report報表式列表視圖控件。在向列表控件中插入一列時需要用到此結構體。它包含了列表控件某列的各種屬性。

C++代碼
  1. typedef struct _LVCOLUMN {    
  2.     UINT mask;              // 掩碼位的組合(下面有對應掩碼的元素都已在括號中標出掩碼),表明哪些元素是有效的   
  3.     int fmt;                    // 該列的表頭和列表子項的標簽正文顯示格式,可以是LVCFMT_CENTER、LVCFMT_LEFT或LVCFMT_RIGHT。(LVCF_FMT)   
  4.     int cx;                     // 以像素為單位的列的寬度。(LVCF_FMT)   
  5.     LPTSTR pszText;    // 指向列表頭標題正文的字符串。(LVCF_TEXT)   
  6.     int cchTextMax;     // pszText指向緩沖區的字符的個數,包括字符串結束符。(LVCF_TEXT)   
  7.     int iSubItem;          // 該列的索引。(LVCF_SUBITEM)   
  8. #if (_WIN32_IE >= 0x0300)   
  9.     int iImage;   
  10.     int iOrder;   
  11. #endif   
  12. #if (_WIN32_WINNT >= 0x0600)   
  13.     int cxMin;   
  14.     int cxDefault;   
  15.     int cxIdeal;   
  16. #endif   
  17. } LVCOLUMN, *LPLVCOLUMN;  

       4. NMLISTVIEW結構體

       該結構體存放了列表視圖控件通知消息的相關信息。列表視圖控件的大部分通知消息都會附帶指向該結構體的指針。

C++代碼
  1. typedef struct tagNMLISTVIEW {   
  2.     NMHDR hdr;       // 標準的NMHDR 結構   
  3.      int iItem;       // 列表項的索引   
  4.      int iSubItem;    // 列表子項的索引   
  5.      UINT uNewState;  // 列表項或列表子項的新狀態   
  6.      UINT uOldState;  // 列表項或列表子項原來的狀態   
  7.      UINT uChanged;   // 取值與LVITEM的mask成員相同,用來表明哪些狀態發生了變化   
  8.      POINT ptAction;  // 事件發生時鼠標的客戶區坐標   
  9.      LPARAM lParam;   //32位的附加數據   
  10. } NMLISTVIEW, *LPNMLISTVIEW;  

       有關列表視圖控件的內容本節先講這些,下節繼續講列表控件類CListCtrl的一些成員函數和應用實例,歡迎繼續關注雞啄米的VS2010/MFC教程。

除非特別注明,雞啄米文章均為原創
轉載請標明本文地址:http://www.028keji.com/software/195.html
2012年6月30日
作者:雞啄米 分類:軟件開發 瀏覽: 評論:18