您目前已離線,請等候您的網際網路重新連線

如何初始化中衍生 CDialogBar 子控制項

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

185672
結論
建立一個含有唯一 CButtons 類似於 MFC 的列印預覽例如的一個簡單 CDialogBar 時並不需要衍生自 CDialogBar,因為父代 CControlBar 從任何子控制項接收告知訊息。

不過,可能會有一個下拉式清單方塊、 樹狀檢視或 ActiveX 控制項,豬最喜歡一個更複雜 CDialogBar 的情況下它可能會有用衍生自 CDialogBar 提供子控制項的初始設定。

因為 ClassWizard 並不支援從 CDialogBar 衍生類別,本文章將顯示需要將從 CDialog 建立類別,然後將 「 轉換 」 類別 CDialogBar 步驟。
其他相關資訊
若要開始,建立 CDialog 類別,與您想要使用的子控制項。您可以將 CDialog 類別變身 CDialogBar 類別,使用下列的九個步驟:

  1. 變更基底類別從 CDialog 為 CDialogBar 類別宣告中。別忘了也變更基底類別中 BEGIN_MESSAGE_MAP.cpp 檔中。
  2. 變更.h 和.cpp 檔中的建構函式。也在 DoDataExchange() 進行的變更。以下是變更的三個項目。

    變更從
          CMyDlgBar (CWnd* pParent = NULL);   // standard constructor      CMyDlgBar:: CMyDlgBar (CWnd* pParent /*=NULL*/)         : CDialog(CMyDlgBar::IDD, pParent)      {         ...      void CMyDlgBar::DoDataExchange(CDataExchange* pDX)      {         CDialog::DoDataExchange(pDX);         ...					
    下列:
          CMyDlgBar ();   // standard constructor      CMyDlgBar:: CMyDlgBar ()      {         ...      void CMyDlgBar::DoDataExchange(CDataExchange* pDX)      {         CDialogBar::DoDataExchange(pDX);         ...					
    給轉換的機碼是 WM_INITDIALOG 訊息對應方法虛擬 OnInitDialog() 成員函式的轉換,藉由變更 OnInitDialog 方法以及加入 ON_MESSAGE() 處理常式。您可能沒有 OnInitDialog() 的覆寫。如果沒有,新增一個再繼續。
  3. 移除 「 虛擬 BOOL OnInitDialog();"從類別標頭檔並加入"afx_msg LONG OnInitDialog (UINT,LONG);"在其位置。例如:
          class CMyDlgBar : public CDialogBar      {         ...      // Implementation      protected:         // Generated message map functions         //<AngularNoBind>{{</AngularNoBind>AFX_MSG(CMyDlgBar)         virtual BOOL OnInitDialog();                // <-Remove this line.         //}}AFX_MSG         afx_msg LONG OnInitDialog ( UINT, LONG );   // <-Add this line.         DECLARE_MESSAGE_MAP()      };						
    立即,類別實作一節中進行相對應的變更。
  4. 新增 「 ON_MESSAGE WM_INITDIALOG (OnInitDialog);".CPP 實作檔案中的訊息對應表。例如:
          BEGIN_MESSAGE_MAP(CMyDlgBar, CDialogBar)         //<AngularNoBind>{{</AngularNoBind>AFX_MSG_MAP(CMyDlgBar)         ...         //<AngularNoBind>}}</AngularNoBind>AFX_MSG_MAP         ON_MESSAGE(WM_INITDIALOG, OnInitDialog )    // <-- Add this line.      END_MESSAGE_MAP()						
    立即,將虛擬 OnInitDialog() 轉換為訊息對應 OnInitDialog()。
  5. 請 OnInitDialog() 轉換,如下所示:
       Change the following:      BOOL CMyDlgBar::OnInitDialog()      {         CDialog::OnInitDialog();   // <-- Replace this line:            ...						
    下列:
    LONG CMyDlgBar::OnInitDialog ( UINT wParam, LONG lParam)         {                          // <-- with these lines. -->            BOOL bRet = HandleInitDialog(wParam, lParam);            if (!UpdateData(FALSE))            {               TRACE0("Warning: UpdateData failed during dialog init.\n");            }            ...            return bRet;						
    [CDialogBar 類別不具有虛擬 OnInitDialog(),且因此呼叫其中一個仍無法解決問題。UpdateData 呼叫以子類別化,或初始化任何子控制項。
  6. 請確定對話方塊方塊資源樣式所示:
    樣式: 子系
    boarder: 無
    看得見: 未核取
    重新在此時一切都已連線進行轉換從 CDialog 類別至 CDialogBar 類別正確運作。現在,建立並使用它。
  7. 將衍生 CDialogBar 的執行個體加入至 (通常稱為 CMainFrame) CframeWnd 衍生的類別。例如:
          class CMainFrame : public CFrameWnd      {          ...          CMyDlgBar m_myDlgBar;          ...      };					
  8. 為 m_myDlgBar 變數 CFrameWnd::OnCreate() 方法中的建立方法呼叫如下所示:
          int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)      {         ...         if (!m_myDlgBar.Create(this, IDD_DLGBAR1, CBRS_LEFT,            IDD_DLGBAR1))         {            TRACE0("Failed to create dialog bar\n");            return -1;      // fail to create         }         ...      }					
  9. 最後,如果希望以支援動態停駐和調整大小的 [CDialogBar 再將下列幾行新增到 CMainFrame::OnCreate() 結尾:
          int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)      {         ...         m_myDlgBar.SetBarStyle(m_wndToolBar.GetBarStyle() |            CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);         m_myDlgBar.EnableDocking(CBRS_ALIGN_ANY);         DockControlBar(&m_myDlgBar);         return 0;      }
参考
如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
99161如何衍生自類別 ClassWizard 中未列出