关于CDialogBar的编程

【转】关于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))
{

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 修改各种样式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值