關於標頭控件
標頭控件是通常位於文字或數字數據行上方的視窗。 它包含每個欄位的標題,而且可以區分成部分。 用戶可以拖曳分隔區,以設定每個數據行的寬度。 下圖顯示了一個標頭控制項,具有加上標籤的資料欄,提供目錄中檔案的詳細資訊。
您可以使用 CreateWindowEx 函式來建立標頭控制件,並指定 WC_HEADER 視窗類別和適當的 標頭控件樣式。 載入通用控制項 DLL 時,會註冊此視窗類別。 若要確保載入此 DLL,請使用 InitCommonControlsEx 函式。 建立標頭控件之後,您可以將它分割成元件、設定每個元件中的文字,以及使用標頭視窗訊息控制窗口的外觀。
標頭控件可以建立為另一個控件的子視窗,例如清單框。 不過,父層控件並不知道標頭控件,也不考慮標頭佔用的空間,結果清單專案會顯示在標頭後面。 如果您想在清單框或其他控制項中使用標頭控制項,則父控制項必須是業主繪製,這樣所有項目才能以正確的位置顯示。
清單檢視控件已經有標頭控件。 您可以使用 LVM_GETHEADER 或 ListView_GetHeader 來擷取現有的控制元件,而不是為清單檢視控制元件建立標頭控制元件。
標頭控件大小和位置
一般而言,您必須設定標頭控件的大小和位置,以符合特定矩形的界限,例如視窗的工作區。 藉由使用 HDM_LAYOUT 訊息,您可以從標頭控件擷取適當的大小和位置值。
傳送 HDM_LAYOUT時,您可以指定包含標頭控件所佔用之矩形座標的 HDLAYOUT 結構位址,並提供 WINDOWPOS結構的指標。 控件會填滿 WINDOWPOS 結構,其大小和位置值適用於將控件放置在指定矩形頂端的位置。 高度值為控件水平邊框的高度與目前選擇的字型在控件設備上下文中字元的平均高度之總和。
如果您想要使用 HDM_LAYOUT 來設定標頭控件的初始大小和位置,請設定控件的初始可見性狀態,使其隱藏。 傳送 HDM_LAYOUT 以擷取大小和位置值之後,您可以使用 SetWindowPos 函式來設定新的大小、位置和可見性狀態。
項目
標頭控件通常有數個標頭專案,可定義控件的數據行。 您可以將 HDM_INSERTITEM 訊息傳送至標題控制項,以新增專案到該控制項。 訊息包含 HDITEM結構的位址。 此結構會定義標頭項目的屬性,其中包含字串、點陣圖影像、初始大小,以及應用程式定義的 LPARAM 值。
項目 HDITEM 結構的 fmt 成員可以包含 HDF_STRING 或 HDF_BITMAP 標誌,以指示控件是否顯示項目的字串或位圖。 如果您想要同時顯示字串和點陣圖,請將 fmt 成員設置為包含 HDF_OWNERDRAW 標誌,以建立擁有者自繪的項目。 HDITEM 結構也會指定格式化旗標,告知控制項是否將字串和位圖在項目矩形範圍內置中、靠左對齊或靠右對齊。
HDM_INSERTITEM 會傳回新加入項目的索引。 您可以使用其他訊息中的索引來設定屬性或擷取專案的相關信息。 您可以使用 HDM_DELETEITEM 訊息來刪除專案,並指定要刪除之專案的索引。
您可以使用 HDM_SETITEM 訊息來設定現有標頭專案的屬性和 HDM_GETITEM 訊息,以擷取專案的目前屬性。 若要擷取標頭控件中的項目計數,請使用 HDM_GETITEMCOUNT 訊息。
Owner-Drawn 標頭控件
您可以將標頭控制項的個別項目定義為自行繪製的項目。 使用這項技術可讓您比其他方法更能掌控標題項目的外觀。
您可以使用 HDM_INSERTITEM 訊息,將新的擁有者繪製專案插入標頭控件或 HDM_SETITEM 訊息,將現有的專案變更為擁有者繪製的專案。 這兩則訊息都包含 HDITEM結構的位址,其應該將 fmt 成員設定為 HDF_OWNERDRAW 值。
當標頭控制項必須繪製自行繪製項目時,會將 WM_DRAWITEM 訊息傳送至父視窗。 訊息的 wParam 參數是標頭控件的子視窗標識碼,而 lParam 參數是 DRAWITEMSTRUCT結構的位址。 父視窗會使用 結構中的資訊來繪製專案。 對於標頭控制項中的自定義繪製項目,DRAWITEMSTRUCT 結構包含下列資訊。
成員 | 描述 |
---|---|
CtlType | ODT_HEADER 擁有者繪製控件類型。 |
CtlID | 標頭控制項的子視窗識別碼。 |
項目ID | 要繪製之項目的索引。 |
項目操作 | ODA_DRAWENTIRE 繪圖動作旗標。 |
項目狀態 | 如果游標位於專案上,且滑鼠按鈕已關閉,則 ODS_SELECTED 繪圖動作旗標。 否則,此成員為零。 |
hwndItem | 標頭控件的句柄。 |
hDC | 標頭控件的裝置內容句柄。 |
rcItem | 要繪製之標頭欄位的座標。 座標是相對於標題控制項的左上角。 |
itemData | 與項目相關聯的應用程式定義之32位值。 |
標頭控件篩選
藉由指定標題控件的 HDS_FILTERBAR 視窗樣式,您可以啟用在欄標題下方顯示篩選編輯框的功能。 編輯方塊旁邊會出現篩選按鈕。 您可以回應 HDN_BEGINFILTEREDIT、HDN_ENDFILTEREDIT、HDN_FILTERBTNCLICK或 HDN_FILTERCHANGE 通知碼來實作篩選。
根據預設,編輯方塊會包含提示使用者輸入文字。 您可以使用 Header_ClearFilter 或 Header_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_WANTTAB 和 DLGC_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 | 在標頭控件的裝置內容中選取新的字型句柄。 |