从CDialogBar派生自己的类进行控件的初始化

当创建一些简单的形如只包含了一些BUTTON的DialogBar的时候,是不需要从CDialogBar派生,因为CDialogBar本身就是从CControlBar派生而来,它可以接收任何的通告消息。

然而,在一下的诸多较为复杂的情形下,我们就需要利用CDialogBar派生出自己的类了(子控件是指用作子窗口的控件------个人理解)。

  • dialogbar包含了具有drop-down属性的COMBOBOX;
  • dialogbar包含了treeview或者tree控件,listview, list控件;
  • dialogbar包含了ActiveX控件;

诸如上面所说的任何较为复杂的情形下,我们都应该对Dialogbar进行派生,以便在派生的类中对其他的控件进行初始化。因为在ClassWizard并没有支持以CDialogBar为基类的派生。所以我们必须自己手动完成该派生过程。这篇文章就是要阐述如何将CDialog的派生类转换为CDialogBar的派生类。

在开始正题之前,有必要说明一点:CDialogBar类是从CControlBar类派生而来的,而CControlBar类则是从CWnd类派生而来,所以CDialogBar并非CDialog的派生类。

首先打开VS2008,创建一个DialogBar类型的dialog资源(在创建对话框资源的时候,单击Dialog选项前面的"+"号进行选择)。并以CDialog类为基类生成派生类,然后按照下面的步骤对所产生的类进行修改。

  1. 在类的声明中,将基类CDialog改为CDialogBar,同时将.cpp文件中,BEGIN_MESSAGE_MAP中的基类也改为CDialogBar.
  2. 修改.h文件和.cpp文件中的析构函数,同时修改DoDataExchange()函数,具体修改后的效果如下图:
 
  
//修改前的代码:
1
CMyDlgBar (CWnd * pParent = NULL); // standard constructor
2  
3 CMyDlgBar:: CMyDlgBar (CWnd * pParent /* =NULL */ )
4 : CDialog(CMyDlgBar::IDD, pParent)
5 {
6 ...
7
8   void CMyDlgBar::DoDataExchange(CDataExchange * pDX)
9 {
10 CDialog::DoDataExchange(pDX);
11 ...
12
 
  
//修改后的代码
1
CMyDlgBar (); // standard constructor
2  
3 CMyDlgBar:: CMyDlgBar ()
4 {
5 ...
6
7   void CMyDlgBar::DoDataExchange(CDataExchange * pDX)
8 {
9 CDialogBar::DoDataExchange(pDX);
10 ...

    3.从文章开始所谈到的继承关系可以看出,在CDialogBar中并没有用来响应WM_INITDIALOG消息的虚函数。我们需要将.h文件中用来响应WM_INITDIALOG消息的虚函数OnInitDialog变化成为一个消息响应函数。首先将.h文件中的“virtual BOOL OnInitDialog();”从文件中删掉,然后在相同的位置上添加“afx_msg LONG OnInitDialog ( UINT, LONG );”函数。然后在.cpp文件中做相应的改动,并将.cpp文件中消息映射ON_WM_INITDIALOG()改为OM_MESSAGE(WM_INITDIALOG, OnInitDialog),例如:

 
  
//在头文件中
1
class CMyDlgBar : public CDialogBar
2 {
3 ...
4   // Implementation
5   protected :
6
7 // Generated message map functions
8 // {{AFX_MSG(CMyDlgBar)
9   virtual BOOL OnInitDialog(); // <-删除这一行.
10 // }}AFX_MSG
11  
12 afx_msg LONG OnInitDialog ( UINT, LONG ); // <-添加这一行.
13   DECLARE_MESSAGE_MAP()
14 };
 
  
1   // 在源文件中
2 BEGIN_MESSAGE_MAP(CMyDlgBar, CDialogBar)
3 ...
4 ON_MESSAGE(WM_INITDIALOG, OnInitDialog ) // <-- 添加这一行.
5 END_MESSAGE_MAP()
 
  
// 将函数实现从:

BOOL CMyDlgBar::OnInitDialog()
{
CDialog::OnInitDialog();
// <-- 这行被替代掉:
...

// 改为:
LONG CMyDlgBar::OnInitDialog ( UINT wParam, LONG lParam)
{
// <-- 用以下的代码替代上面需要替代的部分. -->
BOOL bRet = HandleInitDialog(wParam, lParam);

if ( ! UpdateData(FALSE))
{
TRACE0(
" Warning: UpdateData failed during dialog init.\n " );
}
...
return bRet;

到此为止所有需要修改的地方都已经完成,剩下的就是使用了。在CMainFrame中定义变量,并在CMainFrame::OnCreate()函数中添加代码:

 
  
1 if ( ! m_wndDlgBar.Create( this , IDD_DIALOGBAR, WS_CHILD | WS_VISIBLE | CBRS_BOTTOM
2 | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, IDD_DIALOGBAR))
3 {
4 TRACE0( " Failed to create Dialog bar\n " );
5 return - 1 ; // fail to create
6 }
7
8 // 如果需要实现可停靠的功能,则添加如下代码:
9 m_wndDlgBar.EnableDocking(CBRS_ALIGN_BOTTOM );
10 EnableDocking(CBRS_ALIGN_ANY); // 这句很重要
11 DockControlBar( & m_wndDlgBar, AFX_IDW_DOCKBAR_BOTTOM);

最后,希望我的这篇文章能够给大家一些帮助,不论是否有用,都希望大家多多留言,多多交流。

转载于:https://www.cnblogs.com/cylee025/archive/2011/05/04/2036201.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CDialogBar是MFC框架中的一个,用于实现在主窗口中添加一个似工具栏的窗口。如果需要自定义CDialogBar的外观或者添加自己的控件,可以通过派生CDialogBar来实现。 具体实现步骤如下: 1. 创建一个CDialogBar的派生,例如MyDialogBar。 2. 在MyDialogBar.h文件中添加需要添加的控件,例如: ``` class MyDialogBar : public CDialogBar { public: MyDialogBar(); virtual ~MyDialogBar(); // Dialog Data #ifdef AFX_DESIGN_TIME enum { IDD = IDD_MYDIALOGBAR }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support virtual BOOL OnInitDialog(); DECLARE_MESSAGE_MAP() private: CButton m_btnTest; }; ``` 3. 在MyDialogBar.cpp文件中实现OnInitDialog()函数,用于初始化添加的控件。例如: ``` BOOL MyDialogBar::OnInitDialog() { CDialogBar::OnInitDialog(); // TODO: Add extra initialization here m_btnTest.Create(_T("Test"), WS_CHILD | WS_VISIBLE, CRect(10, 10, 100, 30), this, IDC_BTN_TEST); return TRUE; // return TRUE unless you set the focus to a control } ``` 4. 在主窗口中添加MyDialogBar控件,例如: ``` BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { // TODO: Add your specialized code here and/or call the base class m_wndSplitter.CreateStatic(this, 1, 2); m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMyView), CSize(0, 0), pContext); m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CListView), CSize(0, 0), pContext); m_wndMyDialogBar.Create(this, IDD_MYDIALOGBAR, CBRS_LEFT, IDD_MYDIALOGBAR); m_wndMyDialogBar.EnableDocking(CBRS_ALIGN_LEFT); DockControlBar(&m_wndMyDialogBar); return TRUE; } ``` 通过以上步骤,就可以自定义CDialogBar的外观和添加自己的控件了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值