CDockablePane中嵌入CFormView与嵌入CDialogEx稍有不同,差异主要体现在CFormView类本身与CDialogEx类的不同上,CDockablePane层面的操作完全相同。

a)      创建单文档应用程序;

b)     加入对话框资源,注意,对话框必须有Child属性,Border设置为None

由CFormView派生的类,可以关联一个对话框资源。但该对话框资源必须在属性设定中Style选定[Child]属性,否则的话,
代码可以编译,但Debug运行会报告一个断言错误,跟踪代码,断言在:

#ifdef _DEBUG

// dialog template
must exist and be invisible with WS_CHILD set
    if (!_AfxCheckDialogTemplate(m_lpszTemplateName, TRUE))
    {
        ASSERT(FALSE);   //
invalid dialog template name
        PostNcDestroy();  // cleanup if
Create fails too soon
        return FALSE;
    }

#endif //_DEBUG

  CFormView比较特殊,是一个父窗体嵌套了一个子窗体,所以CFormView类的派生类的实例不响应WM_CLOSE消息,仅仅响应WM_DESTROY消息。另外,若要用代码关闭当前View,也不能直接:PostMessage(WM_CLOSE,0,0);而必须先获取父窗体的指针,然后对父窗体发送WM_CLOSE消息才行,像这样:GetParent()->PostMessage(WM_CLOSE,0,0);才能够达到目的。《深入浅出MFC》第八章461页图8-1清楚地说明了这种情况,View窗口是CChildFrame窗口的子窗口。

 

c)     
为对话框创建类CFormViewEmbeded,基类为CFormView

d)    
重载CFormViewEmbeded类的Create函数,将访问权限改为Public(基类为protect),不用添加额外代码,为了在程序中使用该函数

e)    
重写CFormViewEmbeded类的OnMouseActive消息响应函数,为了防止CDockablePane处于悬浮状态时程序崩溃(不重载必然崩溃!)

int
CFormViewEmbeded::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT
message)

{

// TODO: 在此添消息处理程序代码

int nResult = 0;

CFrameWnd*
pParentFrame = GetParentFrame();

if( pParentFrame == pDesktopWnd )

{

// When this is docked

nResult=
CFormView::OnMouseActivate(pDesktopWnd, nHitTest, message);

}

else

{

// When this is not docked

BOOL
isMiniFrameWnd =pDesktopWnd->IsKindOf( RUNTIME_CLASS( CMiniFrameWnd ) );

BOOL
isPaneFrameWnd =pDesktopWnd->IsKindOf( RUNTIME_CLASS( CPaneFrameWnd ) );

BOOL
isMultiPaneFrameWnd =

pDesktopWnd->IsKindOf(
RUNTIME_CLASS( CMultiPaneFrameWnd ) );

// pDesktopWnd is the frame window for CDockablePane

nResult
= CWnd::OnMouseActivate( pDesktopWnd, nHitTest, message );

}

return nResult;

}

f)     
创建派生自CDockablePane的类CDockableFormView

g)    
由于CFormView类的构造函数访问权限为protect,不能直接声明变量,所以为CDockableFormView添加CDialogEmbeded*类型的成员变量m_pFormViewEmbeded,(另一种解决方法是将CMainFrame声明为友元类);

h)    
在CDockableFormView类的构造函数中添加

    m_pFormViewEmbeded =

          (CFormViewEmbeded*)(RUNTIME_CLASS(CFormViewEmbeded))->CreateObject();

i)      
重载CDockableFormView的OnCreate函数

int CDockableFormView::OnCreate(LPCREATESTRUCT
lpCreateStruct)

{

if (CDockablePane::OnCreate(lpCreateStruct) == -1)

return -1;

// TODO:  在此添加您专用的代码

CRect rect;

GetClientRect(&rect);

m_pFormViewEmbeded->Create(NULL,NULL,WS_CHILD|WS_VISIBLE,rect,this,0,NULL);

return 0;

}

a)     
重载CDockableFormView的OnSize函数

void CDockableFormView::OnSize(UINT nType, int
cx, int cy)

{

CDockablePane::OnSize(nType, cx, cy);

// TODO: 在此处添加消息处理程序代码

if(m_pFormViewEmbeded->GetSafeHwnd())

{

CRect rect;

GetClientRect(&rect);

m_pFormViewEmbeded->SetWindowPos(NULL,

rect.left,rect.top,rect.Width(),rect.Height(),

SWP_NOACTIVATE|SWP_NOZORDER);

}

}

b)    
重载CDockableFormView的OnDestory函数

void CDockableFormView::OnDestroy()

{

CDockablePane::OnDestroy();

// TODO: 在此处添加消息处理程序代码

m_pFormViewEmbeded->DestroyWindow();

}

c)     
在框架类中添加CDockableDlg对象m_dockDlg

d)    
在CMainFrame类的OnCreate函数中添加以下代码,Create函数里面的1002是这个停靠栏的ID,这里是随便指定的一个数值,只要不和其他已用资源重复即可,真正应用的时候,以在字符串表中添加一个ID

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

EnableDocking(CBRS_ALIGN_ANY);

m_dockDlg.Create("Dock
FormView",this,CRect(0,0,200,200),TRUE,1002,

WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|CBRS_RIGHT|CBRS_FLOAT_MULTI);

m_dockDlg.EnableDocking(CBRS_ALIGN_ANY);

DockPane(&m_dockFormView);

return 0;

}

e)    
疑问:m_dockFormView什么时候销毁?

在CDockablePane中嵌入CFormView的更多相关文章

  1. 在CDockablePane中嵌入对话框

    CDockablePane类可以用来创建停靠栏.可以将其他控件集成到CDockablePane的派生类中.下文描述如何将对话框集成到CDockablePane中. a)      创建单文档应用程序: ...

  2. Qt界面中嵌入其他exe程序的界面,使用Qt5

    下面用一个小例子来演示如何在Qt的界面中嵌入其他exe程序的界面,最终效果如下图所示.本文参考了 http://blog.csdn.net/jiaoyaziyang/article/details/4 ...

  3. linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...

  4. 使用CKplayer插件在网页中嵌入视频的方法(常用笔记2)

    在做网站中有时候我们需要在网页中嵌入视频,一般视频嵌入有以下几种方法: 1. 优酷代码嵌入 优点:简单,方便,可靠. 缺点:有广告,现在的网站非常注重用户体验,如果打开一个在线视频是有长广告的一定会崩 ...

  5. 利用webview实现在andorid中嵌入swf

    项目背景是这样的,一套系统有三个客户端分别是网页,flex和android,现在已经在flex上面做好了一个在线客户视频聊天系统,然后在这个基础上修改打包成了SWF,放在网页上面使用效果不错,但是利用 ...

  6. 在应用中嵌入Python:转

    在应用中嵌入Python 前面的章节讨论如何扩展Python,如何生成适合的C库等.不过还有另一种情况:通过将Python嵌入C/C++应用以扩展程序的功能.Python嵌入实现了一些使用Python ...

  7. C++中嵌入Lua脚本环境搭建

    第一步(环境准备工作): 工具: ●LuaForWindows_v5.1.4-46.exe傻瓜式安装. 作用:此工具可以在windows环境下编译运行Lua脚本程序.安装完成后会有两个图标:Lua和S ...

  8. WPF中嵌入普通Win32程序的方法

    公司现在在研发基于.Net中WPF技术的产品,由于要兼容旧有产品,比如一些旧有的Win32程序.第三方的Win32程序等等,还要实现自动登录这些外部Win32程序,因此必须能够将这些程序整合到我们的系 ...

  9. Visual Studio 中可执行文件中嵌入的清单文件

    概要 本分步指南介绍如何在 Microsoft Visual Studio 2005年中的可执行文件 (.exe) 文件中嵌入的清单文件.如果您要开发"认证 Windows Vista&qu ...

随机推荐

  1. storm的并发机制

    storm的并发机制 storm计算支持在多台机器上水平扩容,通过将计算切分为多个独立的tasks在集群上并发执行来实现. 一个task可以简单地理解:在集群某节点上运行的一个spout或者bolt实 ...

  2. HUST 1339 Reversal(字符串)

    题目链接 题解:将每个单词倒置,可以用char数组,然后用空格分隔,这里用的是string和stringstream. #include <cstdio> #include <ios ...

  3. 一步一步学EF系列【4、升级篇 实体与数据库的映射】live writer真坑,第4次补发

    前言 之前的几篇文章,被推荐到首页后,又被博客园下了,原因内容太少,那我要写多点呢,还是就按照这种频率进行写呢?本身我的意图这个系列就是想已最简单最容易理解的方式进行,每篇内容也不要太多,这样初学者容 ...

  4. java的string.split()分割特殊字符时注意点

    [1]单个符号作为分隔符         String address="上海|上海市|闵行区|吴中路";      String[] splitAddress=address.s ...

  5. #define const extern

    将父类中的常量放到. m文件,子类就不会重复包含了.之后再.h文件中用extern NSSting * const ILScoreShowStartTime;// extern 用来声明变量和函数.c ...

  6. 【分享】bootstrap学习笔记

    一.基础知识 1.整体架构 以响应式设计为理念,css组件.js插件+jquery.基础布局组件和12栅格系统搭建. 1.1响应式设计:结合media query查询,适应更多设备,自动适应用户的设备 ...

  7. k近邻模型

    k近邻模型主要包含三个基本要素:距离度量.k值的选择.分类决策规则 模型: k近邻法中,当训练集.距离度量.k值及分类决策规则确定后,对于一个新的输入实例,它所属的类唯一确定,这相当于根据上述要素将特 ...

  8. stm32按键识别

    刚写了一个关于stm32单片机的按键识别的程序.目的,同时识别多个按键,并且不浪费cpu的时间. 关于去抖动,以前以为是在按键的时候,手会抖动.通过程序验证,这个确实是误解.这个应该是防止意外干扰.以 ...

  9. 获取集合、数组后要判断为空的必要性以及根据构造器创建对象后不是null的证实

    在开发过程中,凡是获取到一个集合对象,在利用或者说遍历这个集合对象之前,都要进行是否为null以及size()>0的判断,但是如果size()>0的话,不是就已经可以说明此集合对象不为nu ...

  10. VBS基础篇 - 对象(7) - TextStream对象

    VBS基础篇 - 对象(7) - TextStream对象   TextStream对象是用于访问文本文件的对象,它是FileSystemObject一个独立的附属对象,但在使用TextStream对 ...