你目前正处于脱机状态,正在等待 Internet 重新连接

如何初始化派生 CDialogBar 中的子控件

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

185672
概要
创建简单 CDialogBar,如一个具有唯一 CButtons 类似于 MFC 的预览时不需要从 CDialogBar 派生,因为 CControlBar 的父项接收来自任何子控件的通知消息。

但是,在一个更复杂的 CDialogBar,可能有一个下拉组合框、 树视图或 ActiveX 控件的情况下可能有用来提供子控件的初始化 CDialogBar 从派生。

因为类向导不支持从 CDialogBar 派生类,这篇文章将显示该步骤了为所需从 CDialog 创建一个类,然后将"转换"类为 CDialogBar。
更多信息
若要开始时,创建与您要使用的子控件的 CDialog 类。您可以将 CDialog 类转换 CDialogBar 类使用以下的 9 个步骤:

  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. 删除"虚拟 OnInitDialog() BOOL ; 将从类标头,并添加"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. 调用在方法中 CFrameWnd::OnCreate() m_myDlgBar 变量的创建方法类似于以下内容:
          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如何从类向导中未列出的类派生