關於 List-View 控件
請參閱 虛擬 listview 控制項範例。
清單檢視控制項是顯示項目集合的視窗。 清單檢視控件提供數種方式來排列和顯示專案,而且比簡單 清單框更有彈性。 例如,每個項目的其他資訊可以顯示在圖示和標籤右邊的欄位中。
- List-View 樣式和檢視
- 虛擬 List-View 樣式
- List-View 工作區
- List-View 影像清單
- List-View 項目和子項目
- List-View 數據行
- List-View 卷動位置
- List-View 標籤編輯
- List-View 色彩
- 依群組排列清單專案
- 插入標記
List-View 樣式和檢視
清單檢視控制項可以在五個不同的檢視中顯示項目。 控制件的視窗樣式會指定預設檢視。 附加的窗口樣式會指定項目和控件特定功能的對齊方式。 下表描述視圖。
檢視名稱 | 描述 |
---|---|
圖示檢視 | 由 LVS_ICON 視窗樣式指定,或透過傳遞 LV_VIEW_ICON 參數,搭配 LVM_SETVIEW 訊息。 每個項目都會以完整大小的圖示顯示,其下方有標籤。 用戶可以將項目拖曳至清單檢視視窗中的任何位置。 |
小型圖示檢視 | 由 LVS_SMALLICON 視窗樣式指定,或透過 LVM_SETVIEW傳遞 LV_VIEW_SMALLICON。 每個項目都會以小型圖示顯示,其中標籤在右邊。 用戶可以將項目拖曳至任何位置。 |
清單檢視 | 由 LVS_LIST 視窗樣式指定,或者透過 LVM_SETVIEW傳遞 LV_VIEW_LIST。 每個項目都會以小型圖示的形式顯示,其右側有標籤。 項目排列在欄中,而且用戶無法將其拖曳至任意位置。 |
報表 (詳細數據) 檢視 | 由 LVS_REPORT 視窗樣式來指定,或由 LVM_SETVIEW傳遞 LV_VIEW_DETAILS 的方式進行指定。 每個項目都會以自己的行顯示,其中的資訊會排列在數據行中。 最左邊的欄一律靠左對齊,包含小圖示和標籤。 後續欄包含應用程式所指定的子專案。 除非您也指定 LVS_NOCOLUMNHEADER 視窗樣式,否則每個欄都有標頭。 |
磁貼檢視 | 第 6 版和更新版本。 透過傳遞 LV_VIEW_TILE 與 LVM_SETVIEW來指定。 每個項目會以完整大小的圖示顯示,旁邊有一行或多行的標籤。 |
下列螢幕快照會使用檢視來顯示每個七隻寵物的不同數量資訊。 此示範顯示資訊可能在 Windows Vista 上的顯示方式。 控制項的視覺化樣式已設定為 「Explorer」 主題,方法是使用 setWindowTheme 。
下列螢幕快照顯示詳細數據檢視。
下列螢幕快照顯示圖示檢視。
下列螢幕快照顯示清單檢視。
下列螢幕快照顯示磁磚視圖。
您可以在建立清單檢視控件之後變更檢視類型。 若要擷取和變更窗口樣式,請使用 getWindowLong 和 SetWindowLong 函式。 若要判斷目前檢視的窗口樣式,請使用 LVS_TYPEMASK 值。
您可以藉由指定 LVS_ALIGNTOP (預設) 或 LVS_ALIGNLEFT 視窗樣式,來控制項目在圖示或小型圖示檢視中的排列方式。
您可以在建立清單檢視控件之後變更對齊方式。 若要判斷目前的對齊方式,請使用 LVS_ALIGNMASK 值。
其他視窗樣式提供其他選項,例如使用者是否可以編輯標籤或一次選取多個專案。 如需完整清單,請參閱 List-View 視窗樣式。
擴充 List-View 樣式
擴充清單檢視控件樣式提供選項,例如複選框、平面滾動條、網格線和熱追蹤。 如需完整清單,請參閱 擴充 List-View 樣式。 您不會以與標準視窗樣式相同的方式存取擴充清單檢視樣式。 您不會使用 GetWindowLong 和 SetWindowLong 函式來進行擴充樣式變更。
有兩個訊息會設定和擷取擴充樣式資訊,LVM_SETEXTENDEDLISTVIEWSTYLE 和 LVM_GETEXTENDEDLISTVIEWSTYLE。 您可以使用下列對應的巨集 ListView_SetExtendedListViewStyle、ListView_SetExtendedListViewStyleEx和 ListView_GetExtendedListViewStyle,而不是明確傳送訊息。
虛擬 List-View 風格
虛擬清單檢視是具有 LVS_OWNERDATA 樣式的清單檢視控件。 此樣式可讓控制項處理數百萬個項目,因為擁有者承擔管理項目資料的責任。 這可讓您將虛擬清單檢視控件與大型資訊資料庫搭配使用,其中已有特定的數據存取方法。
虛擬清單檢視控件本身只維護很少的項目資訊。 除了項目選取和焦點資訊之外,控件的擁有者必須管理所有項目資訊。 其他進程會使用 LVN_GETDISPINFO 通知碼,向擁有者要求項目資訊。
由於這種類型的清單控件適用於大型數據集,因此建議您快取要求的項目數據,以改善擷取效能。 清單檢視提供可協助優化快取的快取提示機制。 提示是以 LVN_ODCACHEHINT 通知代碼的形式實作。
建立虛擬 List-View 控件
您可以使用 CreateWindow 或 CreateWindowEx 函式來建立虛擬清單檢視控件,並將 LVS_OWNERDATA 視窗樣式指定為 dwStyle 函式參數的一部分。 不支援動態切換至或從 LVS_OWNERDATA 樣式。
除了 LVS_SORTASCENDING 或 LVS_SORTDESCENDING 樣式以外,您可以使用 LVS_OWNERDATA 樣式與其他大多數視窗樣式搭配使用。 所有虛擬清單檢視控件預設為 LVS_AUTOARRANGE 樣式。
要將項目顯示在清單中,您必須先傳送 LVM_SETITEMCOUNT 訊息,這可以透過明確傳送或使用 ListView_SetItemCountEx 巨集來完成。
LVS_OWNERDATA 樣式不支援下列訊息:LVM_ENABLEGROUPVIEW、LVM_GETITEMTEXT、LVM_SETTILEINFO和 LVM_MAPIDTOINDEX。
相容性問題
所有四個清單檢視樣式—圖示、小型圖示、清單和報表檢視—都支援 LVS_OWNERDATA 樣式。 具有 LVS_OWNERDATA 樣式的清單檢視控件不會儲存任何專案特定資訊。 因此,您可套用至項目上的唯一有效項目狀態標誌是 LVIS_SELECTED 和 LVIS_FOCUSED。 不會儲存其他狀態資訊。 特別是清單檢視控制項不會保留每個項目的狀態或重疊影像。 不過,您可以藉由傳送一個 LVM_SETCALLBACKMASK 訊息給應用程式,來讓清單檢視控制項查詢您的應用程式以獲取這些圖像。
大部分的清單檢視控件訊息和相關聯的巨集都完全受到支援。 不過,當您使用 LVS_OWNERDATA 樣式時,某些訊息有限制或不受支援。 下表摘要說明受影響的訊息。
消息 | 限度 |
---|---|
LVM_ARRANGE | 不支援 LVA_SNAPTOGRID 樣式。 |
LVM_DELETEALLITEMS | 將專案計數設定為零,並清除所有內部選取變數,但實際上不會刪除任何專案。 它會發出通知回呼。 |
LVM_DELETEITEM | 僅支持選取完整性,而且不會實際刪除專案。 |
LVM_GETITEMSTATE | 只傳回焦點和選取狀態(也就是清單檢視控件所儲存的狀態)。 |
LVM_GETNEXTITEM | 不支援清單檢視搜尋準則 LVNI_CUT、LVNI_HIDDEN或 LVNI_DROPHILITED。 所有其他準則都得到支援。 |
LVM_GETWORKAREAS | 不支援 。 |
LVM_INSERTITEM | 僅支持選擇完整性。 |
LVM_SETITEM | 不支援 。 若要設定項目狀態,請使用 ListView_SetItemState 訊息。 |
LVM_SETITEMCOUNT | 設定清單中目前的項目數。 如果清單檢視控件傳送通知,要求任何項目的數據上限,則擁有者必須準備好提供該數據。 訊息參數支持虛擬清單檢視控件。 |
LVM_SETITEMPOSITION | 不支援 。 |
LVM_SETITEMSTATE | 只允許變更項目的選取和焦點狀態。 |
LVM_SETITEMTEXT | 不支援 。 應用程式必須負責維護項目文字。 |
LVM_SETWORKAREAS | 不支援 。 |
LVM_SORTITEMS | 不支援 。 應用程式有責任以所需的順序呈現項目。 |
處理虛擬 List-View 控件通知碼
具有 LVS_OWNERDATA 樣式的清單檢視控件會傳送與其他清單檢視控件相同的通知碼,以及另外兩個控件:LVN_ODCACHEHINT 和 LVN_ODFINDITEM。 以下是清單檢視控件與 LVS_OWNERDATA 樣式傳送的最常見通知。
通知 | 描述 |
---|---|
LVN_GETDISPINFO | 虛擬清單檢視控件會自行維護很少的項目資訊。 因此,它通常會傳送 LVN_GETDISPINFO 通知程式代碼來要求項目資訊。 此訊息的處理方式與標準列表控制元件中的回呼項目以相同方式進行。 因為控件所支援的項目數目可能非常大,因此快取項目數據可改善效能。 處理LVN_GETDISPINFO時,控件的擁有者會先嘗試從快取提供要求的項目資訊(如需詳細資訊,請參閱 快取管理)。 如果請求的項目未被快取,擁有者必須準備通過其他方式提供資料。 |
LVN_ODCACHEHINT | 虛擬清單檢視會傳送 LVN_ODCACHEHINT 通知碼,以協助優化快取。 通知程式代碼會為建議快取的專案範圍提供內含索引值。 收到通知碼時,擁有者必須準備好載入快取,其中包含所請求範圍的項目資訊,以便在傳送 LVN_GETDISPINFO 訊息時能隨時取得資訊。 |
LVN_ODFINDITEM | 當控制項需要擁有者尋找特定回調項時,虛擬列表檢視控制項會傳送 LVN_ODFINDITEM 通知碼。 當清單檢視控件收到快速密鑰存取或收到 LVM_FINDITEM 訊息時,就會傳送通知碼。 搜尋資訊會以 LVFINDINFO 結構的形式傳送,這是 NMLVFINDITEM結構的成員。 擁有者需要準備好搜尋符合清單檢視控制項所提供資訊的項目。 如果成功,擁有者會傳回專案的索引,如果找不到相符的專案,則傳回 -1。 |
快取管理
具有 LVS_OWNERDATA 樣式的清單檢視控件會產生大量的 LVN_GETDISPINFO 通知碼,以及用來協助優化快取的 LVN_ODCACHEHINT 訊息。 LVN_ODCACHEHINT 訊息提供建議項目應納入快取的資訊。 這些訊息會以 WM_NOTIFY 訊息的形式傳送,且 lParam 值會做為 NMLVCACHEHINT 結構的位址。
NMLVCACHEHINT 結構包含兩個整數成員,iFrom 和 iTo,代表最可能需要之專案範圍的內含端點。 擁有人必須準備好將建議範圍內每個項目的項目資訊載入快取。
清單控制項通常需要第一個項目的資訊(偏移量0)。 LVN_ODCACHEHINT 通知碼可能不會總是包含項目 0,但它必須始終包含在快取中。
清單中最後幾個項目經常被存取。 因此,擁有者自己可能會想保留第二個快取,並包含清單結尾的項目。 從 LVN_ODCACHEHINT 的要求範圍可以針對終端快取進行檢查,使其可以自動化處理,以避免每次重新加載相同的終端範圍。
List-View 工作區
清單檢視控件支援工作區域,這是清單檢視控件用來排列其專案的矩形虛擬區域。 工作區不是視窗,而且不能有可見的框線。 根據預設,清單檢視控件沒有工作區域。 藉由建立工作區,您可以在項目的左方、上方或右方建立空白框線,或使水準滾動條在原本不會顯示的情況下顯示。
建立工作區時,位於工作區內的專案會成為工作區的成員。 同樣地,如果專案移至工作區域,專案就會成為該工作區域的成員。 如果項目不位於任何工作區域內,它會自動成為第一個 (索引 0) 工作區的成員。 若要將新專案放在特定工作區域內,您必須先建立專案,然後使用 LVM_SETITEMPOSITION 或 LVM_SETITEMPOSITION32 訊息將它移至所需的工作區域。
下圖是清單檢視控件的範例,其中包含四個工作區域,每個區域位於不同工作區的象限中。
多個工作區域可用於在一個檢視內建立不同的區域。 您可以在具有不同意義的單一檢視中建立區域。 例如,文件系統的檢視可能有讀取/寫入檔案的區域,以及唯讀檔案的另一個區域。 用戶可以將項目放在不同的工作區域中進行分類。 如果檔案移至唯讀的區域,就會自動變成唯讀。
多個工作區域可以相互交集,但位於交集內的任何項目會成為索引較低區域的成員。因此,最好避免這種情況。 在排序多個工作區域時,項目會與同一工作區域中的其他項目進行比較排序。
可以使用 LVM_GETNUMBEROFWORKAREAS 訊息來擷取工作區域數目。 工作區域會隨著 LVM_SETWORKAREAS 訊息變更,而且可以使用 LVM_GETWORKAREAS 訊息來擷取。 這兩個訊息都會採用 reCT結構陣列的位址,做為 lParam,以及 RECT 結構的數目作為 wParam 。 這些結構的左 和上 成員會指定工作區左上角(原點)的座標,而右 和下 成員會指定工作區的右下角座標。 所有座標都位於清單檢視的用戶端座標中。 允許的工作區域數目上限是由 LV_MAX_WORKAREAS 值所定義。
變更工作區不會影響具有 LVS_LIST 或 LVS_REPORT 檢視的清單檢視控件,但工作區域會在檢視類型變更時維持。 使用 LVS_ICON 和 LVS_SMALLICON 檢視,即可修改工作區以變更項目顯示的方式。 使工作區的寬度(右-左)大於控制項的用戶端寬度,會使項目以該寬度折行,並顯示水平滾動條。 使工作區的寬度小於控件工作區的寬度,會使專案包裝在工作區域內,而不是工作區。 將左 或 頂端 成員設定為正值,會導致項目從工作區域開始顯示,從而在控制項的邊緣與項目之間產生一個空白空間。 您也可以在控件的右邊緣與項目之間建立空白空間,方法是讓工作區的寬度小於控件的用戶端寬度。
List-View 影像清單
根據預設,清單檢視控件不會顯示專案影像。 若要顯示專案影像,您必須建立影像清單,並將其與 控件產生關聯。 清單檢視控制項可以有三個影像清單:
- 影像清單,其中包含控件處於圖示檢視時所顯示的完整大小圖示。
- 圖像清單,包含當控制元件處於小型圖示檢視、清單檢視或報表檢視時顯示的小型圖示。
- 包含狀態圖片的影像清單,顯示於完整大小或小型圖示的左側。 您可以使用狀態影像,例如已核取和已清除的複選框,來指出應用程式定義的項目狀態。 狀態影像會顯示在圖示檢視、小型圖示檢視、清單檢視和報表檢視中。
完整大小和小型圖示影像清單也可以包含 重疊影像,其設計目的是要以透明的方式繪製在項目圖示上。
若要在清單檢視控件中使用重疊影像:
- 透過呼叫 ImageList_SetOverlayImage 函式,可以將重疊影像索引指派給完整大小和小型圖示影像清單中的影像。 重疊影像是由一個以單一為基礎的索引來識別。
- 當您呼叫 ListView_InsertItem 或 ListView_SetItem 巨集時,可以將重疊影像索引與項目產生關聯。 使用 INDEXTOOVERLAYMASK 巨集,即可在專案的 LVITEM 結構 成員 狀態中指定重疊影像索引。 您還必須在 stateMask 成員中設定 LVIS_OVERLAYMASK 這些位元。
如果指定狀態影像清單,清單檢視控件會保留狀態影像每個項目圖示左邊的空間。
若要將狀態影像與項目產生關聯,請使用 INDEXTOSTATEIMAGEMASK 巨集,在 LVITEM 結構的 成員中的 狀態指定狀態影像索引。 索引會識別控件狀態映像清單中的影像。 雖然影像清單索引是以零起始,但控件會使用單一式索引來識別狀態影像。 狀態影像索引為零,表示項目沒有狀態影像。
根據預設,當清單檢視控件終結時,它會終結指派給它的影像清單。 不過,如果清單檢視控件具有 LVS_SHAREIMAGELISTS 視窗樣式,應用程式會負責在影像清單不再使用時終結影像清單。 如果您將相同的影像清單指派給多個清單檢視控件,則應該指定此樣式;否則,多個控件可能會嘗試終結相同的映像清單。
List-View 項目和子項目
清單檢視控件中的每個專案都有圖示、標籤、目前狀態,以及應用程式定義的值。 藉由使用清單檢視訊息,您可以新增、修改和刪除專案,以及擷取專案的相關信息。
每個項目可以有一個或多個 子項目。 子項目是一個字串,在報表檢視中顯示在與項目圖示和標籤分開的欄中。 若要指定子專案的文字,請使用 LVM_SETITEMTEXT 或 LVM_SETITEM 訊息。 清單檢視控件中的所有專案都有相同的子項目數目。 子項目數目取決於清單檢視控件中的數據行數目。 當您將欄位加入清單檢視控制項時,您可以指定其相關聯的子項索引。
LVITEM 結構會定義清單檢視專案或子專案。 iItem 成員是項目從零開始的索引。 iSubItem 成員是子專案的單一索引,如果結構包含專案的相關信息,則為零。 其他成員會指定專案的文字、圖示、狀態和項目數據。 項目資料 是與清單檢視項目相關聯的應用程式定義的值。
若要將專案新增至清單檢視控件,請使用 LVM_INSERTITEM 訊息,指定 LVITEM 結構的位址。 在新增多個項目之前,您可以傳送給控制項 LVM_SETITEMCOUNT 訊息,指定控制項最終將包含的項目數量。 此訊息可讓清單檢視控件只重新配置其內部數據結構一次,而不是每次新增專案時。 您可以使用 LVM_GETITEMCOUNT 訊息來判斷清單檢視控制項中的項目數目。 如果您要將大量專案新增至清單檢視控制項,您可以在新增專案前停用重新繪製,然後在新增專案後重新啟用繪製,以加快此過程。 使用 WM_SETREDRAW 訊息來啟用和停用重繪。
若要變更清單檢視項目的屬性,請使用 LVM_SETITEM 訊息,指定 LVITEM 結構的位址。 此結構的 遮罩 成員指定要變更的項目屬性。 例如,若只要變更項目或子項目的文字,請使用 LVM_SETITEMTEXT 訊息。
若要檢索清單檢視專案的資訊,請使用 LVM_GETITEM 訊息,並指定要填入的 LVITEM 結構的位址。 這個結構的 遮罩 成員會指定要擷取的項目屬性。 若要只擷取專案或子專案的文字,請使用 LVM_GETITEMTEXT 訊息。
若要刪除清單檢視項目,請使用 LVM_DELETEITEM 訊息。 您可以使用 LVM_DELETEALLITEMS 訊息,刪除清單檢視控件中的所有專案。
List-View 項目狀態
專案的狀態是指定專案可用性、指出用戶動作或反映項目狀態的值。 清單檢視控件會變更一些狀態位,例如當用戶選取專案時。 應用程式可能會變更其他狀態位來停用或隱藏專案,或指定重疊影像或狀態影像。 如需重疊影像和狀態影像的詳細資訊,請參閱 List-View 影像清單。
項目的狀態是由 LVITEM 結構 成員 狀態所指定。 當您指定或變更項目的狀態時,stateMask 成員會指定您需要變更的狀態位。 您可以使用 LVM_SETITEMSTATE 訊息來變更項目的狀態。 您可以在建立專案時,或使用 LVM_SETITEM 訊息來變更其屬性時指定其狀態。 若要判斷專案的目前狀態,請使用 LVM_GETITEMSTATE 或 LVM_GETITEM 訊息。
若要設定專案的重疊影像,stateMask 成員的 LVITEM 結構必須包含 LVIS_OVERLAYMASK 值,而 state 成員必須包含重疊影像的一個基底索引,此索引需使用 INDEXTOOVERLAYMASK 巨集向左位移 8 位元。 索引可以是零,以指定沒有重疊影像。
若要設定專案的狀態影像,stateMaskLVITEM 結構的成員必須包含 LVIS_STATEIMAGEMASK 值,而 狀態 成員必須使用 INDEXTOSTATEIMAGEMASK 巨集,將狀態影像的一個起始索引左移 12 位。 索引可以是零,以指定沒有狀態影像。
回調項目和回調遮罩
針對每個項目,清單檢視控制通常會儲存標籤文字、項目圖示的影像清單索引,以及項目狀態的一組位元旗標。 您可以定義回呼項目或變更控制項的回呼掩碼,以表明應用程式而非控制項會儲存部分或全部的資訊。 如果您的應用程式儲存其中一些資訊,您可能會想要使用回調函數。
清單檢視控件中 回呼專案是應用程式儲存文字或圖示索引的專案,或是兩者。 當您將 LVM_INSERTITEM 訊息傳送至清單檢視控制項時,可以定義回呼項目。 如果應用程式儲存專案或子項目的文字,請將專案的 LVITEM 結構 成員 pszText 設定為 LPSTR_TEXTCALLBACK。 如果應用程式儲存項目的圖示索引,請將專案的 LVITEM 結構 iImage 成員設定為 I_IMAGECALLBACK。
清單檢視控制項的 回呼遮罩 是一組位元旗幟,用來指定由應用程式而非控制項儲存目前資料的項目狀態。 回呼遮罩會套用至控制項的所有項目,不同於回呼項目指定,它只套用至特定項目。 回呼遮罩預設為零,這表示清單檢視控件會儲存所有項目狀態資訊。 建立清單檢視控件並初始化其項目之後,您可以傳送 LVM_SETCALLBACKMASK 訊息來變更回呼遮罩。 若要擷取目前的回呼遮罩,請傳送 LVM_GETCALLBACKMASK 訊息。
當清單視圖控制項必須顯示或排序應用程式儲存其回呼資訊的清單視圖項目時,控制項將 LVN_GETDISPINFO 通知代碼傳送至控制項的父視窗。 此訊息會指定 NMLVDISPINFO 結構,其中包含所需的信息類型,並識別要擷取的專案或子專案。 父窗口必須處理LVN_GETDISPINFO以提供要求的數據。
如果清單檢視控件偵測到專案回呼資訊的變更,例如文字、圖示或狀態資訊的變更,控件就會傳送 LVN_SETDISPINFO 通知碼,通知您變更。
如果您變更回呼項目的屬性或狀態位,您可以使用 LVM_UPDATE 訊息,以強制控件重繪項目。 如果控件具有 LVS_AUTOARRANGE 樣式,此訊息也會讓控件排列其專案。 您可以使用 LVM_REDRAWITEMS 訊息來重新繪製項目範圍,方法是將清單檢視控制項的對應部分標記為無效。
藉由有效地使用回調項目和回調遮罩,您可以確保每個項目屬性都能在一個地方統一維護。 這樣做可以簡化您的應用程式,但所能節省的記憶體空間僅限於原本用來儲存專案標籤和子專案文字的部分。
List-View 專案位置
每個清單檢視專案都有一個位置和大小,您可以使用訊息來擷取和設定。 您也可以判斷是否有項目位於指定的位置。 清單檢視項目的位置會被指定在 檢視座標中,這些座標是由捲動位置所位移的用戶端座標。
若要擷取和設定專案的位置,請使用 LVM_GETITEMPOSITION 和 LVM_SETITEMPOSITION 訊息。 LVM_GETITEMPOSITION 適用於所有檢視,但 LVM_SETITEMPOSITION 僅適用於圖示和小型圖示檢視。
您可以使用 LVM_HITTEST 訊息,來判斷特定位置上是否有任何項目。
若要擷取清單專案的邊界矩形,或只擷取其圖示或標籤的邊界矩形,請使用 LVM_GETITEMRECT 訊息。
排列、排序和尋找項目
您可以使用清單檢視訊息來排列和排序專案,並根據項目的屬性或位置尋找專案。 重新排列項目以對齊到網格上,但項目的索引不會改變。 排序會變更項目順序(及其對應的索引),然後據以重新置放。 您只能在圖示和小型圖示檢視中排列專案,但您可以在任何檢視中排序專案。 若要尋找專案,您可以傳送指定專案位置或屬性的清單檢視訊息。
若要排列專案,請使用 LVM_ARRANGE 訊息。 您可以指定 LVS_AUTOARRANGE 視窗樣式,以確保項目始終自動排列。
若要排序專案,請使用 LVM_SORTITEMS 訊息。 當您使用此訊息排序時,您會指定清單檢視控件呼叫的應用程式定義回呼函式,以比較任兩個項目的相對順序。 控制會轉交給比較函式,將與這兩個項目各自相關聯的數據傳遞過去。 項目資料是在將其插入列表時,在專案 LVITEM 結構中的 lParam 成員中指定的值。 藉由指定適當的項目數據並提供適當的比較函式,您可以依其標籤、任何子專案或任何其他屬性來排序專案。 請注意,排序專案不會重新排序對應的子專案。 重新排序專案時,其對應的子專案會隨其一起攜帶;也就是說,整個數據列會一起保留。 若要將欄彼此分開排序,並將子項目從其項目中分離,您必須在排序後使用 LVM_SETITEM重新生成欄。
要確保列表檢視控制項始終排序,您可以指定 LVS_SORTASCENDING 或 LVS_SORTDESCENDING 的視窗樣式。 具有這些樣式的控制項會使用項目的標籤文字,以遞增或遞減順序排序。 使用這些視窗樣式時,您無法提供比較函式。 如果清單檢視控件具有下列其中一種樣式,且您嘗試插入項目的 pszText 成員為 LPSTR_TEXTCALLBACK 到其 LVITEM 結構時,LVM_INSERTITEM 訊息將會失敗。
您可以使用 LVM_FINDITEM 訊息,找到具有特定屬性的清單檢視專案。 您可以使用 LVM_GETNEXTITEM 訊息,找到處於指定狀態且與指定專案具有指定關聯性的清單檢視專案。 例如,您可以擷取指定項目右邊的下一個已選項目。
List-View 數據行
欄控制項目及其子項目在報表檢視中的顯示方式。 每個數據行都有標題和寬度,且與特定子項目相關聯;子專案零是專案的圖示和標籤。 數據行的屬性是由 LVCOLUMN 結構所定義。
若要將資料行新增至清單檢視控件,請使用 LVM_INSERTCOLUMN 訊息。 若要刪除資料行,請使用 LVM_DELETECOLUMN 訊息。
附註
只有在 ComCtl32.dll 第 6 版及更新版本中支持刪除清單檢視控件的欄零。 第 5 版也支援刪除第零列,但只有在您使用 CCM_SETVERSION 將版本設定到 5 或更新版本之後。 在 5.0 版本之前的版本不支援刪除第零欄。
您可以使用 LVM_GETCOLUMN 和 LVM_SETCOLUMN 訊息來擷取和變更現有數據行的屬性。 若要擷取或變更數據行的寬度,請使用 LVM_GETCOLUMNWIDTH 和 LVM_SETCOLUMNWIDTH 訊息。
除非指定 LVS_NOCOLUMNHEADER 視窗樣式,否則欄標頭會出現在報告視圖中。 使用者可以按一下欄位標題,導致 LVN_COLUMNCLICK 通知代碼傳送至父視窗。 一般而言,父視窗會在這個點擊發生時,依指定的欄位排序列表檢視控件。 使用者也可以拖曳標頭之間的數據行參考線,以調整數據行的大小。
清單檢視控制項可以顯示列標題旁的影像。 若要實作這項功能,請指定 LVCF_IMAGE 值,並將影像的索引指派給 LVCOLUMN 結構中的 iImage 成員。
清單檢視控件可以設定顯示數據行的順序。 若要實作這項功能,請指定 LVCF_ORDER 值,並將數據行順序指派給 LVCOLUMN 結構中的 iOrder 成員。 數據行順序是以零起始,並以從左至右的順序排列。 例如,零表示最左邊的數據行。
List-View 卷動位置
除非指定 LVS_NOSCROLL 視窗樣式,否則清單檢視控制項可以捲動,以顯示超出控制項客戶區可容納的項目數。 您可以擷取清單檢視控件的捲動位置和相關信息、依指定的數量卷動清單檢視控件,或捲動清單檢視控件,以便顯示指定的清單專案。
在圖示檢視或小型圖示檢視中,目前的捲動位置是由 檢視原點所定義。 檢視原點是相對於清單檢視控件可見區域,對應至檢視座標 (0, 0) 的座標集合。 若要擷取目前的檢視原點,請使用 LVM_GETORIGIN 訊息。 此訊息只應用於圖示或小型圖示檢視;它會在清單或報表檢視中傳回錯誤。
在清單或報表檢視中,目前的捲動位置是由 頂端索引所定義。 頂端索引是清單檢視控件中第一個可見專案的索引。 若要擷取目前的頂端索引,請使用 LVM_GETTOPINDEX 訊息。 此訊息只會在清單或報表檢視中傳回有效的結果;它會傳回圖示或小型圖示檢視中的零。
您可以使用 LVM_GETVIEWRECT 訊息來擷取清單檢視控制項中所有項目的邊界矩形,相對於控制項可見區域。
LVM_GETCOUNTPERPAGE 訊息會傳回符合清單檢視控件一頁的項目數。 此訊息只會在清單和報表檢視中傳回有效的結果;在圖示和小型圖示檢視中,它會傳回項目總數。
若要依特定數量卷動清單檢視控件,請使用 LVM_SCROLL 訊息。 使用 LVM_ENSUREVISIBLE 訊息,您可以視需要卷動清單檢視控件,以確保指定的項目可見。
List-View 標籤編輯
具有 LVS_EDITLABELS 視窗樣式的清單檢視控件可讓使用者就地編輯專案標籤。 用戶點擊焦點項目標籤來開始編輯。 或者,應用程式可以使用 LVM_EDITLABEL 訊息自動開始編輯。 清單檢視控件會在編輯開始時以及取消或完成時通知父視窗。 編輯完成時,父視窗會負責視需要更新專案的標籤。
標籤編輯開始時,會建立、定位和初始化 編輯控件。 顯示之前,清單檢視控制項會傳送其父視窗一個 LVN_BEGINLABELEDIT 通知代碼。 如果您需要修改標籤編輯程式,您可以實作此通知的處理程式。
LVN_BEGINLABELEDIT 通知處理程式的其中一個用法是控制使用者可以編輯的標籤。 若要防止標籤編輯,請傳回非零值。 若要自定義標籤編輯,請讓通知處理程式將 LVM_GETEDITCONTROL 訊息傳送至清單檢視控制項,以擷取編輯控制項的控制碼。 擁有該句柄之後,您可以傳送一般EM_XXX訊息來自訂編輯控制。 例如,若要限制使用者可以輸入的文字數量,請傳送編輯控件 EM_LIMITTEXT 訊息。 您可以使用 SetWindowText來變更編輯控件的預設文字。 您甚至可以將編輯控件子類別化,以攔截和捨棄無效的字元。
當標籤編輯取消或完成時,清單檢視控件會傳送其父視窗 LVN_ENDLABELEDIT 通知碼。 lParam 參數是 NMLVDISPINFO 結構位址。 這個結構的 項目 成員是 LVITEM 結構,其 iItem 成員用來識別該項目。 如果取消編輯,pszText 是 LVITEM 結構的成員,其值為 NULL;否則,pszText 是編輯文字的位址。 如果父視窗想要保留新標籤,則父視窗會負責更新項目的標籤。
List-View 色彩
應用程式可以擷取並設定清單檢視控件的三種色彩。
顏色 | 用來擷取和設定色彩的訊息 |
---|---|
文字色彩 | LVM_GETTEXTCOLOR、LVM_SETTEXTCOLOR |
文字背景色彩 | LVM_GETTEXTBKCOLOR、LVM_SETTEXTBKCOLOR |
視窗背景色彩 | LVM_GETBKCOLOR、LVM_SETBKCOLOR |
若要更明確地自定義清單檢視控件的外觀,請使用 NM_CUSTOMDRAW(清單檢視) 或使用可視化樣式(請參閱 可視化樣式 和 啟用可視化樣式)。
依群組排列清單項目
清單檢視控件的分組功能可讓您以可視化方式將邏輯相關的專案集分組。 您可以根據專案屬性、屬性或其他特性來建立群組。 這些群組通常會在畫面上以包含群組名稱的水平標頭分隔。 下列螢幕快照顯示分組的項目。
您可以使用 LVGROUP 結構來儲存群組的相關信息,例如頁首和頁尾文字、群組的目前狀態等等。 群組 API 包含功能,讓您可以透過將項目新增至群組、將群組新增至檢視、排序群組中的項目,以及查詢群組的項目大小和其他資訊,來管理群組和群組元素。 例如,您可以使用 ListView_SetGroupMetrics 和 ListView_GetGroupMetrics 巨集來設定和擷取每個群組的顯示參數。
除了清單檢視之外,所有檢視都可以使用群組。 它不適用於具有 LVS_OWNERDATA 樣式的控件。
如需更多資訊,請參閱 使用 List-View 控制件。
插入標記
插入標記會顯示拖曳項目的放置位置。 當使用者將項目拖曳到 [開始] 功能表或 [快速啟動] 列時,會顯示插入標記。 插入標記也適用於設定為 autoarrange 的清單。 當使用者將專案拖曳至其他兩個項目之間的點時,插入標記會顯示項目的預期新位置。 下列螢幕快照顯示插入標記。
螢幕快照顯示在清單檢視控件中將一個檔案拖曳到兩個檔案之間時的插入標記
插入標記 API 元素透過提供進行命中偵測的訊息和標誌、按項目指定插入標記的位置和外觀,以及查詢插入標記當前大小和外觀的信息,來實現插入標記的位置和外觀。