1. 创建对话框资源:在对话框资源编辑器内生成一个Dialog资源,并将其风格(Style)属性必须设置为Child,不能设置为Overlapped或Popup(把原有的Dialog属性改一下);
2. 建立关于次对话框的类CDlgMircoImage,由于可选项只有CDialog,没有CDialogBar;所以选择CDialog作为基类
3. 修改:修改派生类以CDialogBar为基类(添加手动)
如下;
1). class CDlgMircoImage : public CDialog 改为class CDlgMircoImage: public CDialogBar
2). 将CDlgMircoImage:: CDlgMircoImage (CWnd* pParent /*=NULL*/)
: CDialog(CDlgMircoImage::IDD, pParent)修改(方法一:把CDialog改成CDialogBar;方法二:把这一行注释掉如//: CDialog(CDlgMircoImage::IDD, pParent))
{
//{{AFX_DATA_INIT(CDlgMircoImage)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
3). void CDlgMircoImage::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX); ///把这一行注释掉如// CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCurrentCheckDlg)
………..
//}}AFX_DATA_MAP
}
3). 重新初始化函数
首先在ClassWizard的MessageMap中对消息该CDlgMircoImage类的WM_INITDIALOG消息添加处理函数默认名为OnInitDialog。手工修改代码如下:
1、 添加消息映射函数。由于对话框形式的初始化函数消息并未加载到消息映射内,为此我们需要手工添加,要不然代码无法拦截该工具条的初始化消息,形式如下:
将BEGIN_MESSAGE_MAP(CDlgMircoImage, CDialogBar)
//{{AFX_MSG_MAP(CDlgMircoImage)
....... //添加:ON_MESSAGE(WM_INITDIALOG,OnInitDialog)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
2修改OnInitDialog函数,此函数并未传递参数,但是在这里我们需要让它传递参数,代码如下修改
BOOL CDlgMircoImage::OnInitDialog(UINT wParam,LONG lParam)
{
//CDialogBar::OnInitDialog();
// TODO: Add extra initialization here
//以下部分手动添加
BOOL bRet = HandleInitDialog(wParam,lParam);
if (!UpdateData(FALSE))
{
TRACE("Init CDlgMircoImage Failed!");
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
4. 首先,在框架类的头文件内声明实例对象,本例实例化:CDlgMircoImage m_pNavigator;当然头文件中不可避免要包含新派生类的头文件。
其次,在框架类的OnCreate函数内创建对象并将对象绑定对话框资源。形式与创建ToolBar原理一样,本例实例如下:
if (!m_pNavigator.Create(this, IDD_DIALOG_IMAGE_MICRO
|CBRS_SIZE_DYNAMIC|CBRS_BOTTOM, IDD_DIALOG_IMAGE_MICRO))
{
TRACE0("Failed to CDlgMircoImage create bar!");
return -1;
}
5. 添加并修改框架类的OnCmdMsg虚函数:
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_pNavigator.OnCmdMsg(nID,nCode,pExtra,pHandlerInfo))
return TRUE; //修改部分
return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}