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不然不认。