关于CDialogBar的编程

        今天编程过程中,涉及到了CDialogBar的编程,在网上看了一些资料,虽然看明白了,但是写的不是很透明,如果对于一个初学者来说,肯定会头疼,下面,我在这里详细的介绍一下这方面的知识,以及怎样编程。

        在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))
{
}
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上,添加一个列表框,和编辑栏,或者其它的空间,并对其进行响应。这里我就不多说了。下面这个图片,是我编写完成之后的效果。

posted on 2012-02-07 19:52  伪君  阅读(1405)  评论(0编辑  收藏  举报

导航