MFC源码的一个疑问:ChildFrame如何与MainFrame联系起来

freenux 2010-03-09 10:05:13
最近研究MFC的View/Doc结构代码,发现一个疑问,希望高手帮忙解答一下:

在MDI的Frame中,ChildFrame、View和Document是在 CMultiDocTemplate::OpenDocumentFile()里创建的:

CDocument* CMultiDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName,
BOOL bMakeVisible)
{
CDocument* pDocument = CreateNewDocument();
//...
CFrameWnd* pFrame = CreateNewFrame(pDocument, NULL);
//...
if (lpszPathName == NULL)
{
// create a new document - with default document name
// ...
}
else
{
// open an existing document
//...
}
InitialUpdateFrame(pFrame, pDocument, bMakeVisible);
return pDocument;
}


其中CreateNewFrame的代码如下

CFrameWnd* CDocTemplate::CreateNewFrame(CDocument* pDoc, CFrameWnd* pOther)
{
// create a frame wired to the specified document
CCreateContext context;
context.m_pCurrentFrame = pOther;
context.m_pCurrentDoc = pDoc;
context.m_pNewViewClass = m_pViewClass;
context.m_pNewDocTemplate = this;
...
CFrameWnd* pFrame = (CFrameWnd*)m_pFrameClass->CreateObject();
...
// create new from resource
pFrame->LoadFrame(m_nIDResource,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, // default frame styles
NULL, &context)
...
return pFrame;
}

从CreateNewFrame的代码来看,ChildFrame的创建没有任何指针指向主框架,那么DocTemplate是如何把ChildFrame和MainFrame联系起来的呢,也就是说,怎么子框架是怎么嵌入到主框架的呢?
...全文
378 5 打赏 收藏 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
freenux 2010-03-10
  • 打赏
  • 举报
回复
不等了,我自己搞定了。呵呵~

原因在CMDIChildWnd::Create函数里,虽然在CDocTemplate::CreateNewFrame在调用LoadFrame的时候传给参数pParentWnd的值是NULL,但是该参数传递到CMDIChildWnd::Create的时候,Create判断其为NULL的话就从主线程里获得主框架的指针。下面是CMDIChildWnd::Create的源码:

BOOL CMDIChildWnd::Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect, CMDIFrameWnd* pParentWnd,
CCreateContext* pContext)
{
if (pParentWnd == NULL)
{
CWinThread *pThread = AfxGetThread();
ENSURE_VALID(pThread);
CWnd* pMainWnd = pThread->m_pMainWnd;
ENSURE_VALID(pMainWnd);
ASSERT_KINDOF(CMDIFrameWnd, pMainWnd);
pParentWnd = (CMDIFrameWnd*)pMainWnd;
}
ASSERT(::IsWindow(pParentWnd->m_hWndMDIClient));

// insure correct window positioning
pParentWnd->RecalcLayout();
//...
}
freenux 2010-03-10
  • 打赏
  • 举报
回复
在线等候中……
在线等候中……
在线等候中……
freenux 2010-03-09
  • 打赏
  • 举报
回复
引用 2 楼 sjdev 的回复:
好像是在App的InitInstance中的AddDocTemplate处勾搭上的吧。

那是添加文档模板,没说到点上
sjdev 2010-03-09
  • 打赏
  • 举报
回复
好像是在App的InitInstance中的AddDocTemplate处勾搭上的吧。
freenux 2010-03-09
  • 打赏
  • 举报
回复
在线等候中……
在线等候中……
在线等候中……
摘 要 针对高校教师教学业绩管理流程复杂、数据填报不规范、多级审核效率低、统计分析滞后等问题,本文设计并实现一套基于SpringBoot+Vue前后端分离架构的高校教师教学业绩综合管理系统。系统后端以SpringBoot处理业务逻辑与接口开发,前端用Vue构建交互界面,MySQL存储数据,MD5加密保障账号安全,具备低耦合、易扩展、易维护特性。 系统按权限划分为教师、学院管理员、学校管理员三级角色,构建闭环式业绩管理体系。教师可完成信息维护、业绩录入、成果申报、审核跟踪、档案导出、智能咨询与社区互动;学院管理员负责教师管理、业绩初审、数据汇总、通知发布与修正申请;学校管理员承担权限分配、数据维护、业绩终审、统计分析、公告发布与日志审计。 系统实现业绩填报、初审、终审、统计归档全流程线上化,支持批量导入、敏感词过滤、数据可视化、7×24小时AI咨询等功能,规范管理流程、减少统计误差、提升审核效率。测试表明,系统满足高校教学业绩精细化、规范化、信息化管理需求,为教师考核、绩效评定、教学评估提供数据支撑,提升高校教学管理智能化水平。 关键词: SpringBoot;Vue;教学业绩管理;三级权限;前后端分离
内容概要:本文围绕“基于雅可比伪逆迭代的双臂协同轨迹规划与跟踪误差收敛性研究”展开,通过Matlab代码实现双机械臂系统的协同运动控制与轨迹跟踪。研究采用雅可比伪逆法求解冗余机械臂的逆运动学问题,实现末端执行器在笛卡尔空间中的精确轨迹规划,并引入迭代优化机制提升双臂协同作业的精度与稳定性。重点分析了轨迹跟踪过程中误差的收敛特性,验证了所提控制算法在多自由度强耦合系统中的有效性和鲁棒性,适用于复杂环境下需要高精度配合的机器人协同操作任务。该研究属于科研仿真复现类工作,融合了机器人运动学理论、数值计算方法与控制算法设计,为多机械臂系统提供了可行的轨迹规划与控制策略参考。; 适合人群:具备扎实的机器人学基础、自动控制理论知识以及良好Matlab编程能力的科研人员或研究生,尤其适合从事多机械臂协同控制、运动规划、逆运动学求解及误差分析等方向的研究者。; 使用场景及目标:①用于多机械臂系统的协同轨迹规划与运动控制算法研究;②深入理解基于雅可比伪逆法的逆运动学求解原理及其在冗余机构中的应用;③分析轨迹跟踪误差的收敛行为,评估控制策略的稳定性与精度;④作为高质量论文复现资源,支撑相关课题的仿真验证、算法对比与改进创新。; 阅读建议:建议结合Matlab代码与机器人运动学经典理论同步学习,重点关注雅可比矩阵的构建、伪逆运算的实现方式、误差反馈机制的设计以及迭代过程中的数值稳定性处理,同时可进一步拓展至非线性优化、避免奇异位形及实时控制策略的改进研究。

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧