在CDialogBar编程之前,我们首先要明确一点,CDialogBar是CControlBar派生出来的,而CControlBar又是从CWnd派生出来的,所以CDialogBar并不是从CDialog派生出来的,这点一定注意,它是从CWnd间接派生出来的!明确这一点之后,我们开始写一个CDialogBar的程序。在CDialogBar创建完成之后,我们看上去效果好像和一个CToolBar一样,因此呢,在显示过程中,也有类似CToolBar在窗口中的设置。下面是编程的操作步骤:
1、首先,我们新建一个工程,工程名字可以随便输入,在这里我们设置为MyDlgBar,进入下一步,选择“单文档应用程序”,然后直接点击完成即可。
2、我们既然要创建一个CDialogBar,那么我们首先在资源窗口中,插入一个对话框资源,然后我们打开资源向导,这时,向导会提示我们插入的对话框是一个新的资源,它要我们创建这个资源,我们直接点击确定,输入资源名称,这里我输入的是CNewDlgBar,在选择基类的时候呢,我们会发现,并没有我们想要的CDialogBar类,没关系,我们可以选择CDialog这个类,注意:并不是因为CDialog是CDialogBar的基类,而作出这样的选择!而是因为CDialogBar非常的类似dialog box(对话框),CDialogBar也是可以在里面添加控件的,因此我们选择CDialog这个类,选择之后是要进行必要的修改的。修改步骤如下:
1)在CNewDlgBar的头文件中,在“class CNewDlgBar : public CDialog”这行代码中将“CDialog”更改为CDialogBar,也就是将我们新建的这个类的基类,改为CDialogBar作为基类。
2)在CNewDlgBar的源文件中,在“CNewDlgBar::CNewDlgBar(CWnd* pParent /*=NULL*/)
: CDialogBar(CNewDlgBar::IDD, pParent)”中,我们将CDialogBar的参数全部删除,结果是“CNewDlgBar::CNewDlgBar(CWnd* pParent /*=NULL*/)
: CDialogBar()”,因为在CDialogBar的构造函数中,是没有任何参数的。
然后我们编译目前的工程,不会再有错误发生了。接下来,我们要创建这个CDialogBar,并且将它在我们的窗口中显示出来。
3、创建CDialogBar,我们是在Create这个虚函数中完成的。那么我们首先在CNewDlgBar这个类中,增加一个Create虚函数。我们知道,现在我们所做的修改,都是基于CDialog之上进行的,因为在创建的时候,我们是将CDialog作为基类创建的,因此,系统给我们增加的这个函数的参数都是针对CDialog类的,我们也要进行如下修改:
1)在CNewDlgBar的头文件中,找到定义Create这个虚函数的地方,对参数进行修改,修改结果是:
virtual BOOL Create(CWnd* pParentWnd,UINT nIDTemplate,UINT nStyle,UINT nID);
2)在CNewDlgBar源文件中,做同样的修改,修改结果是:BOOL CNewDlgBar::Create(CWnd* pParentWnd,UINT nIDTemplate,UINT nStyle,UINT nID) ;
修改之后,我们就要在里面修改代码,去覆盖基类的Create函数。
4、添加代码后,结果是:
BOOL CNewDlgBar::Create(CWnd* pParentWnd,UINT nIDTemplate,UINT nStyle,UINT nID)
{
// TODO: Add your specialized code here and/or call the base class
BOOL bRes= CDialogBar::Create(pParentWnd,nIDTemplate,nStyle,nID );
OnInitDialog();
return bRes;
//return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}
5、细心的人,会看见,我在上面的代码中增加了一个消息处理函数:OnInitDialog();
这个函数是在窗口创建完成之后发送的,因此我们要对这个消息进行处理。步骤如下:
1)在CNewDlgBar的头文件中,在
class CNewDlgBar : public CDialogBar
{
。。。。。。
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CNewDlgBar)
。。。。。。
//}}AFX_MSG
//在此处定义
afx_msg BOOL OnInitDialog ();
DECLARE_MESSAGE_MAP()
。。。。。。
};
中定义相应消息的函数原形。
2)在CNewDlgBar的源文件中,定义消息影射,在
BEGIN_MESSAGE_MAP(CNewDlgBar, CDialogBar)
//{{AFX_MSG_MAP(CNewDlgBar)
。。。。。。
//}}AFX_MSG_MAP
//在此处定义
ON_MESSAGE(WM_INITDIALOG, OnInitDialog)
END_MESSAGE_MAP()
中定义消息影射。接下来,我们就要编写消息相应代码。
6、也是在源文件中完成,结果如下:
BOOL CNewDlgBar::OnInitDialog()
{
UpdateData(FALSE);
return TRUE;
}
7、万事俱备,只欠东风,我们只要在CMainFrame中,将其创建并且显示就可以了。这段代码,我们是放在CMainFrame的OnCreate函数中完成的,结果如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
。。。。。。
if (!m_newdlgbar.Create(this, IDD_NEWDLGBAR, CBRS_LEFT | WS_VISIBLE | WS_CHILD | CBRS_GRIPPER,
IDD_NEWDLGBAR))
{
TRACE0("Failed to create dialogbar");
return -1; //failed to create
}
m_newdlgbar.SetBarStyle(m_wndToolBar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
m_newdlgbar.EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_newdlgbar);
。。。。。。
return 0;
}
最后还有一步,也是很重要的,就是在资源窗口中,将我们新建的这个窗口的属性,改为child,这步也是很重要的,否则会出现致命的错误!其他的可以随自己意改,一般都选择None即可。
至此我们便完成了CDialogBar的创建。我们可以在CDialogBar上,添加一个列表框,和编辑栏,或者其它的空间,并对其进行响应。这里我就不多说了。下面这个图片,是我编写完成之后的效果。
如果还有不明白的,请与本人联系。QQ14369700。未经本人同意,不得转载,哈哈~~~~~~
关于CDialogBar的Create()函数理解:
MSDN下,有两个重构函数,分别是:
BOOL Create( CWnd* pParentWnd, LPCTSTR lpszTemplateName, UINT nStyle, UINT nID );
BOOL Create( CWnd* pParentWnd, UINT nIDTemplate, UINT nStyle, UINT nID );
特别是MSDN对下面两个参数的解释不明白什么意思
nID:
The control ID of the dialog bar.
nIDTemplate:
The resource ID of the CDialogBar object’s dialog-box template.
这个函数的作用自然是根据资源文件里的对话框模板创建对话框条。
前一个ID是该对话框条的控件ID,用来标示窗口的,可以是任意和父窗口中其他子窗口ID不重复的无符号整数,这里设为和资源ID一样只是方便而已,改为其他值也可以。而后一个资源ID必须是资源文件中定义好的,不能随意更改。
Dialog 修改各种样式