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

文章翻譯 文章翻譯
文章編號: 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
             //{{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)
    
             //{{AFX_MSG_MAP(CMyDlgBar)
             ...
             //}}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 中未列出

屬性

文章編號: 185672 - 上次校閱: 2006年11月21日 - 版次: 3.1
這篇文章中的資訊適用於:
  • Microsoft Foundation Class Library 4.2?應用於:
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
關鍵字:?
kbmt kbhowto kbmfcctrlbar kbuidesign kbwizard KB185672 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:185672
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com