MFC中MDI句柄的查找和使用

本文详细介绍了在MDI应用程序中如何获取不同层级窗口的句柄,包括父窗口、子文档窗口及其内部控件的句柄。通过示例代码展示了直接获取句柄的方法及遍历文档模板来访问特定控件的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例如已建一个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不然不认。

转载于:https://www.cnblogs.com/yurius/archive/2013/01/11/2857181.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值