VS2013/MFC程式設計入門之二十七(常用控制元件:列表檢視控制元件List 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報表風格:列表檢視控制元件可以包含一個列表頭來描述各列的含義。每行顯示一個列表項,通常可以包含多個列表子項。最左邊的列表子項的標籤左邊可以新增一個圖示,而它右邊的所有子項則只能顯示文字。這種風格的列表檢視控制元件很適合做各種報表。
列表檢視控制元件的通知訊息
在
本教程在這裡給出下一節中將要演示的列表檢視控制元件例項中,通知碼為NM_CLICK的通知訊息的訊息對映入口:
ON_NOTIFY(NM_CLICK, IDC_PROGRAM_LANG_LIST, &CExample28Dlg::OnNMClickProgramLangList)
還有訊息處理函式自動生成時的形式:
- void CExample28Dlg::OnNMClickProgramLangList(NMHDR *pNMHDR, LRESULT *pResult)
- {
- LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
- // TODO: Add your control notification handler code here
- *pResult = 0;
- }
我們看到,上面的程式碼中將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函式來完成。
列表檢視控制元件的相關結構體
下面我們來介紹一下與列表檢視控制元件有關的一些結構體。
1. NMHDR結構體
C++程式碼- typedefstruct tagNMHDR {
- HWND hwndFrom; // 控制元件視窗的控制代碼
- UINT_PTR idFrom; // 控制元件ID
- UINT code; // 控制元件的通知訊息碼
- } NMHDR;
此結構體在很多情況下都是其他擴充結構體的第一個元素,比如上面的NMITEMACTIVATE結構體:
C++程式碼- typedefstruct tagNMITEMACTIVATE {
- NMHDR hdr;
- int iItem;
- int iSubItem;
- UINT uNewState;
- UINT uOldState;
- UINT uChanged;
- POINT ptAction;
- LPARAM lParam;
- UINT uKeyFlags;
- } NMITEMACTIVATE, *LPNMITEMACTIVATE;
2. LVITEM 結構體
該結構體包含了列表檢視控制元件中列表項或列表子項的各種屬性。
C++程式碼- typedefstruct _LVITEM {
- UINT mask; // 掩碼位的組合(下面有對應掩碼的元素都已在括號中標出掩碼),表明哪些元素是有效的
- int iItem; // 列表項的索引
- int iSubItem; // 列表子項的索引
- UINT state; // 狀態,下面會列出。(LVIF_STATE)
- UINT stateMask; // 狀態掩碼,用來說明要獲取或設定哪些狀態。下面會列出
- LPTSTR pszText; // 指向列表項或列表子項的標籤字串。(LVIF_TEXT)
- int cchTextMax; // pszText指向緩衝區的字元的個數,包括字串結束符。(LVIF_TEXT)
- int iImage; // 圖示的索引。(LVIF_IMAGE)
- LPARAM lParam; // 32位的附加資料。(LVIF_PARAM)
- #if (_WIN32_IE >= 0x0300)
- int iIndent;
- #endif
- #if (_WIN32_WINNT >= 0x501)
- int iGroupId;
- UINT cColumns; // tile view columns
- PUINT puColumns;
- #endif
- #if (_WIN32_WINNT >= 0x0600)
- int* piColFmt;
- int iGroup;
- #endif
- } LVITEM, *LPLVITEM;
下面是state和stateMask的取值及含義:
狀態 對應的狀態掩碼 含義
LVIS_CUT 同左 列表項或列表子項被選擇用來進行剪下和貼上操作
LVIS_DROPHILITED 同左 列表項或列表子項成為拖動操作的目標
LVIS_FOCUSED 同左 列表項或列表子項具有輸入焦點
LVIS_SELECTED 同左 列表項或列表子項被選中
3. LVCOLUMN結構體
該結構體僅適用於Report報表式列表檢視控制元件。在向列表控制元件中插入一列時需要用到此結構體。它包含了列表控制元件某列的各種屬性。
C++程式碼- typedefstruct _LVCOLUMN {
- UINT mask; // 掩碼位的組合(下面有對應掩碼的元素都已在括號中標出掩碼),表明哪些元素是有效的
- int fmt; // 該列的表頭和列表子項的標籤正文顯示格式,可以是LVCFMT_CENTER、LVCFMT_LEFT或LVCFMT_RIGHT。(LVCF_FMT)
- int cx; // 以畫素為單位的列的寬度。(LVCF_FMT)
- LPTSTR pszText; // 指向列表頭標題正文的字串。(LVCF_TEXT)
- int cchTextMax; // pszText指向緩衝區的字元的個數,包括字串結束符。(LVCF_TEXT)
- int iSubItem; // 該列的索引。(LVCF_SUBITEM)
- #if (_WIN32_IE >= 0x0300)
- int iImage;
- int iOrder;
- #endif
- #if (_WIN32_WINNT >= 0x0600)
- int cxMin;
- int cxDefault;
- int cxIdeal;
- #endif
- } LVCOLUMN, *LPLVCOLUMN;
4. NMLISTVIEW結構體
該結構體存放了列表檢視控制元件通知訊息的相關資訊。列表檢視控制元件的大部分通知訊息都會附帶指向該結構體的指標。
C++程式碼- typedefstruct tagNMLISTVIEW {
- NMHDR hdr; // 標準的NMHDR 結構
- int iItem; // 列表項的索引
- int iSubItem; // 列表子項的索引
- UINT uNewState; // 列表項或列表子項的新狀態
- UINT uOldState; // 列表項或列表子項原來的狀態
- UINT uChanged; // 取值與LVITEM的mask成員相同,用來表明哪些狀態發生了變化
- POINT ptAction; // 事件發生時滑鼠的客戶區座標
- LPARAM lParam; //32位的附加資料
- } NMLISTVIEW, *LPNMLISTVIEW;
有關列表檢視控制元件的內容本節先講這些,下節繼續講列表控制元件類CListCtrl的一些成員函式和應用例項,歡迎繼續關注VS2013/MFC教程。
相關推薦
VS2013/MFC程式設計入門之二十七(常用控制元件:列表檢視控制元件List Control 上)
本節為大家詳解列表檢視控制元件List Control的使用。 列表檢視控制元件簡介 列表檢視控制元件List Control同樣比較常見,它能夠把任何字串內容以列表的方式顯示出來,這種顯示方式的特點是整潔、直觀,在實際應用中能為使
VS2013/MFC程式設計入門之二十六(常用控制元件:圖片控制元件Picture Control)
本節主要講一種簡單實用的控制元件,圖片控制元件Picture Control。通過使用圖片控制元件我們可以在介面某個位置顯示圖片以美化介面。 圖片控制元件簡介 圖片控制元件和前面講到的靜態文字框都是靜態文字控制元件,因此兩者的使用方法有很多
VS2013/MFC程式設計入門之二十四(常用控制元件:組合框控制元件Combo Box)
上一節講了列表框控制元件ListBox的使用,本節主要講解組合框控制元件Combo Box。組合框同樣相當常見,例如,在Windows系統的控制面板上設定語言或位置時,有很多選項,用來進行選擇的控制元件就是組合框控制元件。 組合框控制元件簡介
VS2013/MFC程式設計入門之三十一(常用控制元件:標籤控制元件Tab Control )
前面兩節講了樹形控制元件Tree Control,本節開始講解標籤控制元件Tab Control,也可以稱為選項卡控制元件。 標籤控制元件簡介 標籤控制元件也比較常見。它可以把多個頁面整合到一個視窗中,每個頁面對應一個標籤,使用者點選某個標
VS2013/MFC程式設計入門之三十二(選單:VS2013選單資源詳解)
前面我們已經講完了所有的常用控制元件,本節開始為大家講解選單的概念及使用。 選單簡介 選單可以分為下拉式選單和彈出式選單。 下拉式選單一般在視窗標題欄下面顯示,大家還記得我們在VS2013/MFC程式設計入門之一(利用MFC
VS2013/MFC程式設計入門之二十三(常用控制元件:列表框控制元件ListBox)
前面兩節講了比較常用的按鈕控制元件,並通過按鈕控制元件例項說明了具體用法。本文要講的是列表框控制元件(ListBox)及其使用例項。 列表框控制元件簡介 列表框給出了一個選項清單,允許使用者從中進行單項或多項選擇,被選中的項會高亮顯示。列表
VS2013/MFC程式設計入門之十二(對話方塊:屬性頁對話方塊及相關類的介紹)
本節開始講一種特殊的對話方塊--屬性頁對話方塊。 屬性頁對話方塊的分類 屬性頁對話方塊想必大家並不陌生,XP系統中桌面右鍵點屬性,彈出的就是屬性頁對話方塊,它通過標籤切換各個頁面。另外,我們在建立MFC工程時使用的嚮導對話方塊也屬於屬性頁對
VS2013/MFC程式設計入門之七(對話方塊:建立對話方塊類和新增控制元件變數)
前兩講中為大家講解了如何建立對話方塊資源。建立好對話方塊資源後要做的就是生成對話方塊類了。再宣告下,生成對話方塊類主要包括新建對話方塊類、新增控制元件變數和控制元件的訊息處理函式等。 因為給大家的例程Addition是基於對話方塊的程式,所以程式自動建立了
VS2013/MFC程式設計入門之十九(常用控制元件:靜態文字框)
從本節開始講解各種常用控制元件的用法。MFC中常用控制元件主要包括:靜態文字框、編輯框、單選按鈕、複選框、分組框、列表框、組合框、圖片控制元件、列表控制元件、樹形控制元件和進度條控制元件等等。本節先來講解靜態文字框的使用。 控制元件的通知訊息
VS2013/MFC程式設計入門之十六(對話方塊:檔案對話方塊)
上一講介紹的是訊息對話方塊,本節講解檔案對話方塊。 檔案對話方塊的分類 檔案對話方塊分為開啟檔案對話方塊和儲存檔案對話方塊,相信大家在Windows系統中經常見到這兩種檔案對話方塊。例如,很多編輯軟體像記事本等都有“開啟”選項,選擇“開啟”後會彈出一個對
VS2013/MFC程式設計入門之十五(對話方塊:訊息對話方塊)
本節講解Windows系統中最常用最簡單的一類對話方塊--訊息對話方塊。 我們在使用Windows系統的過程中經常會見到訊息對話方塊,提示我們有異常發生或提出詢問等。因為在軟體開發中經常用到訊息對話方塊,所以MFC提供了兩個函式可以直接生成指
VS2013/MFC程式設計入門之十一(對話方塊:非模態對話方塊的建立及顯示)
上一節講了模態對話方塊及其彈出過程,本節接著講另一種對話方塊--非模態對話方塊的建立及顯示。 前面已經說過,非模態對話方塊顯示後,程式其他視窗仍能正常執行,可以響應使用者輸入,還可以相互切換。本文中將上一講中建立的Tip模態對話方塊改為非模態對話方塊,讓
Java併發程式設計系列之二十七:ThreadLocal
ThreadLocal簡介 ThreadLocal翻譯過來就是執行緒本地變數,初學者可能以為ThreadLocal是指一個Thread,其實說白了,ThreadLocal就是一個成員變數,只不過這是一個特殊的變數——變數值總是與當前執行緒(呼叫Thread.c
VS2013/MFC程式設計入門之六(對話方塊:為對話方塊新增控制元件)
建立對話方塊資源需要建立對話方塊模板、修改對話方塊屬性、為對話方塊新增各種控制元件等步驟,前面一講中已經講了建立對話方塊模板和修改對話方塊屬性,本節繼續講如何為對話方塊新增控制元件。 上一講中建立了一個名為“Addition”的工程,目的是生成一個實現加法
VS2013/MFC程式設計入門之三(MFC應用程式框架分析)
上一講講的是VS2013應用程式工程中檔案的組成結構。這一節就為大家分析下MFC應用程式框架的執行流程。 一.SDK應用程式與MFC應用程式執行過程的對比 程式執行都要有入口函式,在之前的C++教程中都是main函式,而Windows應
Java經典編程題50道之二十七
void ava prime static sqrt class i++ println mat 求100之內的素數。 public class Example27 { public static void main(String[] args) {
ElasticSearch學習筆記之二十七 Pipeline Aggregations
ElasticSearch學習筆記之二十七 Pipeline Aggregations Pipeline Aggregations buckets_path 語法 Special Paths(特殊路徑) Dealing with dots
VS2010/MFC程式設計入門之四十三(MFC常用類:CTime類和CTimeSpan類)
轉載: http://www.jizhuomi.com/software/230.html 上一節中雞啄米講了MFC常用類CString類的用法,本節繼續講另外兩個MFC常用類-日期和時間類CTime類和CTimeSpan類。  
ElasticSearch學習筆記之二十七 Java REST Client
Java REST Client Java REST Client分為2種: Java Low Level REST Client: Elasticsearch官方 low-level client . 它允許你通過http和 Elasticsearch 叢
【Java併發程式設計】之二十:併發新特性—Lock鎖和條件變數(含程式碼)
簡單使用Lock鎖 Java 5中引入了新的鎖機制——java.util.concurrent.locks中的顯式的互斥鎖:Lock介面,它提供了比synchronized更加廣泛的鎖定操作。Lock介面有3個實現它的類:ReentrantLock、Reetrant