MFC中MDI句柄的查找和使用

例如已建一个MDI,有两个文档。

 
首先要明确一个MDI里的哪些东西有句柄,各是怎么样的:


看上图,红线框内的都是具有句柄的,其中,父窗口cstest的子窗口先必须是MDI Client(MDI Client是类型),MDI Client有两个子窗口,子窗口的句柄的text为1(或2),内含Dialog(类型为#32770),Dialog内含控件句柄。
 
在VIEW类中直接使用
HWND hWnd = AfxGetMainWnd()->m_hWnd;
找到的是父窗口的句柄,即含有两个子文档的大窗口的句柄。
 
在VIEW类中直接使用
HWND hWnd=GetSafeHwnd();
找到的是激活的子窗口的view的句柄(不是窗口的句柄,不含frame)
 
像上图,从交窗口找到Edit Box控件的句柄可以这样:
HWND hWnd = AfxGetMainWnd()->m_hWnd;//不安全的作法,正确的作法应该是:
CWnd*pwnd=AfxGetMainWnd();HWND hWnd = pwnd->GetSafeHwnd();
 
HWND hWnd2=FindWindowEx(hWnd,NULL,"MDIClient",NULL);
HWND hWnd3=FindWindowEx(hWnd2,NULL,NULL,"32");
HWND hWnd4=FindWindowEx(hWnd3,NULL,"#32770",NULL);
HWND hWnd5=::GetDlgItem(hWnd4,IDC_EDIT1);
FromHandle(hWnd5)->SetWindowText(aa);//设置控件内容
 
其实我的目的是要控制几个打开文档下的控件,上面方法有点傻,下面是网上找到的另一种:
POSITION pos = theApp.GetFirstDocTemplatePosition();
while (pos != NULL)
{
 CDocTemplate *p = theApp.GetNextDocTemplate(pos);
 POSITION posdoc = p->GetFirstDocPosition();
 while (posdoc != NULL)
 {
  CDocument* pDoc = p->GetNextDoc(posdoc);
       if (pDoc != NULL)
      {
           POSITION posview = pDoc->GetFirstViewPosition();
          if (posview != NULL)
          {
              CView* pV = pDoc->GetNextView(posview);
 HWND hWnd=pV->GetSafeHwnd();
 HWND hWnd2=::GetDlgItem(hWnd,IDC_EDIT1);
 FromHandle(hWnd2)->SetWindowText(aa);
 
          }
      }
   }
}
注意要extern theapp不然不认。
posted @ 2013-01-11 23:08  yurius  阅读(869)  评论(0编辑  收藏  举报