关于MFC将一个窗体嵌入另一个窗体的方法

论坛 期权论坛 脚本     
匿名技术用户   2020-12-21 18:07   11   0

将一个窗体(子窗体)嵌入另一个窗体(父窗体),也就是相当于把一个窗体当成控件,放入另一个窗体中

现在用的比较多的方法是将子窗体的窗体属性中的border设为none,Style设为Child,在父窗体类中实现就行

  1. CPage *m_page = new CPage();
  2. m_page->Create(m_page::IDD,this);
  3. CRect re;
  4. GetDlgItem(IDC_PICTURE).GetWindowRect(&re);//IDC_PICTURE是在父窗体中放置的PictureCtrl控件,确定子窗体位置用的
  5. ScreenToClient(re);
  6. m_page->MoveWindow(re);
  7. m_page->ShowWindow(SW_SHOW);

这是比较普遍,而且简单的方法,但是有时候子窗体可能在别的地方还需要单独调用,而且是带边框的形式,这种就很头疼,总不能说建两个窗体吧。网上相关问题的帖子也挺多,但是都没有具体可靠的方法,最近解决了相关的问题,废话不多说

  1. CPage *m_page = new CPage();
  2. m_page->Create(m_page::IDD,this);
  3. m_page->SetParent(this);//这句必须加,要不然子窗体就不在父窗体内
  4. DWORD dw = ::GetWindowLong(m_page->m_hWnd,GWL_STYLE);
  5. dw = dw&~WS_POPUP;//取消弹出式窗体属性
  6. dw = dw&~WS_CAPTION;//取消标题栏
  7. dw = dw&~WS_THICKFRAME;//取消拖动改变大小
  8. dw = dw|WS_CHILD;//属性必须设为WS_CHILD
  9. ::SetWindowLong(m_page->m_hWnd,GWL_STYLE,dw);
  10. dw = ::GetWindowLong(m_page->m_hWnd,GWL_EXSTYLE);
  11. dw = dw&~WS_EX_DLGMODALFRAME;//去掉双边框的扩展属性
  12. ::SetWindowLong(m_page->m_hWnd,GWL_EXSTYLE,dw);
  13. CRect re;
  14. this->GetWindowRect(re);
  15. ScreenToClient(re);
  16. //m_page->SetWindowPos(&CWnd::wndTopMost,0,0,re.Width()-20,re.Height()-40,SWP_NOMOVE);
  17. m_page->MoveWindow(0,0,re.Width()-20,re.Height()-40);//用movewindow和setwindowpos都可以
  18. m_page->ShowWindow(SW_SHOW);

好了,就这么多,方法挺简单的,只不过没有系统的介绍

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP