用对话框创建CDialogBar派生的类并在CReBar上添加

转自于:http://blog.csdn.net/franksunny/article/details/572357

 

摘要:本文详细解说了CDialogBar的具体使用过程,可以做为VC++MFC新手学习总结用。

 

一、创建DialogBar的派生类

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

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

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

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

class CDataStatus : public CDialog  改为class CDataStatus : public CDialogBar

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

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

: CDialog(CDataStatus::IDD, pParent)

{

       //{{AFX_DATA_INIT(CDataStatus)

              // NOTE: the ClassWizard will add member initialization here

       //}}AFX_DATA_INIT

}

改为

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

{

       //{{AFX_DATA_INIT(CDataStatus)

              // NOTE: the ClassWizard will add member initialization here

       //}}AFX_DATA_INIT

}

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

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

{

       CDialog::DoDataExchange(pDX);

       //{{AFX_DATA_MAP(CCurrentCheckDlg)

       ………..

       //}}AFX_DATA_MAP

}

改为

void CDataStatus::DoDataExchange(CDataExchange* pDX)

{

       //{{AFX_DATA_MAP(CCurrentCheckDlg)

       ………….

       //}}AFX_DATA_MAP

}

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

首先在ClassWizardMessageMap中对消息该CDataStatus类的WM_INITDIALOG消息添加处理函数默认名为OnInitDialog

其次手工修改代码如下:

1、             添加消息映射函数。由于对话框形式的初始化函数消息并未加载到消息映射内,为此我们需要手工添加,要不然代码无法拦截该工具条的初始化消息,形式如下:

BEGIN_MESSAGE_MAP(CDataStatus, CDialogBar)

   //{{AFX_MSG_MAP(CDataStatus)

   .......

   //}}AFX_MSG_MAP

END_MESSAGE_MAP()

改为:

BEGIN_MESSAGE_MAP(CDataStatus, CDialogBar)

   //{{AFX_MSG_MAP(CDataStatus)

   .......

   ON_MESSAGE(WM_INITDIALOG,OnInitDialog)

   //}}AFX_MSG_MAP

END_MESSAGE_MAP()

2、             修改OnInitDialog函数,此函数并未传递参数,但是在这里我们需要让它传递参数,代码如下修改(当然头文件中,对声明也要做修改,在这里就不作赘述了)

BOOL CDataStatus::OnInitDialog()

{

   CDialogBar::OnInitDialog();

  

   // TODO: Add extra initialization here

   return TRUE;  // return TRUE unless you set the focus to a control

              // EXCEPTION: OCX Property Pages should return FALSE

}

改为:

BOOL CDataStatus::OnInitDialog(UINT wParam,LONG lParam)

{

   //CDialogBar::OnInitDialog();

  

   // TODO: Add extra initialization here

   BOOL bRet = HandleInitDialog(wParam,lParam);

   if (!UpdateData(FALSE))

   {

          TRACE("InitCDataStatus Failed");

   }

   return TRUE;  // return TRUE unless you set the focus to a control

                 // EXCEPTION: OCX Property Pages should return FALSE

}

 

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

首先,在框架类的头文件内声明实例对象,本例实例化:CDataStatus      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 CDataStatus 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);

}

三、CReBar上添加该实例化对象

其实这一步倒是相当简单,只是自己以前没用过这个类,所以在这里也顺便用了一下。

首先,在框架类的头文件中用CRebar声明一个对象,如CReBar   m_wndReBar;

其次,在框架类的代码文件中的OnCreat函数体内,生成对象,代码如下:

if (!m_wndReBar.Create(this,RBS_BANDBORDERS,WS_CHILD |

WS_VISIBLE| CBRS_BOTTOM|WS_CLIPSIBLINGS|WS_CLIPCHILDREN))

       {

              TRACE0("Failed to create  Rebar /n");

              return -1;

       }

再次,就是将所要添加的toolbar以及新生成的CDataStatus对象m_wndDataStatus加进Rebar的对象m_wndReBar中,代码如下:

m_wndReBar.AddBar(&m_wndDataStatus,NULL,NULL,

RBBS_GRIPPERALWAYS|RBBS_FIXEDBMP);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
目 录 译者序 前言 第一部分 基础 第1章 概述 1 1.1 Windows基础 1 1.1.1 窗口结构 2 1.1.2 消息 2 1.1.3 客户区和非客户区 2 1.1.4 重叠窗口、弹出窗口和子窗口 2 1.1.5 父窗口和宿主窗口 3 1.2 Windows消息 3 1.2.1 发送或寄送消息 4 1.2.2 消息型 4 1.2.3 接收消息 4 1.2.4 窗口处理函数的子化 5 1.3 窗口绘图 5 1.3.1 设备环境 5 1.3.2 绘图工具 6 1.3.3 映射模式 6 1.3.4 窗口视和视口视 6 1.3.5 逻辑单位和设备单位 7 1.3.6 绘图函数 7 1.3.7 抖动和非抖动颜色 7 1.3.8 设备无关位图 8 1.3.9 元文件 8 1.3.10 何时绘图 8 1.4 MFC基础 8 1.5 Developer Studio基础 9 1.6 Windows和MFC总结 10 1.7 基本 10 1.8 应用 11 1.8.1 文档视 11 1.8.2 CWinApp(OC) 11 1.8.3 文档模板 12 1.8.4 线程 12 1.8.5 CFrameWnd(OCW) 12 1.8.6 CDocument(OC) 12 1.8.7 CView(OCW) 13 1.8.8 对话框应用程序 13 1.8.9 SDI应用程序 13 1.8.10 MDI应用程序 13 1.9 其余用户界面 13 1.9.1 通用控件 13 1.9.2 菜单(O) 14 1.9.3 对话框 15 1.9.4 通用对话框MFC 15 1.9.5 控件条 (OCW) 15 1.9.6 属性 15 1.10 绘图 16 1.11 其他MFC 16 1.11.1 文件 16 1.11.2 CArchive和序列化 16 1.11.3 数据库 17 1.11.4 ODBC 17 1.11.5 DAO 17 1.11.6 数据集合 17 1.11.7 通信 18 1.12 的消息机制 18 1.12.1 MFC如何接收一个寄送消息 18 1.12.2 MFC如何处理接收的消息 18 1.12.3 UI对象 20 1.13 小 结 20 第2章 控制条 21 2.1 通用控制条 21 2.2 用API创建控制条 22 2.3 用MFC创建控制条 24 2.3.1 CToolBarCtrl和CStatusBarCtrl 24 2.3.2 CToolBar和CStatusBar 24 2.3.3 CControlBar 26 2.4 停靠栏 27 2.4.1 设置停靠功能 28 2.4.2 自动改变大小和移动 30 2.4.3 停靠栏小结 30 2.5 浮动条 31 2.6 MFC的高级控制条小结 32 2.7 视和控制条如何共享客户区 32 2.7.1 CFrameWnd::RecalcLayout() 32 2.7.2 CWnd::RepositionBars() 33 2.7.3 CControlBar::OnSizeParent() 33 2.7.4 CalcDynamicLayout()和 CalcFixedLayout () 34 2.7.5 CToolBar::CalcFixedLayout()和CTool Bar:: CalcDynamicLayout() 35 2.7.6 工具栏布局 35 2.7.7 CStatusBar::CalcFixedLayout() 36 2.7.8 CDockBar::CalcFixedLayout() 36 2.7.9 共享客户区小结 36 2.8 对话条 37 2.9 伸缩条 38 2.9.1 CReBar和CReBarCtrl 39 2.9.2 CReBar::CalcFixedLayout() 39 2.10 命令条 39 2.11 控制条窗口小部件风格 40 2.11.1 工具栏按钮风格 40 2.11.2 状态栏窗格风格 40 2.11.3 伸缩条段风格 40 2.12 设计自己的控制条 41 2.12.1 重载CControlBar::CalcDynamic-Layout() 41 2.12.2 增加WM_SIZEPARENT消息

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值