分享方式:


TN031:控制列

注意

下列技術提示自其納入線上文件以來,未曾更新。 因此,有些程序和主題可能已過期或不正確。 如需最新資訊,建議您在線上文件索引中搜尋相關的主題。

此附注描述 MFC 中的控制項列類別:一般 CControlBar、CStatusBar 、CToolBar、 CDialogBar CDockBar

CControlBar

ControlBarCWnd 衍生類別,其為:

  • 對齊框架視窗的頂端或底部。

  • 可能包含作為 HWND 型控制項 (例如 CDialogBar) 或非HWND 型項目 (例如 CToolBarCStatusBar) 的子項目。

控制列支援其他樣式︰

  • CBRS_TOP (預設值) 將控制列釘選到頂端。

  • CBRS_BOTTOM將控制列釘選到底部。

  • CBRS_NOALIGN父系調整大小時不要重新置放控制列。

衍生自 CControlBar 的類別提供更有趣的實作︰

  • CStatusBar 狀態列,項目是含有文字的狀態列窗格。

  • CToolBar 工具列,項目是對齊成一列的點陣圖按鈕。

  • CDialogBar 類似工具列的框架,其中包含標準 Windows 控制項 (從對話方塊範本資源建立)。

  • CDockBar 其他 CControlBar 衍生物件的一般化對接區域。 此類別中可用的特定成員函式和變數在未來版本中可能會有所變更。

所有控制列物件/視窗都是某些父框架視窗的子視窗。 它們通常會加入框架 (例如 MDI 用戶端或檢視) 的工作區成為同層級。 控制列的子視窗識別碼很重要。 控制列的預設配置僅適用於其識別碼在 AFX_IDW_CONTROLBAR_FIRST 到 AFX_IDW_CONTROLBAR_LAST範圍內的控制列。 請注意,即使有 256 個控制列識別碼的範圍,前 32 個控制列識別碼由於受到預覽列印架構直接支援,因此是特殊的。

CControlBar 類別為下列項目提供標準實作︰

  • 將控制列對齊框架頂端、底部或任一側。

  • 配置控制項目陣列。

  • 支援衍生類別的實作。

C++ 控制列物件通常會內嵌為 CFrameWnd 衍生類別的成員,而且會在終結父 HWND 和物件時遭到清除。 如果您需要在堆積上配置控制項列物件,只要將m_bAutoDestruct成員設定 TRUE ,即可在終結 時 HWND 叫用控制項列 delete this;

注意

如果您建立自己的 CControlBar 衍生類別,而不是使用 MFC 的其中一個衍生類別,例如 CStatusBarCToolBarCDialogBar ,則必須設定 m_dwStyle 資料成員。 這可以在 的 Create 覆寫中完成:

// CMyControlBar is derived from CControlBar
BOOL CMyControlBar::Create(CWnd* pParentWnd,
    DWORD dwStyle,
    UINT nID)
{
    m_dwStyle = dwStyle;

.
.
.
}

控制列配置演算法

控制列配置演算法很簡單。 框架視窗會將訊息 WM_SIZEPARENT 傳送至控制列範圍內的所有子系。 父代工作區矩形的指標會連同此訊息一起傳遞。 此訊息會依 Z 軸順序傳送至子系。 控制列子系使用這項資訊自我放置,以及減少父代工作區的大小。 最後留給一般工作區的矩形 (較小的控制列) 是用來放置主用戶端視窗 (通常是 MDI 用戶端、檢視或分隔視窗)。

如需詳細資訊,請參閱 CWnd::RepositionBarsCFrameWnd::RecalcLayout

MFC 私人 Windows 訊息,包括WM_SIZEPARENT,記載于 技術附注 24

CStatusBar

狀態列是具有一列文字輸出窗格的控制列。 文字輸出窗格有兩種常見的用法:

  • 作為訊息列

    (例如標準功能表說明訊息列)。 通常會透過以 0 起始的索引來存取。

  • 如同狀態指標

    (例如 CAP、NUM 和 SCRL 指標)。 通常會透過字串/命令 ID 來存取。

狀態列的字型是 10 點 MS Sans Serif (依照《Windows 介面應用程式設計指南》所指定,或 10 點瑞士調和間距字型的字型對應程式最符合項目)。 在特定版本的 Windows 上 (例如日文版),選取的字型會不同。

狀態列中使用的色彩也會與《Windows 介面應用程式設計指南》的建議一致。 這些色彩未經過硬式編碼,而且會動態變更以便回應使用者在 [控制台] 中的自訂。

項目 Windows 色彩值 預設 RGB
狀態列背景 COLOR_BTNFACE RGB(192, 192, 192)
狀態列文字 COLOR_BTNTEXT RGB(000, 000, 000)
狀態列上/左邊緣 COLOR_BTNHIGHLIGHT RGB(255, 255, 255)
狀態列下/右邊緣 COLOR_BTNSHADOW RGB(128, 128, 128)

CStatusBar 的 CCmdUI 支援

指標通常會透過ON_UPDATE_COMMAND_UI機制來更新。 在閒置時間,狀態列會使用指標窗格的字串識別碼呼叫ON_UPDATE_COMMAND_UI處理常式。

ON_UPDATE_COMMAND_UI處理常式可以呼叫:

  • Enable:若要啟用或停用窗格。 停用的窗格看起來與啟用的窗格完全相同,但會隱藏文字 (亦即關閉文字指標)。

  • SetText:變更文字。 如果使用此選項,請務必小心,因為窗格不會自動調整大小。

如需 建立和自訂 API 的詳細資訊,請參閱<類別庫參考>中的 CStatusBar CStatusBar 類別。 狀態列的大部分自訂應該在初始顯示狀態列之前完成。

狀態列只支援一個壓縮窗格,通常是第一個窗格。 該窗格的大小其實是大小下限。 如果狀態列大於所有窗格的大小下限,任何額外的寬度都會指定給此壓縮窗格。 具有狀態列的預設應用程式,由於其第一個窗格已壓縮,因此 CAP、NUM 和 SCRL 指標會靠右對齊。

CToolBar

工具列是具有一列點陣圖按鈕 (可能包含分隔符號) 的控制列。 支援兩種按鈕樣式︰按鈕和核取方塊按鈕。 單選群組功能可以使用核取方塊按鈕和ON_UPDATE_COMMAND_UI來建置。

工具列中的所有點陣圖按鈕都是取自一個點陣圖。 此點陣圖必須包含每個按鈕的一個圖像或字符。 一般而言,點陣圖中的圖像/字符順序與在螢幕上繪製的順序相同 (您可以使用自訂 API 對此進行變更)。

每個按鈕的大小必須相同。 預設為標準 24x22 像素。 每個圖像/字符的大小必須相同,而且必須並排顯示於點陣圖中。 預設圖像/字符大小為 16x15 像素。 因此,若是具有 10 個按鈕的工具列 (使用標準大小),您需要寬 160 像素、高 15 像素的點陣圖。

每個按鈕只能有一個圖像/字符。 該唯一的圖像/字符會利用演算法產生不同的按鈕狀態和樣式 (例如按下、向上、向下、停用、停用向下、不定)。 理論上可以使用任何色彩的點陣圖或 DIB。 用於產生不同按鈕狀態的演算法在原始圖像是灰階時的成效最佳。 如需範例,請參閱 MFC 一般範例 美工圖案 中所提供的標準工具列按鈕和工具列按鈕美工圖案。

工具列中使用的色彩也會與《Windows 介面應用程式設計指南》的建議一致。 這些色彩未經過硬式編碼,而且會動態變更以便回應使用者在 [控制台] 中的自訂。

項目 Windows 色彩值 預設 RGB
工具列背景 COLOR_BTNFACE RGB(192,192,192)
工具列按鈕上/左邊緣 COLOR_BTNHIGHLIGHT RGB(255,255,255)
工具列按鈕下/右邊緣 COLOR_BTNSHADOW RGB(128,128,128)

此外,工具列點陣圖按鈕會重新著色,就像標準 Windows 按鈕控制項一樣。 當點陣圖從資源載入而需要回應系統色彩變更時,就會進行此重新著色,以便回應使用者在 [控制台] 中的自訂。 工具列點陣圖中的下列色彩會自動重新著色,因此應該謹慎使用。 如果您不想讓點陣圖的某部分重新著色,請使用最接近對應 RGB 值的色彩。 此對應是以實際 RGB 值為準。

RGB 值 動態對應的色彩值
RGB(000, 000, 000) COLOR_BTNTEXT
RGB(128, 128, 128) COLOR_BTNSHADOW
RGB(192, 192, 192) COLOR_BTNFACE
RGB(255, 255, 255) COLOR_BTNHIGHLIGHT

如需 建立和自訂 API 的詳細資訊,請參閱<類別庫參考>中的 CToolBar CToolBar 類別。 工具列的大部分自訂應該在初始顯示工具列之前完成。

自訂 API 可用來調整按鈕 ID、樣式、空格字元寬度,以及按鈕所使用的圖像/字符。 根據預設,您不需要使用這些 API。

CToolBar 的 CCmdUI 支援

工具列按鈕一律會透過ON_UPDATE_COMMAND_UI機制進行更新。 在閒置時間,工具列會呼叫具有該按鈕命令識別碼的 ON_UPDATE_COMMAND_UI 處理常式。 ON_UPDATE_COMMAND_UI不會針對分隔符號呼叫,但會針對按鈕和核取方塊按鈕呼叫。

ON_UPDATE_COMMAND_UI處理常式可以呼叫:

  • Enable:若要啟用或停用按鈕。 這對按鈕和核取方塊按鈕的作用相同。

  • SetCheck:若要設定按鈕的選取狀態。 為工具列按鈕呼叫此選項會將其轉換成核取方塊按鈕。 SetCheck 接受參數為 0 (未選取)、1 (已選取) 或 2 (不定)

  • SetRadioSetCheck的速記。

核取方塊按鈕是「自動」核取方塊按鈕;也就是說,當使用者按下按鈕時,這些按鈕會立即變更狀態。 「已選取」是向下或壓下的狀態。 沒有內建使用者介面方法可將按鈕變更為「不定」狀態,您必須透過程式碼來完成。

自訂 API 可讓您變更指定工具列按鈕的狀態,最好在工具列按鈕所代表命令的ON_UPDATE_COMMAND_UI處理常式中變更這些狀態。 請記住,閒置處理會隨著ON_UPDATE_COMMAND_UI處理常式變更工具列按鈕的狀態,因此透過 SetButtonStyle 所做的這些狀態所做的任何變更可能會在下次閒置後遺失。

工具列按鈕會傳送WM_COMMAND訊息,例如一般按鈕或功能表項目,而且通常會由提供ON_UPDATE_COMMAND_UI處理常式之相同類別中的ON_COMMAND處理常式處理。

用於顯示狀態的工具列按鈕樣式 (TBBS_ 值) 有四種︰

  • TBBS_CHECKED:核取方塊目前為按下 (向下)。

  • TBBS_INDETERMINATE:核取方塊目前為不定。

  • TBBS_DISABLED:按鈕目前為停用。

  • TBBS_PRESSED:按鈕目前為按下。

官方《Windows 介面應用程式設計指南》的六個按鈕樣式分別以下列 TBBS 值來表示︰

  • 向上 = 0

  • 滑鼠向下 = TBBS_PRESSED (| 任何其他樣式)

  • 停用 = TBBS_DISABLED

  • 向下 = TBBS_CHECKED

  • Down Disabled = TBBS_CHECKED |TBBS_DISABLED

  • 不定 = TBBS_INDETERMINATE

CDialogBar

對話方塊列是包含標準 Windows 控制項的控制列。 它就像是一個包含控制項,並支援在這些控制項之間使用 Tab 鍵的對話方塊。 它也像是一個使用對話方塊範本來代表該列的對話方塊。

CDialogBar 可用於預覽列印工具列,其中包含標準按鈕控制項。

使用 CDialogBar 就像是使用 CFormView。 您必須定義對話方塊列的對話方塊範本,並移除 WS_CHILD以外的所有樣式。 請注意,此對話方塊不能顯示。

CDialogBar 的控制項告知會傳送至控制列的父代 (就像是工具列按鈕)。

CDialogBar 的 CCmdUI 支援

對話方塊列按鈕應該透過ON_UPDATE_COMMAND_UI處理常式機制更新。 在閒置時間,對話方塊列會呼叫具有 ID = 0x8000的所有按鈕 > 命令識別碼的ON_UPDATE_COMMAND_UI處理常式(也就是在命令識別碼的範圍內)。

ON_UPDATE_COMMAND_UI處理常式可以呼叫:

  • Enable:若要啟用或停用按鈕。

  • SetText:若要變更按鈕的文字。

您可以透過標準視窗管理員 API 完成自訂。

另請參閱

依編號顯示的技術提示
依分類區分的技術提示