在CDockablePane中嵌入CFormView
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的更多相关文章
- 在CDockablePane中嵌入对话框
CDockablePane类可以用来创建停靠栏.可以将其他控件集成到CDockablePane的派生类中.下文描述如何将对话框集成到CDockablePane中. a) 创建单文档应用程序: ...
- Qt界面中嵌入其他exe程序的界面,使用Qt5
下面用一个小例子来演示如何在Qt的界面中嵌入其他exe程序的界面,最终效果如下图所示.本文参考了 http://blog.csdn.net/jiaoyaziyang/article/details/4 ...
- linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
- 使用CKplayer插件在网页中嵌入视频的方法(常用笔记2)
在做网站中有时候我们需要在网页中嵌入视频,一般视频嵌入有以下几种方法: 1. 优酷代码嵌入 优点:简单,方便,可靠. 缺点:有广告,现在的网站非常注重用户体验,如果打开一个在线视频是有长广告的一定会崩 ...
- 利用webview实现在andorid中嵌入swf
项目背景是这样的,一套系统有三个客户端分别是网页,flex和android,现在已经在flex上面做好了一个在线客户视频聊天系统,然后在这个基础上修改打包成了SWF,放在网页上面使用效果不错,但是利用 ...
- 在应用中嵌入Python:转
在应用中嵌入Python 前面的章节讨论如何扩展Python,如何生成适合的C库等.不过还有另一种情况:通过将Python嵌入C/C++应用以扩展程序的功能.Python嵌入实现了一些使用Python ...
- C++中嵌入Lua脚本环境搭建
第一步(环境准备工作): 工具: ●LuaForWindows_v5.1.4-46.exe傻瓜式安装. 作用:此工具可以在windows环境下编译运行Lua脚本程序.安装完成后会有两个图标:Lua和S ...
- WPF中嵌入普通Win32程序的方法
公司现在在研发基于.Net中WPF技术的产品,由于要兼容旧有产品,比如一些旧有的Win32程序.第三方的Win32程序等等,还要实现自动登录这些外部Win32程序,因此必须能够将这些程序整合到我们的系 ...
- Visual Studio 中可执行文件中嵌入的清单文件
概要 本分步指南介绍如何在 Microsoft Visual Studio 2005年中的可执行文件 (.exe) 文件中嵌入的清单文件.如果您要开发"认证 Windows Vista&qu ...
随机推荐
- tcpdump的源码分析
在源文件 tcpdump.c 中: 结构体数组“static struct printer printers[]”定义了tcpdump所跟参数及其对一个的处理函数. struct printer { ...
- Hihocoder 2月29日
时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 只有闰年有2月29日,满足以下一个条件的年份为闰年 ...
- [ An Ac a Day ^_^ ] hdu 5835 Danganronpa 令人发指
这道题告诉我两个道理: 1.记得写case 要不挂死你 2.数据很水的时候 只有样例的这一种情况…… 原来数据可以这么水…… #include<stdio.h> #include<i ...
- 重拾Ruby—新的征程
作家格拉德威尔在<异类>一书中指出: “人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了持续不断的努力.1万小时的锤炼是任何人从平凡变成超凡的必要条件.“ 他将此称为“一万小时定 ...
- OC 截取字符串
1.定义一个字符串a, 截取a 的某一个部分,复制给b, b必须是int型 NSString *a = @"1.2.30"; int b= [[a substringWithRa ...
- 简单的JDBC连接oracle数据库例子
java连接Oracle数据库 JDBC(Java Data Base Connectivity,java数据库连接),那么我们该如何用java进行数据库的连接呢. import java.sql.C ...
- js 手动轮播和自动轮播
$(function(){ //默认值 $("#carousel1").css("background-color","#FFF"); // ...
- android 进程(复习)
前台进程 前台进程是用户当前正在使用的进程.只有一些前台进程可以在任何时候都存在.他们是最后一个被结束的,当内存低到根本连他们都不能运行的时候.一般来说, 在这种情况下,设备会进行内存调度,中 ...
- SourceTree基础
克隆(clone):从远程仓库URL加载创建一个与远程仓库一样的本地仓库 提交(commit):将暂存文件上传到本地仓库(我们在Finder中对本地仓库做修改后一般都得先提交一次,再推送) 检出(ch ...
- 《剑指Offer》算法题——二维数组查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. class Solutio ...