CDialogBar的创建

此文档基于能巴CDialogBar的使用方法(https://www.cnblogs.com/mysunnyday/archive/2012/02/07/2341867.html)修改补充。

创建CDialogBar对话框主要分为如下几个步骤:

一、创建对话框资源;

二、为对话框添加新的派生类;

三、修改派生类;

四、修改初始化函数;

五、在框架类中实现派生类的对象化。

下面我将根据自己实际操作具体讲解一下(VC++ 6.0)

一、创建对话框资源

           CDialogBar的创建_第1张图片

2.在资源视图中,添加一个新的对话框,将其名称改为IDD_DATASTATUS。并将其风格(Style)属性设置为Child,边界属性选择None。其余属性选择默认。

 

二、为对话框添加新的派生类

CDialogBar的创建_第2张图片

注意:在为对话框添加新类时,可能会提示无法创建的情况。此时只需将整个程序编译运行后重新添加即可。

  1. 首先创建一个单文档的MFC应用程序,如图所示  

三、修改派生类;

分别在DataStatus.h和.cpp文件中修改继承关系。

1.在DataStatus.h头文件中,

将class CDataStatus : public CDialog  改为class CDataStatus : public CDialogBar

2.在DataStatus.cpp文件中,

 

将CDataStatus::CDataStatus(CWnd* pParent /*=NULL*/)

: CDialog(CDataStatus::IDD, pParent)

{

       //{{AFX_DATA_INIT(CDataStatus)

              // NOTE: the ClassWizard will add member initialization here

       //}}AFX_DATA_INIT

}

改为

CDataStatus::CDataStatus(CWnd* pParent /*=NULL*/)
{
       //{{AFX_DATA_INIT(CDataStatus)
              // NOTE: the ClassWizard will add member initialization here
       //}}AFX_DATA_INIT
}

将void CDataStatus::DoDataExchange(CDataExchange* pDX)

{
       CDialog::DoDataExchange(pDX);

       //{{AFX_DATA_MAP(CCurrentCheckDlg)

       ………..

       //}}AFX_DATA_MAP

}

改为

void CDataStatus::DoDataExchange(CDataExchange* pDX)
{
       //{{AFX_DATA_MAP(CCurrentCheckDlg)
       ………….
       //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDataStatus, CDialog)修改为BEGIN_MESSAGE_MAP(CDataStatus, CDialogBar)

四、修改初始化函数;

首先在ClassWizard的MessageMap中对消息该CDataStatus类的WM_INITDIALOG消息添加处理函数默认名为OnInitDialog。然后选择editcode进入DataStatus.cpp文件中修改代码。

CDialogBar的创建_第3张图片

 

1、             添加消息映射函数。由于对话框形式的初始化函数消息并未加载到消息映射内,为此我们需要手工添加,要不然代码无法拦截该工具条的初始化消息,形式如下:

将BEGIN_MESSAGE_MAP(CDataStatus, CDialog)

   //{{AFX_MSG_MAP(CDataStatus)

   .......

   //}}AFX_MSG_MAP

END_MESSAGE_MAP()

改为:

BEGIN_MESSAGE_MAP(CDataStatus, CDialogBar)

 

   //{{AFX_MSG_MAP(CDataStatus)

 

   .......

 

   ON_MESSAGE(WM_INITDIALOG,OnInitDialog)

 

   //}}AFX_MSG_MAP

 

END_MESSAGE_MAP()

 

2、             修改OnInitDialog函数,此函数并未传递参数,但是在这里我们需要让它传递参数,代码如下修改

将BOOL CDataStatus::OnInitDialog()

{

   CDialogBar::OnInitDialog();

  

   // TODO: Add extra initialization here

   return TRUE;  // return TRUE unless you set the focus to a control

              // EXCEPTION: OCX Property Pages should return FALSE

}

改为:

BOOL CDataStatus::OnInitDialog(UINT wParam,LONG lParam)

 

{

 

   //CDialogBar::OnInitDialog();

 

  

 

   // TODO: Add extra initialization here

 

   BOOL bRet = HandleInitDialog(wParam,lParam);

 

   if (!UpdateData(FALSE))

 

   {

 

          TRACE("InitCDataStatus Failed!");

 

   }

 

   return TRUE;  // return TRUE unless you set the focus to a control

 

                 // EXCEPTION: OCX Property Pages should return FALSE

 

}

然后在DataStatus.cpp对CDataStatus::OnInitDialog声明也要做修改

virtual BOOL OnInitDialog();修改为virtual BOOL OnInitDialog(UINT wParam,LONG lParam);

 

五、在框架类中实现派生类的对象化。

1.在MainFrm.h文件里声明实例对象,进行实例化:CDataStatus      m_wndDataStatus;(头文件中需要添加#include "DataStatus.h")

2.在MainFrm.cpp文件里,在框架类的OnCreate函数内创建对象并将对象绑定对话框资源,本例实例如下:

 

if (!m_wndDataStatus.Create(this,IDD_DATASTATUS,WS_VISIBLE|WS_CHILD

 

|CBRS_SIZE_DYNAMIC|CBRS_BOTTOM,IDD_DATASTATUS))

 

       {

 

              TRACE0("Failed to create CDataStatus bar!");

 

              return -1;

 

       }

3.重写框架类的OnCmdMsg虚函数。如果不重写该函数,那么不光DDX功能无法实现,连最基本的OnCommand事件都无法实现。(可能你的MainFrm.cpp里并无OnCmdMsg函数,此时需手动添加。也可以在类向导里添加,添加方式跟步骤四中为WM_INITDIALOG消息添加处理函数默认名为OnInitDialog方式相同。这里介绍手动添加方式)

1.在.cpp文件里,添加如下代码

BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)

{

       // TODO: Add your specialized code here and/or call the base class

       if (m_wndDataStatus.OnCmdMsg(nID,nCode,pExtra,pHandlerInfo))

              return    TRUE;

       return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);

在.h 文件里,对其进行声明,添加如下代码;

virtual     BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);(可放在virtual void Dump(CDumpContext& dc) const;之后)

 

然后编译运行,就大功告成。界面如下图:

CDialogBar的创建_第4张图片

 

 

 

 

你可能感兴趣的:(CDialogBar的创建)