如何初始化派生 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
             //{{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. 调用在方法中 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如何从类向导中未列出的类派生

属性

文章编号: 185672 - 最后修改: 2006年11月21日 - 修订: 3.1
这篇文章中的信息适用于:
  • Microsoft Foundation Class Library 4.2?当用于
    • Microsoft Visual C++ 5.0 企业版
    • Microsoft Visual C++ 6.0 企业版
    • Microsoft Visual C++ 5.0 专业版
    • Microsoft Visual C++ 6.0 专业版
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
关键字:?
kbmt kbhowto kbmfcctrlbar kbuidesign kbwizard KB185672 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 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