關於清單框
清單框控制項包含簡單的清單,使用者通常會從中選取一或多個項目。 與 清單檢視 控件相比,清單框提供有限的彈性。
清單框項目可以透過文字字串、點陣圖或是兩者來表示。 如果清單框不夠大而無法同時顯示所有項目,則會提供滾動條。 使用者會捲動清單項目,並視需要套用或移除選取狀態。 選取清單框項目會變更其視覺外觀,通常是將文字和背景色彩變更為相關作系統計量所指定的色彩。 當使用者選取或取消選取專案時,系統會將通知訊息傳送至清單框的父視窗。
針對 ANSI 應用程式,系統會使用 CP_ACP 代碼頁,將清單框中的文字轉換成 Unicode。 這可能會導致問題。 例如,在 Windows 的日文版本中,非 Unicode 清單框中的重音羅馬字元會變得亂碼。 若要修正此問題,請將應用程式編譯為 Unicode,或使用擁有者繪製的清單框。
本節討論下列主題:
在對話框中建立清單框的最簡單方式,就是將清單框從 Microsoft Visual Studio 的 [工具箱] 拖曳到您的對話框資源。 若要動態建立清單框,或在對話方塊以外的視窗中建立清單框,請使用 CreateWindowEx 函式,指定 WC_LISTBOX 視窗類別和適當的 列表框樣式。
清單框有兩種類型:單一選取範圍(預設值)和多重選取範圍。 在單一選取清單框中,用戶一次只能選取一個項目。 在多重選取清單框中,使用者可以一次選取多個項目。 若要建立多重選取清單框,請指定 LBS_MULTIPLESEL 或 LBS_EXTENDEDSEL 樣式。
清單框的外觀和作業是由清單框樣式 和視窗樣式 控制。 這些樣式會指出清單是否經過排序、排列在多個數據行中、由應用程式繪製等等。 清單框的維度和樣式通常會定義在應用程式資源中包含的對話框範本中。
DlgDirList 函式會以符合指定準則集的磁碟驅動器、目錄和檔案名稱取代清單框的內容。
DlgDirSelectEx 函式會擷取由 dlgDirList 初始化的清單框中目前的選取範圍。 這些函式可讓使用者從清單框中選取磁碟驅動器、目錄或檔案,而不需要輸入檔案的位置和名稱。
此外,GetListBoxInfo 函式會傳回指定清單框中每個數據行的項目數。
當清單框中發生事件時,清單框會以 WM_COMMAND 訊息的形式,將通知程式代碼傳送至擁有者視窗的對話框程式。 當使用者選取、按兩下或取消清單框專案時,會傳送清單框通知代碼;當清單框接收或失去鍵盤焦點時;當系統無法為清單框要求配置足夠的記憶體時。
WM_COMMAND 訊息包含於 wParam 參數的低位字中的列表框識別符,以及高位字中的通知碼。
lParam 參數包含控制視窗句柄。
處理這些訊息不需要對話框程式;默認視窗程式會加以處理。
應用程式應該監視及處理下列清單框通知碼。
對話框程序可以將訊息傳送至清單,以新增、刪除、檢查及變更項目。 例如,對話框程式可以將 LB_ADDSTRING 訊息傳送至清單框以新增專案,以及 LB_GETSEL 訊息來判斷專案是否已選取。 其他訊息會設定並擷取清單框的大小、外觀和行為相關信息。 例如,LB_SETHORIZONTALEXTENT 訊息會設定清單框的可捲動寬度。 對話框程式可以使用 sendMessage或 SendDlgItemMessage 函式,將任何訊息傳送至清單框。
清單框專案通常由其 索引參考,這是代表專案在清單框中位置的整數。 清單框中第一個專案的索引為0、第二個專案的索引為1,依故。
下表描述預先定義的清單框程式如何回應清單框訊息。
預先定義清單框視窗類別的視窗程式會針對清單框未處理的所有訊息執行預設處理。 當清單框程式傳回訊息 FALSE 時,預先定義的視窗程式會檢查訊息並執行預設動作,如下表所示。
預先定義的清單框程式會將所有其他訊息傳遞給 DefWindowProc,以進行默認處理。
應用程式可以建立 業主繪製的 清單框,以負責繪製清單項目。 當需要繪製清單框的部分時,由擁有者繪製的清單框的父窗口或對話框(其擁有者為 )才會收到 WM_DRAWITEM 訊息。 擁有者繪製的清單框可以列出文字字串以外的其他資訊,或列出所有相關資訊。
擁有者繪製的清單框的擁有者必須處理 WM_DRAWITEM 訊息。 每當必須重新繪製清單框的一部分時,就會傳送此訊息。 根據清單框指定的樣式,擁有者可能需要處理其他訊息。
應用程式可以藉由指定 LBS_OWNERDRAWFIXED 或 LBS_OWNERDRAWVARIABLE 樣式來建立擁有者繪製的清單框。 如果清單框中的所有清單項目具有相同的高度,例如字串或圖示,則應用程式可以使用 LBS_OWNERDRAWFIXED 樣式。 如果清單專案高度不同(例如不同大小的點陣圖),應用程式可以使用 LBS_OWNERDRAWVARIABLE 樣式。
擁有者繪製清單框的擁有者可以處理 WM_MEASUREITEM 訊息,以指定清單項目的尺寸。 如果應用程式使用 LBS_OWNERDRAWFIXED 樣式建立清單框,系統只會傳送 WM_MEASUREITEM 訊息一次。 擁有者所指定的維度會用於所有列表項目。 如果使用 LBS_OWNERDRAWVARIABLE 樣式,系統會針對新增至清單框的每個清單專案傳送 WM_MEASUREITEM 訊息。 擁有者可以使用 LB_GETITEMHEIGHT 和 LB_SETITEMHEIGHT 訊息,隨時判斷或設定清單專案的高度。
如果擁有者繪製的清單框中顯示的資訊包含文字,應用程式可以藉由指定 LBS_HASSTRINGS 樣式來記錄每個清單項目的文字。 具有 LBS_SORT 樣式的清單框會根據此文字排序。 如果清單框已排序,但不是 LBS_HASSTRINGS 樣式,則擁有者必須處理 WM_COMPAREITEM 訊息。
在所有者繪製的清單框中,所有者必須追蹤含有非文字或額外資訊的清單專案。 這樣做的一個便利方式是使用 LB_SETITEMDATA 訊息,將控制代碼作為項目數據儲存到資訊中。 若要釋放與列表框中項目相關聯的數據對象,列表框的擁有者可以處理 WM_DELETEITEM 訊息。
如需擁有者繪製清單框的範例,請參閱 如何建立 Owner-Drawn 清單框。
拖曳列表框是特殊的清單框類型,可讓使用者將專案從某個位置拖曳到另一個位置。 應用程式可以使用拖曳列表框來按特定順序顯示字串,並允許使用者透過拖曳項目到指定位置來變更順序。
拖曳列表框具有相同的窗口樣式,並處理與標準清單框相同的訊息。 若要建立拖曳列表框,請先建立標準清單框,然後呼叫makeDragList函式。 若要將對話框中的清單框轉換成拖曳列表框,您可以在處理 WM_INITDIALOG 訊息時呼叫 makeDragList。
拖曳列表框會藉由傳送拖曳列表訊息,通知拖曳事件的父視窗。 父窗口必須處理拖曳清單訊息。
當呼叫 MakeDragList 函式時,拖曳列表框會註冊此訊息。 若要擷取拖曳列表訊息的訊息標識碼(數值),請呼叫 RegisterWindowMessage 函式,並指定 DRAGLISTMSGSTRING 值。
拖曳列表訊息的 wParam 參數是拖曳清單框的控制標識符。
lParam 參數是 dragLISTINFO結構的位址,其中包含拖曳事件和其他資訊的通知碼。 訊息的傳回值取決於通知。
拖曳清單通知程序代碼,由拖曳列表訊息隨附之 DRAGLISTINFO 結構 uNotification 成員所識別,可以是 DL_BEGINDRAG、DL_DRAGGING、DL_CANCELDRAG或 DL_DROPPED。
當游標位於清單專案上,且使用者按兩下滑鼠左鍵時,就會傳送 DL_BEGINDRAG 通知碼。 父視窗可以傳回 TRUE 以開始拖曳操作,或傳回 FALSE 以不允許拖曳。 如此一來,父視窗就可以針對某些清單專案啟用拖曳,並停用其他專案。 您可以使用 LBItemFromPt 函式,判斷哪個清單項目位於指定的位置。
如果拖曳作用中,每當移動滑鼠時,就會傳送 DL_DRAGGING 通知代碼,如果滑鼠未移動,則會定期傳送通知碼。 父視窗應該先使用 LBItemFromPt 來判斷游標下的清單專案,然後使用 drawInsert函式繪製插入圖示。 藉由在 LBItemFromPt的 bAutoScroll 參數中指定 TRUE,可以使清單框在游標位於其客戶區域上方或下方時捲動一行。 您為此通知傳回的值會指定拖曳列表框應該設定的滑鼠游標類型。
如果使用者按下滑鼠右鍵或按下 ESC 鍵來取消拖曳作業,就會傳送 DL_CANCELDRAG 通知碼。 如果用戶藉由放開滑鼠左鍵來完成拖曳作業,即使游標不在清單項目上,也會傳送 DL_DROPPED 通知碼。 拖曳清單框會在傳送任一個通知之前釋放滑鼠擷取。 這兩個通知的傳回值將被忽略。 拖曳清單