Xiangism

从一个无知角落里开始,蹒跚学步,一个未知到另一个未知,在跌跌撞撞中越走越快,越走越远,最后宇宙也为之开源。对于探索者来说,最后他们的思想总是变得和自己的足迹一样伟大。
随笔 - 62, 文章 - 1, 评论 - 220, 阅读 - 20万
  博客园  :: 首页  :: 联系 :: 管理
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

MFC子窗体、父窗体

Posted on   Xiangism  阅读(4077)  评论(0编辑  收藏  举报

现在需要将一个窗体放到一个控件中,默认情况下窗体的Style属性为Popup,而在控件的初始化时,代码如下:

m_dealDlg=shared_ptr<CImageDealDlg>(new CImageDealDlg());
m_dealDlg->Create(IDD_imageDeal);
m_dealDlg->SetParent(this);
m_dealDlg->ShowWindow(SW_SHOW);

这样做几乎没有问题——只有一个小小的完美之处——一个程序添加这个控件窗口后,如果有其它的非Topmost窗体有部分覆盖主程序,这时用鼠标直接点击子窗体,主程序不会弹到最上层来。用简洁的话说,即虽然用SetParent可以将一个窗体与虽一窗体设置为父子关系,但这时它们只是看起来像而已,即子窗体会跟随移动,可是没有没有消息通信。

于是想到将Style属性设置为Child,可这时在Release模式下,控件一片空白,在Debug模式下在winocc.cpp的328行ASSERT中断,发现是因为m_hWnd没有值的原因,而m_hWnd一般是在Create时被创建的,这时再研究下Create是否被正确调用,发现其后还可以指定第二个参数CWnd* pParentWnd。于是改成

m_dealDlg->Create(IDD_imageDeal,this);

发现程序正常运行,再去掉 m_dealDlg->SetParent(this); 也可正常运行。

原来如此,Parent得在Create函数中指定。这里再吐槽下,MFC中有三个地方可以设置父窗体——构造函数、Create参数、SetParent。

在MSDN中搜索Window Styles可以知道各种Style的区别,这里就不做翻译。

编辑推荐:
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
阅读排行:
· 手把手教你更优雅的享受 DeepSeek
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现
点击右上角即可分享
微信分享提示