vc MDI子窗口标题丢失

....HWNDparent=::FindWindowEx(AfxGetMainWnd()->m_hWnd,NULL,"MDIClient",NULL);//在主窗口中查... ....
HWND parent = ::FindWindowEx(AfxGetMainWnd()->m_hWnd,NULL,"MDIClient",NULL); //在主窗口中查找
HWND child = ::FindWindowEx(parent,NULL,NULL,str); //查询子窗口是否已经打开
if (child != NULL) //判断子窗口是否已经打开
::BringWindowToTop(child); //设为活动窗口
else
{
//自定义创建子窗口
POSITION tplPos = AfxGetApp()->GetFirstDocTemplatePosition();
CDocTemplate * pDocTpl = AfxGetApp()->GetNextDocTemplate(tplPos);
CDocument * pNewDoc = new CDocument(); //创建一个新文档
CChildFrame * pNewChWnd = (CChildFrame *)(pDocTpl->CreateNewFrame(pNewDoc, NULL)); //创建子窗口框架
pNewChWnd->SetTitle(_T(str)); //设置文档标题
pNewChWnd->ShowWindow(SW_SHOWNORMAL); //显示子窗口
pNewChWnd->SetFocus(); //获取焦点
}
....
==================================================================
上面的方式创建的子窗口,当有两个子窗口A、B的时候,鼠标点不活动的子窗口内部区域(客户区)使子窗口A为活动窗口,然后鼠标点子窗口B改为子窗口B为活动窗口,此时变为不活动的子窗口A的标题没有了(成了空标题),这是为什么?怎么解决?
(如果鼠标点的是窗口标题栏位置不是窗口内部或者通过其他函数激活窗口的话就不会有这现象!)
求高手帮忙指导下,谢谢!
展开
 我来答
silvergingko
2009-09-10 · TA获得超过5945个赞
知道小有建树答主
回答量:688
采纳率:0%
帮助的人:888万
展开全部
在 CDocument * pNewDoc = new CDocument();后面添一句
pNewDoc->SetTitle(_(str));
然后再看看。

分析如下:
当子窗口由非活动转为活动时,MFC的CMDIFrameWnd类会自动调用OnUpdateFrameTitle(BOOL bAddToTitle)函数,在函数体中可以发现这样一句判断语句并进入:if (bAddToTitle &&
(pActiveChild = MDIGetActive()) != NULL &&
(pActiveChild->GetStyle() & WS_MAXIMIZE) == 0 &&
(pDocument != NULL ||
(pDocument = pActiveChild->GetActiveDocument()) != NULL))

最后执行UpdateFrameTitleForDocument(pDocument->GetTitle());
关键是最后一句会调用pDocument->GetTitle(),由于新的文档没有标题,导致CMDIFrameWnd也没有标题了!

调试技巧:
遇到问题后,知道了大概是在WM_ACTIVATE这块消息的处理时,MFC肯定内部会做处理,因此我们必须查看MFC内部是如何在子窗口得到WM_ACTIVATE时是如何处理的,可以重载这个消息处理函数,并在函数体中调用基类的这个消息处理函数,这样做的目的是方便设断点!设置了断点,然后鼠标单击新创建的窗口,使该断点触发,再通过VC菜单--调试》逐语句或逐过程,来跟踪MFC的基类代码。最后定位到“void CMDIFrameWnd::OnUpdateFrameTitle(BOOL bAddToTitle)”这个函数,且查到问题症结在“UpdateFrameTitleForDocument(pDocument->GetTitle());”这个函数上。问题找到!!!
P.S.在多文档MFC中,CMDIFrameWnd被激活得到的是WM_MDIACTIVATE,所以应该是在我们的类中添加这条消息的处理函数,而不是WM_ACTIVATE。祝楼主学会更多的调试技巧,做出更帮的程序来!
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式