MFC窗口位置管理详细分析及实例


还有象单 文档程序的视图窗口,多 文档程序的那个MDIClient窗口,分隔条窗口,他们的id值介于下面两个id值之间:
AFX_IDW_PANE_FIRST 0xE900 //
AFX_IDW_PANE_LAST 0xE9FF

你要给你自己的子窗口分配id的话,别和上面的重复了。一般如果用IDE的菜单view/resource symbols项来加入自己的id的话,是不会重复的。有关id,还可以看看msdn里的TN020文章,那是专讲id的。

实例分析

1。CFrameWnd类是如何调用RepositionBars函数的

前面介绍了RepositionBars的各个参数和意义,现在看看CFrameWnd类是如何调用这个函数的,从中可以学习RepositionBars函数的使用方法。

CFrameWnd类及其派生类生成的窗口的客户区内可以有工具栏,状态条和视图窗口等子窗口。当父窗口的尺寸发生变化时,这些子窗口的各自的位置和大小 比例关系保持不变,这就需要父窗口一旦在它自己的尺寸发生变化时就调用RepositionBars函数。CFrameWnd类是集中在函数 RecalcLayout里调用RepositionBars函数的。该类保证了在窗口尺寸发生变化时函数RecalcLayout都被调用,从而 RepositionBars函数也能被及时调用,确保了各个子窗口都能及时调整自己的位置和大小。

RecalcLayout是个虚函数。该函数的功能就是在主框架的客户区内提供一个初始的可用区域,并把这个区域放在一个CRect类型的变量里。该函数大致是这样的:

void CFrameWnd::RecalcLayout(BOOL bNotify)
{
if (m_bInRecalcLayout)
return;//这大概是在防止该函数重入
m_bInRecalcLayout = TRUE;
....
....
....
....
if (GetStyle() & FWS_SNAPTOBARS)
{
CRect rect(0, 0, 32767, 32767);
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery,
&rect, &rect, FALSE);
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposExtra,
&m_rectBorder, &rect, TRUE);
CalcWindowRect(&rect);
SetWindowPos(NULL, 0, 0, rect.Width(), rect.Height(),
SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOZORDER);
}
else
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposExtra, &m_rectBorder);
m_bInRecalcLayout = FALSE;
} 可以看出,mfc认为这个函数是不能重入的。在编制自己的RecalcLayout()函数时也得用同样的方法来防止重入。
后面的if语句检查框架窗口是否具有风格FWS_SNAPTOBARS,这个风格用在什么时候呢?我是这样认为的:通常都是在主框架窗口的尺寸改变
时,子窗口在响应WM_SIZEPARENT消息时调整自己的尺寸以便跟上框架窗口的尺寸变化。有这样的情况:父窗口的客户区内的子窗口的数目是动态变
化的,而且这些子窗口互相不能重叠,他们的尺寸由于某种原因不好改变。那么当子窗口的数目发生增减时,如不调整父窗口自己的尺寸,就会导
致客户区留下空白或新增加的子窗口没有多余空间安排。FWS_SNAPTOBARS风格就是用在这种情况下,使父窗口能调整自己的大小以便容纳子窗口。
看这个分支里的语句,似乎是这样的。
一般都不会有FWS_SNAPTOBARS风格的,所以一般是执行else分支。在这个分支里简单地调用RepositionBars去重排所有的子窗口,它的参数
lpRectClient 使用默认的NULL值,意思就是初始可用区域是父窗口的整个客户区。
可以在自己的派生类里编写自己的RecalcLayout函数,以便用自己的方法调用RepositionBars函数。要注意的是在CFrameWnd类的窗口刚被创建
时RecalcLayout函数也被调用,此时可能某些用户自己加的子窗口还未被创建出来,所以在这个函数内如果要引用某个用户自己加的子窗口的句柄
的话必须先用::IsWindow()函数判断一下该窗口句柄是否可用。否则的话就会出现非法操作了。


实战演练
由于精力有限,只提供一个实战例子:将视图,工具栏和状态栏赶到右边
我们要生成这样的界面:视图窗口,工具栏和状态条统统在右边,左边是个自己加的窗口。
第一步:启动AppWizard生成一个单 文档程序,全部使用默认设置。
第二步:在CMainFrame类里增加一个成员 CWnd m_mywnd。
第三步:在CMainFrame::OnCreate()函数里增加这几行:
m_mywnd.CreateEx
(
WS_EX_CLIENTEDGE,
AfxRegisterWndClass
(
CS_HREDRAW|CS_VREDRAW,
::LoadCursor(NULL,IDC_ARROW),
::CreateSolidBrush(RGB(190,190,190))
),
"",
WS_VISIBLE|WS_CHILD,
CRect(0,0,0,0),
this,
IDC_MYPANE //用IDE的菜单view/resource symbols项加入的id。
);

第四步:启动ClassView,在CMainFrame里加上虚函数RecalcLayout(),函数体这样写:
void CMainFrame::RecalcLayout(BOOL bNotify)
{
if (m_bInRecalcLayout)
return;
m_bInRecalcLayout = TRUE;

//rect1是新加的窗口将占据的区域
//rect2就是提供给工具栏,状态条和视图窗口的初始可用区域。
CRect rect1,rect2;
GetClientRect(&rect1);
rect1.right=rect1.right/3;
GetClientRect(&rect2);
rect2.left=rect2.right/3;

if(::IsWindow(m_mywnd.m_hWnd)) //这句是不能少的
m_mywnd.MoveWindow(&rect1);
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposExtra, CRect(0,0,0,0),&rect2);
m_bInRecalcLayout = FALSE;
}

第五步:用IDE的菜单view/resource symbols项加入一个id:IDC_MYPANE。
第六步:编译并运行程序。

好了,在主框架窗口的左边多了一个灰色的窗口,它占主窗口客户区的三分之一。工具栏,状态条和视图都被赶到右边三分之二的地方去了。

 
2005年10月 随笔档案 - blog - 博客园
MFC窗口位置管理详细分析及实例[转] posted @ 2005-10-25 22:54 henry 阅读(76) | 评论(0) 编辑 真彩位图工具栏 posted @ 2005-10-25 22:51 henry 阅读(121) | 评论(0) 编辑 Rebar 的编程 posted @ 2005-10-25 22:50...
www.cnblogs.com/henryzc/archive/2005/10.html 52K 2007-8-23 - 百度快照

代码大全040212
funlove.4099病毒的分析与清除.rar funlove的分析与清除.rar MFC中内存泄漏的检测.rar NT环境下调用中断门运行特权...一个任务图标管理程序的实现.rar 不规则窗口演示.rar 介绍了一种可以灵活地在任何窗口上使用自动化服务器地方法.rar...
a.cd159.cn/iisadmin/Bigdipper/soft/ 59K 2008-8-25 - 百度快照

ASP_Web开发_开发特区_软件资讯_太平洋电脑网软件资讯频道
太平洋电脑网软件资讯频道国内最新最快最丰富的软件信息开放平台!一直致力于提供新鲜、全面、专业的软件信息和知识。旗下设有新闻、评测、学电脑、应用、设计、开发等频道,软件资讯,无限精彩!
www.pconline.com.cn/pcedu/empolder/wz/asp/ 54K 2008-9-11 - 百度快照

在一般用MFC编写的程序的窗口客户区中,可能有好几个子窗口(具有W..
如果这样,我宁愿永远不选择mfc!在学电脑之前,本.MFC窗口位置管理详细分析及实例 在一般用mfc编写的程序的窗口客户区中,可能有好几个子窗口(具有wm_child风格的窗口).上边是工具栏,中间是视图窗口,下边是状态栏.三个窗口在框架的客户区里...
www.esjs.com.cn/development/p463/J4635689 ... 14K 2008-10-3 - 百度快照

在一般用MFC编写的程序的窗口客户区中,可能有好几个子窗口(具有W..
调用组.MFC窗口位置管理详细分析及实例 在一般用mfc编写的程序的窗口客户区中,可能有好几个子窗口(具有wm_child风格的窗口)。上边是工具栏,中间是视图窗口,下边是状态栏。三个窗口在框架的客户区里与平共处,互不重叠。主框架窗口的尺寸...
www.hxay2005.com.cn/it/p465/J46557220.shtml 12K 2008-5-30 - 百度快照

mfc窗口位置管理详细分析及实例
关闭窗口 MFC窗口位置管理详细分析及实例 作者:佚名 文章来源:不详 点击数 更新时间:2006-6-6 文章录入:admin ...好了,在主框架窗口的左边多了一个灰色的窗口,它占主窗口客户区的三分之一。工具栏,状态条和视图都被赶到右边三分之...
www.51fy.cn/jc/cxsj/Print.asp?ArticleID=1 ... 3K 2006-9-18 - 百度快照

渊源回忆的BLOG - 渊源回忆 - 新浪BLOG
这两天写和窗口有关的代码,几年都没有写过界面的代码了,这篇文章算写的不多吧! MFC窗口位置管理详细分析及实例 2003-4-11 12:54:05 DPG 阅读次数: 14765 在一般用MFC编写的程序的窗口客户区中,可能有好几个子窗口(具有WM_CHILD...
blog.sina.com.cn/fuckcomputer 68K 2007-9-19 - 百度快照

VC实例分析-VC语言
弹出窗口杀手(下)制作光墙效果如何实现提取并保存图标资源不用Hook也能实现方面快捷的换肤功能VB与VC通信初探(二)明明白白看MFC之程序框架(二)VC学习:拥有Office XP风格的界面MFC窗口位置管理详细分析及实例深入探讨MFC消息循环和消息泵(一...
study.qqcf.com/sort/189/list_2_1.htm 13K 2008-10-7 - 百度快照

开发语言教程,VC编程技巧,VC编程实例,VC编程文摘-网络编程-中国IT..
您的位置:开发语言 > VC编程 ·如何创建一个不规则形状的窗口 2008-5-12 ·MFC窗口位置管理详细分析及实例 2008-5-12 ·谈VC++中的Progress控件的使用 2008-5-12 ·VC++环境下浮动工具条的编程 2008-5-12 ·为CListBox加上智能...
www.newcsdn.com/list/222002/8.shtml 15K 2008-8-6 - 百度快照

vc mfc编程实例.rar - VC & C++书籍教程 - 问友源码论坛
Pr评侯捷的<深入浅出MFC>和李久进的<MFC深入浅出C++文件传输源码CSocket文件传输MFC窗口位置管理详细分析及实例断点续传和多线程下载VC++界面设计解决方案(完全版)AUDP安全传输(完整源码)采用Socket的http服务器源码VC6从入门到精通-基础篇 ...
www.winu.cn/viewthread.php?tid=23189 26K 2008-10-1 - 百度快照
  • 0
    点赞
  • 1
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 1 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

skyremember

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值