Share via


關於標頭控件

標頭控件是通常位於文字或數字數據行上方的視窗。 它包含每個數據行的標題,而且可以分割成部分。 用戶可以拖曳分隔區,以設定每個數據行的寬度。 下圖顯示標題控件,其已加上標籤的資料列,可提供目錄中檔案的詳細資訊。

screen shot of a dialog box with a three-column header control

您可以使用 CreateWindowEx 函式來建立標頭控件,並指定WC_HEADER視窗類別和適當的標頭控件樣式。 載入通用控制項 DLL 時,會註冊此視窗類別。 若要確保已載入此 DLL,請使用 InitCommonControlsEx 函式。 建立標頭控件之後,您可以將它分割成元件、設定每個元件中的文字,以及使用標頭視窗訊息控制窗口的外觀。

標頭控件可以建立為另一個控件的子視窗,例如清單框。 不過,父控件並不知道標頭控件,而且不允許標頭佔用的空間,結果顯示清單專案會出現在標頭後面。 如果您想要在清單框或其他控件中使用標題控件,父控件必須是擁有者繪製,讓所有專案都以正確的位置顯示。

清單檢視控件已經有標頭控件。 您可以使用LVM_GETHEADERListView_GetHeader來擷取現有的控件,而不是建立清單檢視控件的標頭控件。

標頭控件大小和位置

一般而言,您必須設定標頭控件的大小和位置,以符合特定矩形的界限,例如視窗的工作區。 藉由使用 HDM_LAYOUT 訊息,您可以從標頭控件擷取適當的大小和位置值。

傳送HDM_LAYOUT時,您可以指定包含標頭控件所佔用之矩形座標的 HDLAYOUT 結構的位址,並提供 WINDOWPOS 結構的指標。 控件會 填滿 WINDOWPOS 結構,其大小和位置值適用於將控件放在指定矩形頂端的位置。 高度值是控件水準框線的高度和目前選取至控件裝置內容之字型中字元的平均高度總和。

如果您想要使用 HDM_LAYOUT 來設定標頭控件的初始大小和位置,請設定控件的初始可見性狀態,使其隱藏。 傳送HDM_LAYOUT以擷取大小和位置值之後,您可以使用 SetWindowPos 函式來設定新的大小、位置和可見性狀態。

項目

標頭控件通常有數個標頭專案,可定義控件的數據行。 您可以藉由將HDM_INSERTITEM訊息傳送至控件,將專案新增至標頭控件。 訊息包含 HDITEM 結構的位址 此結構會定義標頭項目的屬性,其中包含字串、點陣圖影像、初始大小,以及應用程式定義的 LPARAM 值。

專案的 HDITEM 結構的 fmt 成員可以包含HDF_STRINGHDF_BITMAP旗標,以指出控件是否顯示專案的字串或位圖。 如果您想要同時顯示字串和點陣圖,請將 fmt 成員設定為包含HDF_OWNERDRAW旗標,以建立擁有者繪製的專案。 HDITEM 結構也會指定格式化旗標,告知控件要置中、靠左或靠右對齊專案矩形中的字串或位圖。

HDM_INSERTITEM會傳回新加入專案的索引。 您可以使用其他訊息中的索引來設定屬性或擷取專案的相關信息。 您可以使用HDM_DELETEITEM訊息來刪除專案,並指定要刪除之專案的索引。

您可以使用HDM_SETITEM訊息來設定現有標頭專案的屬性和HDM_GETITEM訊息,以擷取專案的目前屬性。 若要擷取標頭控件中的項目計數,請使用 HDM_GETITEMCOUNT 訊息。

擁有者繪製標頭控件

您可以定義標頭控件的個別專案,以成為擁有者繪製的專案。 使用這項技術可提供您比對標頭項目外觀更多的控制權。

您可以使用HDM_INSERTITEM訊息,將新的擁有者繪製專案插入標頭控件或HDM_SETITEM訊息,將現有的專案變更為擁有者繪製的專案。 這兩則 訊息都包含 HDITEM 結構的位址,其應將 fmt 成員設定為 HDF_OWNERDRAW 值。

當標頭控件必須繪製擁有者繪製的專案時,會將WM_DRAWITEM訊息傳送至父視窗。 訊息的 wParam 參數是標頭控件的子視窗標識碼,而 lParam 參數是 DRAWITEMSTRUCT 結構的位址。 父視窗會使用 結構中的資訊來繪製專案。 對於標頭控件中的擁有者繪製專案, DRAWITEMSTRUCT 結構包含下列資訊。

member 描述
CtlType ODT_HEADER擁有者繪製控件類型。
CtlID 標頭控件的子視窗標識碼。
itemID 要繪製之專案的索引。
itemAction ODA_DRAWENTIRE繪圖動作旗標。
itemState 如果游標位於專案上,且滑鼠按鈕已關閉,則ODS_SELECTED 繪圖動作旗標。 否則,此成員為零。
hwndItem 標頭控件的句柄。
hDC 標頭控件的裝置內容句柄。
rcItem 要繪製之標頭專案的座標。 座標相對於標頭控件的左上角。
itemData 與專案相關聯的應用程式定義32位值。

 

標頭控件篩選

藉由指定 標題控件的HDS_FILTERBAR 視窗樣式,您可以啟用欄標題下方篩選編輯方塊的位置。 編輯方塊旁邊會出現篩選按鈕。 您可以回應HDN_BEGINFILTEREDIT、HDN_ENDFILTEREDIT、HDN_FILTERBTNCLICKHDN_FILTERCHANGE通知碼來實作篩選。

根據預設,編輯方塊會包含提示使用者輸入文字。 您可以使用Header_ClearFilterHeader_ClearAllFilters,將編輯方塊還原到此預設狀態。

下列程式代碼範例示範如何從清單檢視控件擷取標頭控件,並新增篩選列。

// hList is the HWND of the list-view control.
HWND hHeader = ListView_GetHeader(hList);
LONG_PTR styles = GetWindowLongPtr(hHeader, GWL_STYLE);
SetWindowLongPtr(g_hHeader, GWL_STYLE, styles | HDS_FILTERBAR);

默認標頭控件訊息處理

本節描述WC_HEADER視窗類別之視窗程式所處理的視窗訊息。

訊息 已執行處理
WM_CREATE 初始化標頭控件。
WM_DESTROY 取消初始化標頭控件。
WM_ERASEBKGND 使用控件的目前背景色彩填滿標頭控件的背景。
WM_GETDLGCODE 傳回DLGC_WANTTABDLGC_WANTARROWS值的組合。
WM_GETFONT 傳回目前字型的句柄,標頭控件會使用此句柄來繪製其文字。
WM_LBUTTONDBLCLK 擷取滑鼠輸入。 如果滑鼠游標位於分隔器上,控件會傳送 HDN_BEGINTRACK 通知程式代碼,並開始拖曳分隔器。 如果游標位於專案上,專案就會以已按下的狀態顯示。
WM_LBUTTONDOWN WM_LBUTTONDBLCLK 訊息相同。
WM_LBUTTONUP 釋放滑鼠擷取。 如果控件追蹤滑鼠移動,則會傳送 HDN_ENDTRACK 通知碼,並重新繪製標頭控件。 否則,控件會 傳送HDN_ITEMCLICK 通知碼,並重新繪製已按下的標頭專案。
WM_MOUSEMOVE 如果正在拖曳分隔線,控件會傳送 HDN_TRACK 通知程序代碼,並在新位置顯示專案。 如果滑鼠左鍵已關閉,且游標位於專案上,則會以按下狀態顯示專案。
WM_NCCREATE 配置和初始化內部數據結構。
WM_NCDESTROY 在未初始化標頭控件之後,釋放標頭控件所配置的資源。
WM_PAINT 小畫家標頭控件的無效區域。 如果 wParam 參數不是 NULL,控制項會假設此值為 HDC,並使用該裝置內容繪製。
WM_SETCURSOR 根據游標位於分隔器上或標頭專案中,設定游標圖形。
WM_SETFONT 在標頭控件的裝置內容中選取新的字型句柄。