文档章节

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

剑禅觅心
 剑禅觅心
发布于 2016/08/01 21:27
字数 1144
阅读 18
收藏 0

用对话框创建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);

本文转载自:http://blog.csdn.net/amohan/article/details/8189449

剑禅觅心
粉丝 6
博文 224
码字总数 0
作品 0
深圳
高级程序员
私信 提问
另类的CDialogBar——可停靠对话框的实现方法

本文大部分思路来自于《VISUAL C++ 6.0 MFC 类库参考手册》一书! CDialogBar在MFC中就是提供控制条形式的非模态对话框。 其使用过程很简单: 1.在MainFrame框架中声明变量 2.在MainFrame的O...

晨曦之光
2012/05/23
665
0
CDialogBar上的按钮自动Disable

问题描述 刚开始在MainFrame中使用默认的CDialogBar没有任何问题,DialogBar上的按钮响应一切正常。后来由于MainFrame越来越庞大,就想把DialogBar相关的消息响应从MainFrame中移出来,放到单...

abing_hu
2013/12/25
0
0
安卓Dialog弹出对话框全解:包含了AlertDialog,DialogFragment

全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 Dialog基类中并没有定义界面,所以如果使用dialog类设置弹出框,需要使用xml自定义UI。 当然系统也自带了几个dialog派生的弹出框,例如Ale...

luanpeng825485697
2017/11/28
0
0
疯狂ios讲义之自定义UI控件

UIView控件只是一个矩形的空白区域,并没有任何内容。iOS应用的其他UI控件都继承了UIView,这些UI控件都是在UIView提供的空白区域上绘制外观。 基于UI控件的实现原理,开发者完全可以开发出项...

博文视点
2014/01/21
12.5K
0
利用CWinThread实现跨线程父子MFC窗口

原则上,MFC对象只能由创建该对象的线程访问,而不能由其它线程访问.这是因为MFC窗口中有一个Windows handle maps, 这个maps同线程相关,也就是说该线程一定会访问该maps,而且该线程创建的MFC窗...

jetyi
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JWT学习总结

官方 https://jwt.io 英文原版 https://www.ietf.org/rfc/rfc7519.txt 或 https://tools.ietf.org/html/rfc7519 中文翻译 https://www.jianshu.com/p/10f5161dd9df 1. 概述 JSON Web Token(......

冷基
33分钟前
3
0
AOP的学习(1)

AOP 理解AOP编程思想(面向方法、面向切面) spring AOP的概念 方面 -- 功能 目标 -- 原有方法 通知 -- 对原有方法增强的方法 连接点 -- 可以用来连接通知的地方(方法) 切入点 -- 将用来插入...

太猪-YJ
今天
4
0
一张图看懂亮度、明度、光度、光亮度、明亮度

亮度、明度、光亮度,Luminance和Brightness、lightness其实都是一个意思,只是起名字太难了。 提出一个颜色模型后,由于明度的取值与别人的不同,为了表示区别所以就另想一个词而已。 因此在...

linsk1998
昨天
8
0
Python应用:python链表示例

前言 python链表应用源码示例,需要用到python os模块方法、函数和类的应用。 首先,先简单的来了解下什么是链表?链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是...

python小白1
昨天
4
0
Source Insight加载源码

Source Insight是一个图形化的源代码查看工具(当然也可以作为编译工具)。如果一个项目的源代码较多,此工具可以很方便地查找到源代码自建的依赖关系。 1.创建工程 下图为Snort源代码的文件...

天王盖地虎626
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部