共用方式為


DLGCBR32 範例:示範將狀態列和工具列加入至對話方塊

更新:2007 年 11 月

DLGCBR32 範例示範如何將狀態列及工具列加入至對話方塊。此外,它會顯示和使用非強制回應對話方塊做為 MFC 應用程式主視窗相關的幾種技術。

在 MFC 應用程式中,您可以將控制列 (例如狀態列和工具列) 附加到框架視窗。不過,簡單的對話方塊式使用者介面對大部分的應用程式來說已經夠用了。MFC 並沒有提供將控制列加入至對話方塊的內建支援。

安全性注意事項:

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

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

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

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

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

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

建置和執行範例

若要建置並執行 DLGCBR32 範例

  1. 開啟 Dlgcbr32.sln 方案。

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

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

將控制列加入至對話方塊

若要將控制列加入至對話方塊,請依照一般方式建立控制列,然後在對話方塊工作區內騰出供控制列使用的空間。若要讓控制列正常運作,對話方塊必須複製框架視窗的部分功能。如果您希望 ON_UPDATE_COMMAND_UI 處理常式能夠用於控制列,您也必須同時衍生新的控制列類別並處理 WM_IDLEUPDATECMDUI 訊息。如果您的對話方塊不是應用程式的主視窗,您也必須修改其父框架視窗,以便將 WM_IDLEUPDATECMDUI 訊息傳遞給對話方塊的控制列。

若要在對話方塊工作區內騰出供控制列使用的空間,請在對話方塊的 OnInitDialog 函式中依照下列步驟進行:

  1. 建立控制列。藉由使用 RepositionBars 的 reposQuery 選項,了解該控制列需要使用多少空間。

    CRect rcClientStart;
    CRect rcClientNow;
    GetClientRect(rcClientStart);
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST,
                   AFX_IDW_CONTROLBAR_LAST,
                   0, reposQuery, rcClientNow);
    
  2. 在對話方塊中移動控制項,計算控制列在工作區頂端或左邊所需使用的空間。如果對話方塊包含一個功能表,您就必須計算該功能表所需使用的空間。

    CPoint ptOffset(rcClientNow.left - rcClientStart.left,
                    rcClientNow.top - rcClientStart.top);
    CRect rcChild;
    CWnd* pwndChild = GetWindow(GW_CHILD);
    while (pwndChild)
        {
           pwndChild->GetWindowRect(rcChild);
           ScreenToClient(rcChild);
           rcChild.OffsetRect(ptOffset);
           pwndChild->MoveWindow(rcChild, FALSE);
           pwndChild = pwndChild->GetNextWindow();
        }
    
  3. 將對話方塊視窗尺寸增加到控制列所需使用的空間數量。

    CRect rcWindow;
    GetWindowRect(rcWindow);
    rcWindow.right += rcClientStart.Width() - rcClientNow.Width();
    rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height();
    MoveWindow(rcWindow, FALSE);
    
  4. 使用 RepositionBars 來將控制列的位置固定。

若要以功能表項目文字來更新狀態列的第一個窗格,您必須在您的對話方塊類別中處理 WM_MENUSELECTWM_ENTERIDLEWM_SETMESSAGESTRINGWM_POPMESSAGESTRING。您必須為這些訊息複製 CFrameWnd 處理常式的功能。如需這些訊息處理常式的說明範例,請參閱範例程式中的 CModelessMain 類別。

為了顯示工具列按鈕的工具提示,您必須處理 TTN_NEEDTEXTWTTN_NEEDTEXTA 告知。

若要讓 ON_UPDATE_COMMAND_UI 處理常式能配合其他狀態列窗格及工具列按鈕使用,您必須衍生新的控制列類別,並實作 WM_IDLEUPDATECMDUI 的訊息處理常式。由於 OnUpdateCmdUI 的預設控制列實作會假設父視窗是框架視窗,因此這是必要的動作。然而,OnUpdateCmdUI 只會將父視窗指標傳遞到只需要 CCmdTarget 指標的函式,而不會執行其他動作。因此,您可以暫時通知 OnUpdateCmdUI,說明您正在提供給它的父視窗指標是一個 CFrameWnd 指標,以符合編譯器的要求。例如:

LRESULT CDlgToolBar::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM lParam)
{
   if (IsWindowVisible())
   {
      CFrameWnd* pParent = (CFrameWnd*)GetParent();
      if (pParent)
         OnUpdateCmdUI(pParent, (BOOL)wParam);
   }
   return OL;
}

若要將 WM_IDLEUPDATECMDUI 訊息傳遞至主視窗以外的對話方塊,請在框架視窗類別中儲存對話方塊指標,並在該類別中建立 WM_IDLEUPDATECMDUI 處理常式。該處理常式會藉由使用 CWnd::SendMessageToDescendants,將 WM_IDLEUPDATECMDUI 訊息傳送到對話方塊子視窗。接著在框架視窗內執行訊息的預設處理。

注意事項:

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

請參閱

其他資源

MFC 範例