CDialogBar的用法

原创 2008年10月02日 19:45:00

一、创建DialogBar的派生类<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

首先,创建对话框资源:在对话框资源编辑器内生成一个Dialog资源,并将其风格(Style)属性必须设置为Child,不能设置为OverlappedPopup,否则运行肯定出错;至于边界属性则随用户自己喜欢,一般都是选择None。其余属性也随用户选择,一般没有特殊要求还是选择默认的好。

其次,创建基于CDialog的派生类:打开ClassWizard,为以上创建的资源添加一个以CDialog为基类的派生类(因为ClassWizard没有将CDialogBar列在基类目录清单中,所以用户只能先以CDialog类派生)。

然后重写OnInitDialog();//注意这里一定先重写,如果先将基类改成CDialogBar,则编译器就没有这个重写的函数了

 重新初始化函数相当重要,如果不这么做的话,DDX函数形同虚设,当然用户的工具条如果没有用到DDX的话当然可以不加这段代码)

将编译器自动生成的OnInitDialog声明和定义分别改成

afx_msg LONG OnInitDialog(UINT wParam,LONG lParam);//头文件中的声明

LONG CMyDialogBar::OnInitDialog(UINT wParam,LONG lParam)
{
 

 // TODO:  Add extra initialization here

 BOOL bRet = HandleInitDialog(wParam,lParam);
    if (!UpdateData(FALSE))
    {
    TRACE("InitCMyDialogBar Failed
");
 }
     return TRUE;  // return TRUE unless you set the focus to a control
 // EXCEPTION: OCX Property Pages should return FALSE
}

 

在消息映射中添加以下红色的部分

BEGIN_MESSAGE_MAP(CMyDialogBar, CDialogBar)


ON_MESSAGE(WM_INITDIALOG,OnInitDialog)

END_MESSAGE_MAP()

 

 

再次,修改派生类以CDialogBar为基类:通常需要手工修改几处代码,在本例中派生类以CMyDialogBar命名。(注:以后讲解中凡是手工改动都是以灰背景显示)

1  在头文件中修改继承关系

class CMyDialogBar: public CDialog  改为IMPLEMENT_DYNAMIC(CMyDialogBar, CDialogBar)

2、  在代码文件中修该构造函数继承关系

CMyDialogBar::CMyDialogBar(CWnd* pParent /*=NULL*/)

: CDialog(CMyDialogBar::IDD, pParent)

{

       //{{AFX_DATA_INIT(CMyDialogBar)

              // NOTE: the ClassWizard will add member initialization here

       //}}AFX_DATA_INIT

}

改为

CMyDialogBar::CMyDialogBar(CWnd* pParent /*=NULL*/)

{

       //{{AFX_DATA_INIT(CMyDialogBar)

              // NOTE: the ClassWizard will add member initialization here

       //}}AFX_DATA_INIT

}

3  DDX绑定函数中的继承关系去掉

即将void CMyDialogBar::DoDataExchange(CDataExchange* pDX)

{

       CDialog::DoDataExchange(pDX);//删去

       //{{AFX_DATA_MAP(CCurrentCheckDlg)

       ………..

       //}}AFX_DATA_MAP

}

改为

void CMyDialogBar::DoDataExchange(CDataExchange* pDX)

{

       //{{AFX_DATA_MAP(CCurrentCheckDlg)

       ………….

       //}}AFX_DATA_MAP

}

 

 

二、在框架类中实现该派生类的对象化

首先,在框架类的头文件内声明实例对象,本例实例化:CMyDialogBar      m_wndDataStatus;当然头文件中不可避免要包含新派生类的头文件。

其次,在框架类的OnCreate函数内创建对象并将对象绑定对话框资源。形式与创建ToolBar原理一样,本例实例如下:

if (!m_wndDataStatus.Create(this,IDD_DATASTATUS,WS_VISIBLE|WS_CHILD

|CBRS_SIZE_DYNAMIC|CBRS_BOTTOM,IDD_DATASTATUS))

      {

             TRACE0("Failed to create CMyDialogBar bar!");

             return -1;

      }

再次,最为关键的一点就是重写框架类的OnCmdMsg虚函数。如果不重写该函数,那么不光DDX功能无法实现,连最基本的OnCommand事件都无法实现。而且还得手工添加代码,形式如下:

BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra,

AFX_CMDHANDLERINFO* pHandlerInfo)

{

      // TODO: Add your specialized code here and/or call the base class

      return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);

}

改为:

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_wndDataStatus.OnCmdMsg(nID,nCode,pExtra,pHandlerInfo))

             return    TRUE;

      return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);

}

 

 

在添加CDialogBar上添加控件

在你创建的Dialog上面放一个按钮,运行程序试一试,怎么按钮是灰色的,即使在Dialog中添加了响应事件,也没有用。这个问题困扰了我好长时间,最后在CSDN上找到答案。按钮消息不是发到Dialog上,而是直接发给CMainFrame上,也就是说cdialogbar上面的按钮消息只有映射到CMainframe上面才好使。这回你在CMainframe上面处理消息看看,满意了吧。

CSDN上有人是这么做的:

----------------------------------------------------

这个问题我也遇到过,dialogbar上的控件消息可以直接由Mainframe类处理,如果通过派生CDialogBar类来处理消息的话有时确实会出现明明映射了消息处理函数,但控件就是灰色。

我是这么解决的,在MainFrame里为控件再做一次消息映射,但处理函数里什么都不做,这样控件一定是已经enable了,这时候如果在DialogBar派生类里也做了消息映射那么你的处理函数就已经起作用了。

也就是说在dialogbar派生类处理控件消息比在mainframe中处理优先级高,但在mainframe中有处理函数一定会将控件enable

 

本文参考了http://blog.csdn.net/franksunny/archive/2006/01/06/572357.aspx

         http://cxdcn.bokee.com/6642909.html

10分钟内完成 MFC对话条CDialogBar编程

关于CDialogBar的编程          今天编程过程中,涉及到了CDialogBar的编程,在网上看了一些资料,虽然看明白了,但是写的不是很透明,如果对于一个初学者来说,肯定会头疼,下面,...
  • kjxyzhaobo_01
  • kjxyzhaobo_01
  • 2014年07月06日 20:40
  • 708

利用CDialogBar来实现类似工具栏的浮动条

     如果你想实现有工具条的浮动和定位功能,而且可以方便的摆放任何控件上去,请继续看这篇文章吧!那就使用CDialogBar就可以拥有和CDialog一样的方便和快捷。    步骤1:添加一个CD...
  • houen_study
  • houen_study
  • 2004年11月05日 10:29
  • 2674

mfc的CDialogBar

一、创建DialogBar的派生类 首先,创建对话框资源:在对话框资源编辑器内生成一个Dialog资源,并将其风格(Style)属性必须设置为Child,不能设置为Overlapped或Popup,...
  • dadaadao
  • dadaadao
  • 2012年07月11日 12:49
  • 4783

CDialogBar 响应按钮消息方法

http://blog.csdn.net/franksunny/archive/2006/01/06/572357.aspx用对话框创建CDialogBar派生的类并在CReBar上添加 摘要:本文详...
  • wangji163163
  • wangji163163
  • 2008年01月16日 15:07
  • 2228

将CDialog完美转换成CDialogBar

DialogBar相比Dialog有很多优势。因CDialogBar继承于CControlBar,因此其可以Docking在窗口一边,而把CView挤压开,但是 CDialogBar 的使用并不是很容...
  • zztoll
  • zztoll
  • 2012年05月03日 11:07
  • 2079

创建可变大小的CDialog Bar

http://support.microsoft.com/default.aspx?scid=kb;en-us;143255说明:翻译时忽略了在MFC4.0以前版本中的所采用的方法。[问题叙述]:MF...
  • laiyiling
  • laiyiling
  • 2004年08月13日 23:05
  • 4022

致MFC新手,关于CDialogBar使用的一个小错误

最近,我根据CSDN上的一篇文章http://blog.csdn.net/franksunny/article/details/572357学习了如何在一个文档中停靠一个...
  • DOCAICSD
  • DOCAICSD
  • 2014年08月21日 11:08
  • 810

关于CDialogBar的使用

 环境:VC6.0 SP6最近在一个程序需要用到CDialogBar,于是按照一般步骤,先在资源视图中添加了一个Dialog,定义好了ID。然后添加了一些需要的EDIT_BOX和COMBOBOX。由于...
  • daichanglin
  • daichanglin
  • 2007年04月08日 16:26
  • 1453

另类的CDialogBar——可停靠对话框的实现方法

本文大部分思路来自于《VISUAL C++ 6.0 MFC 类库参考手册》一书!          CDialogBar在MFC中就是提供控制条形式的非模态对话框。          其使用过程很...
  • txg703003659
  • txg703003659
  • 2012年05月10日 06:12
  • 5138

VS2008 CDialogBa不能用,可以换成CDockablePane

VS2008 CDialogBa不能用,可以换成CDockablePane
  • chl0000
  • chl0000
  • 2010年09月25日 16:29
  • 6054
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CDialogBar的用法
举报原因:
原因补充:

(最多只允许输入30个字)