此文档基于能巴的CDialogBar的使用方法(https://www.cnblogs.com/mysunnyday/archive/2012/02/07/2341867.html)修改补充。
创建CDialogBar对话框主要分为如下几个步骤:
一、创建对话框资源;
二、为对话框添加新的派生类;
三、修改派生类;
四、修改初始化函数;
五、在框架类中实现派生类的对象化。
下面我将根据自己实际操作具体讲解一下(VC++ 6.0)
一、创建对话框资源
2.在资源视图中,添加一个新的对话框,将其名称改为IDD_DATASTATUS。并将其风格(Style)属性设置为Child,边界属性选择None。其余属性选择默认。
二、为对话框添加新的派生类
注意:在为对话框添加新类时,可能会提示无法创建的情况。此时只需将整个程序编译运行后重新添加即可。
三、修改派生类;
分别在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文件中修改代码。
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;之后)
然后编译运行,就大功告成。界面如下图: