關於下拉式方塊
下拉式方塊結合了編輯框或靜態文字和清單。
本主題包含下列各節。
下拉式方塊類型和樣式
下拉式方塊包含清單和選取欄位。 此清單會顯示使用者可以選取的選項,而選取範圍字段會顯示目前的選取範圍。 如果選取欄位是編輯控制件,使用者可以在清單中輸入無法使用的資訊;否則,使用者只能選取清單中的專案。
通用控件連結庫包含三個主要的下拉式方塊樣式,如下表所示。
下拉式方塊類型 | 樣式常數 | 描述 |
---|---|---|
簡易 | CBS_SIMPLE | 隨時顯示清單,並在編輯控件中顯示選取的專案。 |
下拉式清單 | CBS_DROPDOWN | 按兩下圖示時顯示清單,並在編輯控制件中顯示選取的專案。 |
下拉式清單 (下拉式清單) | CBS_DROPDOWNLIST | 按兩下圖示時顯示清單,並在靜態控制項中顯示選取的專案。 |
下列螢幕快照分別顯示三種下拉式方塊,因為它們可能會出現在Windows Vista 中。 在第一個螢幕快照中,使用者已在簡單下拉式方塊中選取專案。 使用者也可以在此控件的編輯方塊中輸入新值。 此清單已在 Microsoft Visual Studio 資源編輯器中調整大小,且大小僅足以容納兩個專案。
在第二個螢幕快照中,使用者已在下拉式下拉式方塊的編輯控件中輸入新文字。 使用者也可以選取現有的專案。 清單框會展開以容納盡可能多的專案。
第三個螢幕快照中,用戶已開啟下拉式清單下拉式方塊。 清單框會展開以容納盡可能多的專案。 用戶無法輸入新的文字。
另外還有一些下拉式方塊樣式可定義特定屬性。 下拉式方塊樣式會定義下拉式方塊的特定屬性。 您可以結合樣式;不過,某些樣式僅適用於特定下拉式方塊類型。 如需下拉式方塊樣式的表格,請參閱 下拉式方塊樣式。
注意
若要搭配下拉式方塊使用可視化樣式,應用程式必須包含指令清單,而且必須在程式開頭呼叫 InitCommonControls。 如需可視化樣式的資訊,請參閱 可視化樣式。 如需指令清單的資訊,請參閱 啟用可視化樣式。
下拉式方塊清單
清單是下拉式方塊的一部分,可顯示使用者可以選取的專案。 一般而言,應用程式會在建立下拉式方塊時,初始化清單的內容。 用戶選取的任何清單專案都是 目前的選取專案。 無法選取多個專案。 在簡單且下拉式下拉式方塊中,用戶可以在選取欄位中輸入,而不是選取清單專案。 在這些情況下,沒有目前的選取專案,而且應用程式必須負責將專案新增至清單,並使其成為目前的選取範圍,如果適用的話。
本節討論下列主題:
目前選取範圍
目前的選取範圍是使用者已選取的清單專案;選取的文字會出現在下拉式方塊的選取欄位中。 不過,在簡單下拉式方塊或下拉式方塊的情況下,目前的選取範圍只是下拉式方塊中可能使用者輸入的一種形式。 使用者也可以輸入選取欄位中的文字。
目前選取範圍是由所選清單專案之以零起始的索引來識別。 應用程式可以隨時設定及擷取。 當使用者變更下拉式方塊目前的選取範圍時,父視窗或對話框程式會收到通知。 當應用程式變更選取範圍時,不會通知父視窗或對話框。
建立下拉式方塊時,沒有目前的選取範圍。 如果使用者已編輯選取範圍字段的內容,則簡單或下拉式下拉式方塊也是如此。 若要設定目前的選取範圍,應用程式會將 CB_SETCURSEL 訊息傳送至下拉式方塊。 應用程式也可以使用 CB_SELECTSTRING 訊息,將目前的選取範圍設定為字串開頭為指定字串的清單專案。 若要判斷目前的選取範圍,應用程式會將 CB_GETCURSEL 訊息傳送至下拉式方塊。 如果沒有目前的選取範圍,此訊息會傳回CB_ERR。
當使用者在下拉式方塊中變更目前的選取範圍時,父視窗或對話框程式會收到一則WM_COMMAND訊息,其中包含 wParam 參數高序字中的CBN_SELCHANGE通知程式代碼。 使用CB_SETCURSEL訊息設定目前的選取專案時,不會傳送此通知碼。
下拉式下拉式方塊或下拉式清單框會在下拉式清單關閉時,將CBN_CLOSEUP通知程式代碼傳送至父視窗或對話框程式。 如果用戶變更了目前的選取範圍,下拉式方塊也會在下拉式清單關閉時傳送 CBN_SELCHANGE 通知碼。 若要在每次使用者選取清單專案時執行特定程式,您可以處理CBN_SELCHANGE或CBN_CLOSEUP通知程式代碼。 一般而言,您會先等候CBN_CLOSEUP通知程式代碼,再處理目前選取範圍中的變更。 如果需要大量的處理,這可能會特別重要。
應用程式也可以處理 CBN_SELENDOK 和 CBN_SELENDCANCEL 通知碼。 當使用者選取清單項目或選取專案,然後關閉清單時,系統會傳送CBN_SELENDOK。 這表示使用者已完成,而且應該處理選取範圍。 當使用者選取專案時,會傳送CBN_SELENDCANCEL,但接著選取另一個控件、在下拉式清單開啟時按 ESC 鍵,或關閉對話方塊。 這表示應該忽略使用者的選取範圍。 每個CBN_SELCHANGE訊息之前都會傳送CBN_SELENDOK。
在簡單的下拉式方塊中,當使用者按兩下清單專案時,系統會傳送 CBN_DBLCLK 通知碼。 在下拉式下拉式方塊或下拉式清單中,按兩下即可隱藏清單,因此無法按兩下專案。
下拉式清單
某些通知和訊息僅適用於包含下拉式清單的下拉式方塊。 當下拉式清單開啟或關閉時,下拉式方塊的父視窗會以WM_COMMAND訊息的形式接收通知。 如果清單正在開啟,wParam 的高階字會CBN_DROPDOWN。 如果清單正在關閉,則會 CBN_CLOSEUP。
應用程式可以使用CB_SHOWDROPDOWN訊息開啟下拉式下拉式方塊或下拉式清單框的清單。 它可以使用CB_GETDROPPEDSTATE訊息來判斷清單是否開啟,而且可以使用CB_GETDROPPEDCONTROLRECT訊息來判斷下拉式清單的座標。 應用程式也可以使用CB_SETDROPPEDWIDTH訊息來增加下拉式清單的寬度。
列出內容
當應用程式建立下拉式方塊時,通常會將一或多個專案新增至清單來初始化下拉式方塊。 稍後,應用程式可以新增或刪除清單專案、重新初始化清單,或從清單中擷取項目資訊。
應用程式會將CB_ADDSTRING訊息傳送至下拉式方塊,以將清單專案新增至下拉式方塊。 指定的專案會新增至清單結尾,或根據專案的字串,在排序的下拉式方塊中,以正確的排序位置。 在未排序的下拉式方塊中,應用程式可以使用 CB_INSERTSTRING 訊息將專案插入特定位置。 新增之後,清單專案會依其位置來識別。
藉由使用 CB_FINDSTRING 或 CB_FINDSTRINGEXACT 訊息,應用程式可以判斷清單專案的位置。 CB_FINDSTRING會尋找字串開頭為指定字串的專案。 CB_FINDSTRINGEXACT會尋找字串完全符合字串的專案。 這兩則訊息都不區分大小寫。
應用程式可以使用CB_DELETESTRING訊息來移除清單專案。 如果應用程式需要重新初始化下拉式方塊清單,它必須先使用 CB_RESETCONTENT 訊息清除其整個內容。 在顯示下拉式方塊之後,將多個專案新增至清單時,應用程式可以清除重繪旗標,以防止在新增每個項目之後重新繪製下拉式方塊。 如需重新繪製的詳細資訊,請參閱WM_SETREDRAW訊息的描述。
若要擷取與清單專案相關聯的字串,應用程式可以使用 CB_GETLBTEXT 訊息。 專案的字串會複製到應用程式指定的緩衝區。 為了確保緩衝區夠大,無法接收字串,應用程式可以先使用 CB_GETLBTEXTLEN 訊息來判斷字串的長度。 若要取得下拉式方塊中的清單項目數目,應用程式可以使用 CB_GETCOUNT 訊息。
編輯控制項選取欄位
應用程式可以擷取或設定選取範圍字段的內容,並可決定或設定編輯選取範圍。 應用程式也可以限制用戶可以在選取欄位中輸入的文字數量。 當選取欄位的內容變更時,系統會將通知訊息傳送至父視窗或對話框程式。
若要擷取選取範圍欄位的內容,應用程式可以將WM_GETTEXT訊息傳送至下拉式方塊。 若要設定簡單或下拉式下拉式方塊之選取字段的內容,應用程式可以將WM_SETTEXT訊息傳送至下拉式方塊。
編輯選取範圍是在簡單或下拉式下拉式方塊的選取欄位中選取的文字範圍。 應用程式可以使用CB_GETEDITSEL訊息來判斷目前選取範圍的開始和結束字元位置。 它也可以使用CB_SETEDITSEL訊息,在編輯選取範圍中選取字元。
一開始,用戶可以在選取字段中輸入的文字數量受限於選取範圍欄位的大小。 不過,如果下拉式方塊具有 CBS_AUTOHSCROLL 樣式,文字可以繼續超過選取範圍字段的大小。 無論控件是否有CBS_AUTOHSCROLL樣式,應用程式都可以使用CB_LIMITTEXT訊息來限制使用者可以輸入至選取字段的文字數量。
當使用者編輯選取範圍字段的內容時,父視窗或對話框程式會收到通知訊息。 會 先傳送CBN_EDITUPDATE 通知代碼,指出已編輯選取欄位中的文字。 顯示改變的文字之後,系統會傳送 CBN_EDITCHANGE。 當選取欄位內容變更為選取清單項目的結果時,不會傳送這些訊息。
擁有者繪製下拉式方塊
應用程式可以建立擁有者繪製下拉式方塊,以負責繪製清單專案。 當需要繪製下拉式方塊的一部分時,擁有者下拉式方塊的父視窗(其擁有者)會收到 WM_DRAWITEM 訊息。 擁有者繪製的下拉式方塊可以列出文字字串以外的資訊,或是以外的資訊。 擁有者繪製的下拉式方塊可以是任何類型。 不過,簡單或下拉式下拉式方塊中的編輯控件只能顯示文字,而擁有者會在下拉式清單框中繪製選取字段。
擁有者繪製下拉式方塊的擁有者必須處理 WM_DRAWITEM 訊息。 每當必須重新繪製下拉式方塊的一部分時,就會傳送此訊息。 根據下拉式方塊指定的樣式,擁有者可能需要處理其他訊息。
應用程式可以藉由指定CBS_OWNERDRAWFIXED或CBS_OWNERDRAWVARIABLE樣式來建立擁有者繪製的下拉式方塊。 如果下拉式方塊中的所有清單專案高度相同,例如字串或圖示,則應用程式可以使用 CBS_OWNERDRAWFIXED 樣式。 如果清單專案的高度不同,例如不同大小的點陣圖,應用程式可以使用 CBS_OWNERDRAWVARIABLE 樣式。
擁有者繪製下拉式方塊的擁有者可以處理 WM_MEASUREITEM 訊息,以在下拉式方塊中指定清單項目的維度。 如果應用程式使用 CBS_OWNERDRAWFIXED 樣式建立下拉式方塊,系統只會傳送 WM_MEASUREITEM 訊息一次。 擁有者指定的維度會用於所有清單專案。 如果使用CBS_OWNERDRAWVARIABLE樣式,系統會針對新增至下拉式方塊的每個清單專案傳送WM_MEASUREITEM訊息。 擁有者可以使用CB_GETITEMHEIGHT和CB_SETITEMHEIGHT訊息,隨時判斷或設定清單專案的高度。
如果以擁有者繪製的下拉式方塊中顯示的資訊包含文字,應用程式可以藉由指定 CBS_HASSTRINGS 樣式來追蹤每個清單專案的文字。 具有 CBS_SORT樣式的 下拉式方塊會根據此文字排序。 如果下拉式方塊已排序,而不是CBS_HASSTRINGS樣式,則擁有者必須處理WM_COMPAREITEM訊息。
在擁有者繪製的下拉式方塊中,擁有者必須追蹤包含文字以外的信息的清單專案。 這樣做的一個便利方式是將句柄儲存至資訊做為項目數據。 若要釋放與下拉式方塊中專案相關聯的數據對象,擁有者可以處理 WM_DELETEITEM 訊息。
子類別化下拉式方塊
子類別化是一種程式,可讓應用程式攔截和處理傳送或張貼至視窗的訊息。 藉由使用子類別化,應用程式可以將自己的處理取代為特定訊息,同時將大部分訊息處理留給類別定義的視窗程式。
當作業系統建立視窗時,它會將它的相關信息儲存在包含視窗程式指標的內部數據結構中。 若要將視窗子類別化,應用程式會呼叫 SetClassLong 函式,將該程式的指標取代為應用程式定義子類別程式的指標。 之後,視窗的所有訊息都會傳送至子類別程式。 此程式接著會使用 CallWindowProc 函式,將未處理的訊息傳遞至原始視窗程式。 如需 COMBOBOX 類別視窗程式所執行訊息處理的描述,請參閱 預設下拉式方塊行為。
當下拉式方塊位於對話方塊外部時,除非應用程式使用子類別程序,否則無法處理TAB、ENTER和ESC鍵。 當簡單或下拉式下拉式方塊收到輸入焦點時,它會立即將焦點設定為其子編輯控件。 因此,應用程式必須子類別編輯控件,以攔截簡單或下拉式下拉式方塊的鍵盤輸入。 如需此範例,請參閱 子類別化下拉式方塊。
如果子類別程式處理WM_PAINT訊息,它必須使用 Begin 小畫家 函式來準備繪製。 在呼叫 End 小畫家 函式之前,它會傳遞裝置內容 (DC) 句柄做為視窗程式的 wParam 參數。 如果先呼叫 End 小畫家,類別視窗程式就不會繪製,因為 End 小畫家 會驗證整個視窗。
與子類別化相關的技術是超類別化。 超類別類似於任何其他類別,不同之處在於其視窗程式不會呼叫 DefWindowProc 來處理未處理的訊息。 相反地,它會將未處理的訊息傳遞至父視窗類別的視窗程式。 請遵循 Window 程式中的指導方針,以避免子類別化和超類別化可能發生的問題。