CTRLBARS 範例:說明自訂控制列

更新:2007 年 11 月

CTRLBARS 範例說明各式各樣的控制列 (Control Bar) 自訂選項:

  • 框架視窗 (Frame Window) 的多種控制列、可選擇性地隱藏或顯示控制列,以及沿著框架視窗框線的動態重新排列控制項。控制列的空間是根據其疊置順序 (Z-order) 配置在框架視窗中,一開始該順序是其建立的順序 (請參閱 CMainFrame::OnCreate)。CTRLBARS 會使用 CWnd::SetWindowPos 函式來變更對話方塊列的疊置順序。它使用 CWnd::ShowWindow 隱藏或顯示控制列。每當 CTRLBARS 變更疊置順序或是隱藏或顯示控制列時,它會隨後呼叫 CFrameWnd::RecalcLayout,使視窗的實際定位重新配置到剩餘可見的控制列。

  • 自訂工具列、動態重新排列工具列的按鈕,以及將控制項 (例如,下拉式方塊) 加入至工具列。CTRLBARS 會示範兩種自訂工具列的方法。第一個工具列,即工具列會在短 (5 個按鈕) 或長 (10 個按鈕) 之間變更按鈕的配置。CTRLBARS 會為每個按鈕呼叫 CToolBar::SetButtonInfo,使其對應到工具列點陣圖上的並排位置和命令識別資料。第二個工具列即樣式列 (Style Bar),將說明用一個控制項 (在本例中為下拉式方塊) 取代工具列按鈕 (或分隔符號)。CMainFrame::CreateStyleBar 會建立一個 100 像素寬的工具列分隔符號。接著建立下拉式方塊 (IDW_COMBO) 做為工具列的子控制項,並將下拉式方塊的位置設定在分隔符號的所在位置。

  • 自訂狀態列、自訂指示器,並傳送文字到訊息行。針對狀態列,舉例來說,如果您指定 ID_INDICATOR_CAPS 做為以 indicators[ ] 陣列傳遞到 CStatusBar::SetIndicators 的其中一個識別項,這個架構便會自動地更新 CAP LOCK、NUM LOCK 或 SCROLL LOCK 指示器。CTRLBARS 會說明以覆寫 (OVR) 狀態 (使用者可用 INSERT 鍵進行切換) 來擴充標準狀態列指示器。這個動作需要 ID_TOGGLE_INSERT 命令的訊息處理常式 (Message Handler,對應至 VK_INSERT 鍵),以及在重打 (Overstrike) 模式開啟時為顯示 "OVR" 文字所需的資源字串 (ID_INDICATOR_OVR)。資源識別項 ID_INDICATOR_OVR 是預先定義的 MFC 常數。

  • 對話方塊列是一種由對話方塊資源範本定義配置的控制列。在任何控制列中,對話方塊列控制項的告知會傳送到對話方塊列的擁有人,即主框架視窗 (Main Frame Window)。例如,CMainFrame::OnSelChangePaletteCBN_SELCHANGE 告知 (來自對話方塊列的下拉式方塊控制項) 的處理常式。CMainFrame 也同時具有三個隱藏/顯示 (Hide/Show) 核取方塊的其中兩個 (StylesPalette) 的處理常式。您不需要為第三個核取方塊 [隱藏/顯示工具列] 編寫處理常式,因為此種架構會提供標準的 ID_VIEW_TOOLBAR 處理常式。

  • 浮動工具列調色盤 (Floating tool palette) 的運作方式和工具列相似,但它會顯示一個工具按鈕的二維陣列,且浮動方式像在主控框架視窗上方的非強制回應 (Modeless) 視窗。浮動工具列調色盤實作於可重複使用的 CPaletteBar 類別 (衍生自 CToolBar)。CToolBar 的衍生動作使得 CPaletteBar 具有工具列按鈕行為。實作於 CPaletteBar 的特有調色盤行為,包括:

    • 浮動 (WS_POPUP) 視窗樣式。

    • 工具按鈕配置成列和欄的二維配置:建立、繪製和按鈕點擊測試 (Hit Testing)。

    • 細的 (無文字) 標題列。

    • 使用追蹤矩形的可移動工具板。

  • CTRLBARS 也會使用 ON_COMMAND_EXON_UPDATE_COMMAND_UI_RANGE 進行說明。如需 CTRLBARS 所說明的大部分控制列自訂選項之討論內容,請參閱技術提示 31

安全性注意事項:

這個程式碼範例僅供概念說明之用,同時因為範例中的程式碼撰寫並沒有周全的顧及所有安全性問題,所以本範例不適用於實際執行的應用程式或網站中。如果使用者擅自將範例程式碼用於其他意圖而導致連帶事件或重大損害時,Microsoft 將不承擔任何責任。

若要取得範例和指示以便進行安裝:

  • 按一下 Visual Studio [說明] 功能表上的 [範例]。

    如需詳細資訊,請參閱尋找範例檔案

  • 最新版的完整範例清單可從 Visual Studio 2008 範例網頁 (英文) 取得。

  • 您也可以將範例置於電腦硬碟中。根據預設,範例和讀我檔案都會複製到 \Program Files\Visual Studio 9.0\Samples\ 下的資料夾中。對於所有的 Visual Studio Express 版,所有範例都可在線上找到。

建置和執行範例

若要建置並執行 CTRLBARS 範例

  1. 開啟 Ctrlbars.sln 方案。

  2. 在 [建置] 功能表上按一下 [建置]。

  3. 在 [偵錯] 功能表上按一下 [啟動但不偵錯]。

第一次執行 CTRLBARS 時,所有的各種控制項都是可見的。

  • 緊接在功能表列下方的是具有 5 個按鈕的工具列。第一個按鈕 (粗向上箭號) 可以在短 (5 個按鈕) 和長 (10 個按鈕) 之間切換工具列配置。除了這第一個 [Short/Long] 按鈕和 [Help] 按鈕 (用來開啟 [About] 方塊) 之外,其他按鈕會一直處於非現用狀態。

  • 第二個工具列緊接在第一個工具列的下方。這個工具列稱為樣式列 (Style Bar),您可在這個工具列指定下列其中一種文字對齊樣式 ─ 靠左對齊 (Left)、置中 (Centered)、靠右對齊 (Right) 或是左右對齊 (Justified)。選取其中一種樣式只會變更樣式列 (Style Bar) 的狀態,並無其他作用。

  • 狀態列位於視窗的底端。

  • 浮動調色盤 (具有 3 x 4 陣列的工具按鈕) 位於視窗的頂端。

  • 對話方塊列位於視窗的左框線上。它是一個對話方塊,因為這個控制列的配置定義於對話方塊樣板資源 (IDD_VIEW_SELECT)。

[View] 功能表可讓您隱藏或顯示前四個控制列中的任何一個。對話方塊列則永遠可見。[Tools]、[Styles] 和 [Palette] 控制列的隱藏/顯示狀態會立即反映在對話方塊列的 [Hide/Show] 核取方塊中。您也可以切換其他控制列的核取方塊來隱藏或顯示其中一個控制列。

您可利用 [View] 功能表的 [Dlg Bar Top] 命令來重新排列控制列,使得對話方塊列可位於控制列疊置順序的頂端。當對話方塊列在頂端時,它會沿著視窗的整條左框線 (功能表和標題列除外) 延伸。兩個工具列的左邊終點會接觸到對話方塊列。當對話方塊列回復到其原來的疊置順序位置 (在其他所有控制列之後) 時,對話方塊列的頂端會接觸到第二個工具列的下緣,而對話方塊列的底端會接觸到狀態列的上緣。這反映了控制列是依照視窗實際定位、先到先服務 (First-Come,First Serve) 原則進行配置的基本演算法。

[Style] 功能表可讓您在靠左、置中、靠右或是對齊這四種文字對齊樣式中,選擇一種。您所做的任何選項都會立即反映在樣式列的下拉式方塊及對應的按鈕中。同樣地,您也可以選擇樣式列下拉式方塊的其中一種樣式或按四個按鈕的其中一個來選取。新的選取項目會立即反映在其他控制項的狀態和 [Style] 功能表中。

[Palette] 功能表可讓您將調色盤的工具配置從 3 x 4 變成 2 x 6。

當您從 [Palette] 中選取某項工具時,狀態列訊息行即顯示 "You have selected the <type> tool",其中 <type> 表示您在 12 項工具中所選取的項目。這項選取會反映在對話方塊列的下拉式方塊中。您也可以使用下拉式方塊來選取工具。

狀態列除了會顯示最近選取的工具之外,也會顯示三個鍵 (INS、CAPS LOCK 和 NUM LOCK) 的狀態。

關鍵字

本範例會使用下列關鍵字:

AfxFormatString1; AfxGetApp; AfxIsValidAddress; AfxRegisterWndClass; AfxThrowResourceException; BitBlt; CBrush::CreateSolidBrush; CCmdUI::ContinueRouting; CCmdUI::Enable; CCmdUI::SetCheck; CCmdUI::SetText; CComboBox::AddString; CComboBox::Create; CComboBox::GetCurSel; CComboBox::GetLBText; CComboBox::SetCurSel; CControlBar::GetBarStyle; CControlBar::SetBarStyle; CDC::Attach; CDC::Detach; CDC::PatBlt; CDC::RectVisible; CDialogBar::Create; CDumpContext::GetDepth; CFont::CreateFontIndirect; CFrameWnd::LoadFrame; CFrameWnd::RecalcLayout; CFrameWnd::SetMessageText; CGdiObject::Attach; CObject::AssertValid; CObject::Dump; CRect::Height; CRect::InflateRect; CRect::SetRectEmpty; CRect::Width; CStatusBar::Create; CStatusBar::GetPaneInfo; CStatusBar::SetIndicators; CStatusBar::SetPaneInfo; CString::LoadString; CToolBar::CToolBar; CToolBar::CommandToIndex; CToolBar::Create; CToolBar::GetButtonInfo; CToolBar::GetItemID; CToolBar::GetItemRect; CToolBar::LoadBitmap; CToolBar::SetButtonInfo; CToolBar::SetButtons; CToolBar::SetHeight; CToolBar::SetSizes; CWinApp::InitInstance; CWinApp::OnIdle; CWnd::ClientToScreen; CWnd::CreateEx; CWnd::GetCapture; CWnd::GetClientRect; CWnd::GetDC; CWnd::GetDlgItem; CWnd::GetOwner; CWnd::GetParentFrame; CWnd::GetSafeHwnd; CWnd::GetStyle; CWnd::GetWindowRect; CWnd::Invalidate; CWnd::InvalidateRect; CWnd::OnCancelMode; CWnd::OnCreate; CWnd::OnLButtonDown; CWnd::OnMouseActivate; CWnd::OnMouseMove; CWnd::OnSysColorChange; CWnd::PreCreateWindow; CWnd::ReleaseDC; CWnd::SendMessage; CWnd::SetCapture; CWnd::SetFont; CWnd::SetWindowPos; CWnd::ShowWindow; CWnd::UpdateDialogControls; CWnd::UpdateWindow; CreateBitmap; CreateCompatibleBitmap; CreateCompatibleDC; CreateDIBitmap; CreatePatternBrush; CreatePen; CreateSolidBrush; DeleteDC; DeleteObject; FillRect; FindResource; FrameRect; FreeResource; GetActiveWindow; GetBValue; GetCapture; GetDC; GetDeviceCaps; GetGValue; GetNextWindow; GetObjectType; GetParent; GetRValue; GetStockObject; GetSysColor; GetSystemMetrics; GetVersion; GetWindow; HIBYTE; InvertRect; LOBYTE; LoadCursor; LoadIcon; LoadResource; LockResource; MAKEINTRESOURCE; OffsetRect; PatBlt; RGB; ReleaseCapture; ReleaseDC; SelectObject; SendMessage; SetActiveWindow; SetBkColor; SetCapture; SetROP2; SetRect; SetTextColor; StretchDIBits; UpdateWindow; free; lstrcpy; malloc; memcpy; memset

注意事項:

部分範例 (包括本範例) 尚未經過改寫,無法反映出目前在 Visual C++ 精靈、程式庫以及編譯器方面的變更,不過還是可以示範如何完成您要進行的工作。

請參閱

其他資源

MFC 範例