共用方式為


DYNAMENU 範例:動態更新功能表

更新:2007 年 11 月

DYNAMENU 範例說明功能表及狀態列的動態修改 (無論在編譯時間是否已知道要處理命令)。DYNAMENU 說明下列功能:

  • 動態更新功能表中的項目的清單。

  • 為編譯時間仍不知 ID 的功能表命令實作與 ON_COMMANDON_UPDATE_COMMAND_UI 處理常式相等的處理常式。這個說明可以套用至更複雜的情況,例如,使用者可設定的功能表。

  • 更新在編譯時間仍不知 ID 的命令的狀態列命令提示字元。

安全性注意事項:

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

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

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

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

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

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

建置和執行範例

若要建置並執行 DYNAMENU 範例

  1. 開啟 dynamenu.sln 方案。

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

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

DYNAMENU 一開始會顯示一個含有下列文字的視窗:"This text is displayed in the current color."。您可以藉由選取 [Color] 功能表中一開始提供的四個項目的其中一個來變更顯示文字的色彩:[Black]、[Red]、[Purple] 或 [Blue]。

若要練習 DYNAMENU 的動態功能表更新功能,請按一下 [Color] 功能表的 [Change Color Options],開啟 [Change Color Options] 對話方塊。[Black]、[Red]、[Purple] 及 [Blue] 這些核取方塊可以讓您選擇 [Color] 功能表中以動態方式提供的色彩。例如,如果您清除 [Red] 和 [Purple],然後返回 [Color] 功能表,那麼功能表中將只會提供 [Black] 和 [Blue] 項目。

請注意狀態列顯示的方式,例如,當焦點是在 [Color] 功能表中的 [Black] 項目上時,即為 "Set current color text to Black"。

動態更新功能表中的項目的清單

Mdichild.cpp 中的 CDynaMDIChildWnd 類別會實作 [Color] 功能表中項目的動態更新。在更新可用的色彩清單或啟動 MDI 子視窗之後,CDynaMDIChildWnd::RefreshColorMenu 函式就會呼叫 CMenu::DeleteMenu,以刪除功能表中的每一個色彩項目,接著再使用 CMenu::AppendMenu 將目前可用的色彩加入至功能表。

實作動態功能表項目的命令處理常式

DYNAMENU 可能已經藉由保留色彩 (ID_COLOR_BLACKID_COLOR_RED 等等) 命令 ID 的固定清單完成實作。在這種情況下,ON_COMMANDON_UPDATE_COMMAND_UI 處理常式可能會像一般情形,為色彩命令完成實作。這是實作 DYNAMENU 最直接的方式。

不過,為了示範說明,DYNAMENU 不會使用固定的命令 ID。相反地,DYNAMENU 會動態地指定在編譯時間未知或是和功能表項目關聯的命令 ID。這個說明可以套用至更複雜的情況,例如,使用者可設定的功能表。

相等於 ON_COMMANDON_UPDATE_COMMAND 訊息對應的處理會在文件的 CCmdTarget::OnCmdMsg 覆寫中實作。如果以 AFX_CMDHANDLERINFO* 參數的 NULL 指標呼叫 OnCmdMsg 函式,表示沒有找到命令的訊息對應項目。在這種情況下,OnCmdMsg 的覆寫會檢查做為第一個參數傳遞的命令 ID 是否為色彩功能表項目中動態指定的命令 ID。如果是,覆寫就會根據傳遞到 OnCmdMsg 的第二個參數是否為 MFC 定義的 CN_COMMANDCN_UPDATE_COMMAND_UI,呼叫命令處理常式 (DoSelectColor) 或命令使用者介面處理常式 (DoUpdateSelectColor)。

更新動態功能表項目的狀態列命令提示字元

在 DYNAMENU 中,MDI 子視窗 (CDynaMDIChildWnd) 擁有狀態列。CFrameWnd::GetMessageString 的預設實作會使用目前顯示的命令 ID (對目前在功能表中具有焦點的項目而言) 來取得命令的對應字串資源,並將它顯示在狀態列的第一個窗格內。DYNAMENU 會覆寫 GetMessageString 來顯示以動態方式定義之命令的命令提示字元。

關鍵字

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

AfxFormatString1; AfxGetMainWnd; CCmdTarget::OnCmdMsg; CDialog::DoModal; CDialog::OnInitDialog; CDocument::GetFirstViewPosition; CDocument::GetNextView; CDocument::OnNewDocument; CDocument::UpdateAllViews; CFrameWnd::Create; CFrameWnd::GetActiveDocument; CFrameWnd::GetMessageString; CFrameWnd::LoadFrame; CMenu::AppendMenu; CMenu::DeleteMenu; CMenu::GetMenuItemCount; CMenu::GetMenuItemID; CMenu::GetSubMenu; CObject::AssertValid; CObject::Dump; CObject::Serialize; CString::LoadString; CView::DoPreparePrinting; CView::GetDocument; CView::OnBeginPrinting; CView::OnDraw; CView::OnEndPrinting; CView::OnPreparePrinting; CWinApp::AddDocTemplate; CWinApp::EnableShellOpen; CWinApp::InitInstance; CWinApp::LoadStdProfileSettings; CWinApp::RegisterShellFileTypes; CWnd::CenterWindow; CWnd::DoDataExchange; CWnd::GetClientRect; CWnd::GetDlgItem; CWnd::GetMenu; CWnd::GetParentFrame; CWnd::OnCreate; CWnd::SetWindowText; CWnd::ShowWindow; CWnd::UpdateWindow; DragAcceptFiles; DrawText; LoadBitmap; RGB; SetBkMode; SetTextColor

注意事項:

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

請參閱

其他資源

MFC 範例