子窗口置顶和子窗口设置大小 多文档-SetWindowPos()无效,

asdjy123 2013-08-05 03:41:50
我想实现的共能:在程序运行时有个子窗口A(主窗口),在达到移动条件时会自动的创建一个子窗口B(名称为"报警提示"),并在子窗口B中显示内容。
现在的问题有两个:
1、在子窗口A为最大化时,创建生成的子窗口B也会自动变成最大化,但我要的是是子窗口B不是最大化显示。
2、在子窗口A把子窗口B覆盖的情况下,在达到一定条件时(向B添加内容),窗口B不会显示在最上面窗口。
经过好几天的查找和测试在使用SetWindowPos()和MoveWindow()都无效,求大神指点
主要代码如下:
DrawYun.cpp:

// CDrawYunApp 初始化
BOOL CDrawYunApp::InitInstance()
{
............
............
// 注册应用程序的文档模板。文档模板
// 将用作文档、框架窗口和视图之间的连接 (这块创建工程时自带)
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_DrawYunTYPE,
RUNTIME_CLASS(CDrawYunDoc),
RUNTIME_CLASS(CSplitFrame), // 自定义 MDI 子框架
RUNTIME_CLASS(CDrawYunView));
if (!pDocTemplate)
return FALSE;
pDocTemplate->SetContainerInfo(IDR_DrawYunTYPE_CNTR_IP);//调用此函数在OLE对象被内部激活时设置所使用的资源。
AddDocTemplate(pDocTemplate);//调用这个成员函数,将文档模板加入应用程序维护的可用文档模板列表中。你可以在调用RegisterShellFileTypes之前加入所有的文档模板。

// 注册应用程序的文档模板。文档模板
//将用作告警文档、框架窗口和告警视图之间的连接
pWarnDocTemplate = new CMultiDocTemplate(IDR_DrawYunTYPE,
RUNTIME_CLASS(CWarnDoc),//告警窗口文档类
RUNTIME_CLASS(CSplitFrame),
RUNTIME_CLASS(CWarnView));//告警窗口视图类
if (!pWarnDocTemplate)
return FALSE;
pDocTemplate->SetContainerInfo(IDR_DrawYunTYPE_CNTR_IP);//调用此函数在OLE对象被内部激活时设置所使用的资源。

return TRUE;
}

达到条件消息响应函数:
LRESULT CWarnView::DemoData(WPARAM wParam,LPARAM lParam)
{
CMainFrame* pMW=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CWnd *pwnd = FindWindow(NULL,_T("报警提示"));
int i=SetWindowPos(&CWnd::wndTopMost,0,0,50,100,SWP_NOMOVE|SWP_SHOWWINDOW);//使告警窗口置最前, 调试时显示i不为0,因该调用成功了,为什么没效果
//上面一句如果换成int i=pwnd->SetWindowPos(&CWnd::wndTopMost,0,0,50,100,SWP_NOMOVE|SWP_SHOWWINDOW);会出现错误,调试发现pwnd的值为0x000000,怎么什么情况

if (i==0)
return false;
else
return true;
}

如果在::SendMessage(pMW->WarnHwnd,WM_DEMO_DATA,(WPARAM)0,(LPARAM)OrderValue);后面使用SetWindowPos()等改变子窗口B的大小和置顶也同样无效,怎么什么情况,求大神指点

还有不知自己建立一个子框架类,在里面进行设置是否可行,比如
pWarnDocTemplate = new CMultiDocTemplate(IDR_DrawYunTYPE,
RUNTIME_CLASS(CWarnDoc),//告警窗口文档类
RUNTIME_CLASS(CSplitFrame),
RUNTIME_CLASS(CWarnView));//告警窗口视图类
换成
pWarnDocTemplate = new CMultiDocTemplate(IDR_DrawYunTYPE,
RUNTIME_CLASS(CWarnDoc),//告警窗口文档类
RUNTIME_CLASS(CWarnFrame),//告警窗口子框架文档
RUNTIME_CLASS(CWarnView));//告警窗口视图类


请各位大神指点:已经搞了好几天的还没解决,在线等。。在此先谢了
...全文
434 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
asdjy123 2013-08-09
  • 打赏
  • 举报
回复

  CWnd *pwndWarn = FindWindow(NULL,_T("报警提示")); 
   CWnd *pwndView = FindWindow(NULL,_T("CDP_M22测试画面.cle")); 
   if(!pwndWarn)
     pwndWarn->SetOwner(pwndView);
   else
   {
   
   }
//调试发现:
pwndWarn=0x00000000
pwndView=0x00000000

asdjy123 2013-08-09
  • 打赏
  • 举报
回复
引用 15 楼 DeautyFan 的回复:
if(!pwndWarn) pwndWarn->SetOwner(pwndView); else { //检查到底怎么回事 }
"//检查到底怎么回事"能具体说下怎么检测?? 我单步调试时发现pwndWarn和pwndView的值都为NULL,可能是这个原因,奇怪FindWindow()怎么会没找到子窗口
无敌魔仙 2013-08-09
  • 打赏
  • 举报
回复
if(pwndWarn) pwndWarn->SetOwner(pwndView); else { //检查到底怎么回事 }
无敌魔仙 2013-08-09
  • 打赏
  • 举报
回复
if(!pwndWarn) pwndWarn->SetOwner(pwndView); else { //检查到底怎么回事 }
asdjy123 2013-08-09
  • 打赏
  • 举报
回复
引用 13 楼 VisualEleven 的回复:
你在View类中直接调用SetWindowPos(),而不是在框架窗口中调用SetWindowPos,当然不会起什么作用。
我就在自己创建的View中的响应函数直接调用SetWindowPos(),发现没有起作用,在楼主里的LRESULT CWarnView::DemoData(WPARAM wParam,LPARAM lParam) 不是也谢了,没起作用,同时使用MoveWidow也没起作用。注:我是在子窗口A最大化的情况下使用
asdjy123 2013-08-09
  • 打赏
  • 举报
回复
引用 19 楼 qsc555 的回复:
1、我给窗口B在专门搞一套:CWarnDoc//告警窗口文档类 CWarnFrame//告警窗口子框架文 CWarnView//告警窗口视图类,并在CWarnFrame.cpp的CWarnFrame::PreCreateWindow(CREATESTRUCT& cs)进行设置窗口大小,在窗口A最大化时,窗口B是CWarnFrame::PreCreateWindow(CREATESTRUCT& cs)中设置的大小,能否实现? PreCreateWindow 是创建窗口前设置的,而且大小可能后面会有改变,这个地方设置大小不靠谱; 嗯,是的,在再单步调试中发现开始创建B时不是最大化(A为最大化状态),在b中的响应函数填写好数据之后才变成最大化,猜测在创建填入数据之后要判断下A是否是最大化状态,如果是B也变成最大化------------------------------------------------------------------------------------ 我在CwarnView的达到条件的响应函数中添加CFrameWnd::SetActiveView没实现效果,是我哪里写的不对吗?代码如下: 这里应该用子框架设置CMDIChildWnd::SetActiveView CMDIChildWnd* pMW=(CMDIChildWnd*)AfxGetApp()->m_pMainWnd; 得到的pMV行吗----------------------------------------------------------------------------------- 我的多文档工程完成已经比较多,改成单文档不现实,并且我还有许多子窗口要显示 建议你把A,B窗口并排放着,这种界面效果也挺好,状态可以随时看到;
B平常不现实,只有达到条件时再创建,创建好之后可能还会关闭(用户觉得),再次达到条件再创建(会有许多次)所以并排对我来说不行,不过也谢谢您的回复 现在我有试验改成非模态对话框,虽然初步成功但发现主框架最大/最小化时对话框会移出子框架、和关闭时没能完全关闭等问题,问题贴在:http://bbs.csdn.net/topics/390542440,各位可以移驾看看
Eleven 2013-08-09
  • 打赏
  • 举报
回复
你在View类中直接调用SetWindowPos(),而不是在框架窗口中调用SetWindowPos,当然不会起什么作用。
asdjy123 2013-08-09
  • 打赏
  • 举报
回复
引用 11 楼 asdjy123 的回复:
自己顶下 怎么没人。难道我表述不行,我换种说法 在一个子窗口(如子窗口A)最大化之后,以后建立的子窗口(如子窗口B)都是自动最大化显示?有没有子窗口B不要最大化显示的方法?
哎!难道两个子窗口(视图)就没法实现这种功能,只有一个视图一个对话框才能实现,最后还是要把视图改为对话框。
qsc555 2013-08-09
  • 打赏
  • 举报
回复
1、我给窗口B在专门搞一套:CWarnDoc//告警窗口文档类 CWarnFrame//告警窗口子框架文 CWarnView//告警窗口视图类,并在CWarnFrame.cpp的CWarnFrame::PreCreateWindow(CREATESTRUCT& cs)进行设置窗口大小,在窗口A最大化时,窗口B是CWarnFrame::PreCreateWindow(CREATESTRUCT& cs)中设置的大小,能否实现? PreCreateWindow 是创建窗口前设置的,而且大小可能后面会有改变,这个地方设置大小不靠谱; ------------------------------------------------------------------------------------ 我在CwarnView的达到条件的响应函数中添加CFrameWnd::SetActiveView没实现效果,是我哪里写的不对吗?代码如下: 这里应该用子框架设置CMDIChildWnd::SetActiveView ----------------------------------------------------------------------------------- 我的多文档工程完成已经比较多,改成单文档不现实,并且我还有许多子窗口要显示 建议你把A,B窗口并排放着,这种界面效果也挺好,状态可以随时看到;
asdjy123 2013-08-08
  • 打赏
  • 举报
回复
自己顶下 怎么没人。难道我表述不行,我换种说法 在一个子窗口(如子窗口A)最大化之后,以后建立的子窗口(如子窗口B)都是自动最大化显示?有没有子窗口B不要最大化显示的方法?
asdjy123 2013-08-07
  • 打赏
  • 举报
回复
引用 7 楼 qsc555 的回复:
其实你用多文档多视图这种模式来实现这个并不是很好的框架,第一个问题就不好解决因为多视图最大化会把所有视图都最大化;然后第二个问题在条件达到时把B窗口设为当前激活视图CFrameWnd::SetActiveView,这个应该把B窗口置前了; 我建议你用单文档多视图,然后A窗口固定放上上面,B窗口固定放在下面,这样你就根本不需要去想着处理你现在的这些问题:)
to“第一个问题就不好解决因为多视图最大化会把所有视图都最大化;” 1、我给窗口B在专门搞一套:CWarnDoc//告警窗口文档类 CWarnFrame//告警窗口子框架文 CWarnView//告警窗口视图类,并在CWarnFrame.cpp的CWarnFrame::PreCreateWindow(CREATESTRUCT& cs)进行设置窗口大小,在窗口A最大化时,窗口B是CWarnFrame::PreCreateWindow(CREATESTRUCT& cs)中设置的大小,能否实现? to“第二个问题在条件达到时把B窗口设为当前激活视图CFrameWnd::SetActiveView” 2、我在CwarnView的达到条件的响应函数中添加CFrameWnd::SetActiveView没实现效果,是我哪里写的不对吗?代码如下:
 LRESULT CWarnView::DemoData(WPARAM wParam,LPARAM lParam)
 {
             .....
          CView *pView=this;
	  CMainFrame* pMW=(CMainFrame*)AfxGetApp()->m_pMainWnd;
	  pMW->SetActiveView(pView);
           .......
 }
to"我建议你用单文档多视图,然后A窗口固定放上上面,B窗口固定放在下面,这样你就根本不需要去想着处理你现在的这些问题" 3、我的多文档工程完成已经比较多,改成单文档不现实,并且我还有许多子窗口要显示
asdjy123 2013-08-07
  • 打赏
  • 举报
回复
引用 9 楼 allenhiman 的回复:
B看起来像是一个工具提示的东西 干嘛要做成视图类 弄个脱离文档视图架构的dialog不就好了吗 有什么问题吗
是的B就是一个提示,在出问题时跳出来提示用,不能最大化。查了半天都没解决,难道是方向错了,应该搞个dialog。 问下在一个子窗口最大化的情况下,再自动生成一个子窗口(视图类)能否做到建立的显示不是最大化状态
allenhiman 2013-08-07
  • 打赏
  • 举报
回复
B看起来像是一个工具提示的东西 干嘛要做成视图类 弄个脱离文档视图架构的dialog不就好了吗 有什么问题吗
qsc555 2013-08-06
  • 打赏
  • 举报
回复
其实你用多文档多视图这种模式来实现这个并不是很好的框架,第一个问题就不好解决因为多视图最大化会把所有视图都最大化;然后第二个问题在条件达到时把B窗口设为当前激活视图CFrameWnd::SetActiveView,这个应该把B窗口置前了; 我建议你用单文档多视图,然后A窗口固定放上上面,B窗口固定放在下面,这样你就根本不需要去想着处理你现在的这些问题:)
asdjy123 2013-08-06
  • 打赏
  • 举报
回复
引用 3 楼 allenhiman 的回复:
B.SetOwner(A).

不行,出现0x0000005的错误,
我加在CWarnView类的成员的响应函数中,是否可以
  CWnd *pwndWarn = FindWindow(NULL,_T("报警提示")); 
CWnd *pwndView = FindWindow(NULL,_T("CDP_M22测试画面"));
pwndWarn->SetOwner(pwndView);


两个窗口其实都是子窗口如图:

其中子窗口A一直存在,子窗口B在达到条件时创建并显示,功能已经实现,但问题有2:1、是在子窗口A在最大化时,建立的子窗口B也是最大化,我想子窗口B显示一定的大小(不要最大化)。2、在子窗口A覆盖子窗口B时,在达到莫个条件时,子窗口B不会显示在最前面。
子窗口B的创建:

//告警子框架窗口的创建
void CDrawYunApp::WarnData()
{
CWarnDoc * doc=new CWarnDoc(_T("报警提示"));
CFrameWnd* wnd=pWarnDocTemplate->CreateNewFrame(doc,NULL);//是子框架窗口开始创建的起点
if (wnd)
{
pWarnDocTemplate->InitialUpdateFrame(wnd,doc,TRUE);//会调用CWarnView::OnInitialUpdate(),没这句告警窗口不弹
}
}
allenhiman 2013-08-06
  • 打赏
  • 举报
回复
or B.SetParent(A)
allenhiman 2013-08-06
  • 打赏
  • 举报
回复
B.SetOwner(A).
asdjy123 2013-08-06
  • 打赏
  • 举报
回复
没人自己先顶个
asdjy123 2013-08-05
  • 打赏
  • 举报
回复
人呢........... 其实就是想设置窗口大小并显示在前面就行了,SetWindow(),MoveWindow()等函数为什么没成功

15,980

社区成员

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

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