FindWindow函数是获取顶层窗口的函数,不能获取子窗口。
FindWindowEx才是获取指定窗口的子窗口句柄(指针)的函数,要成功获取,需要以下几个条件:
第一参数必须指定明确的父窗口,如果为NULL,则是获取顶层窗口(即,父窗口为桌面);
被查找窗口(控件)必须和第二参数是明确的父子关系,且子窗口不是模态窗口(模态窗口有些特殊,一般不这样获取);
子窗口获取可能不是一次成功,如果类似子窗口很多,可能需要判断hwndChildAfter。
从你图中代码,无法判断需要获取的是否是顶层窗口,如果是,那么第一参数要写ClassName,而不是你的资源号,比如这样:
CWnd pwnd = FindWindow(NULL,_T("资源管理器"));如果是希望获取子窗口,在MFC下不推荐使用这两个函数。
另外,报错是因为在UNICODE字符集的工程下,第一参数需要使用宽字节字符串,加上_T转换就可以了。
1 在多文档多视图的MFC架构中,要想获得当前选中的CView可重写CView::OnActivateView函数,如下:
void
OnActivateView(BOOL bActivate,
CView pActivateView,
CView pDeactiveView)
{
if(bActivate)
{
SetEnable(TRUE);
}
else
{
SetEnable(FALSE);
}
CView::OnActivateView(bActivate,
pActivateView,
pDeactiveView);
}
2 获得窗口或者视图句柄
2.1 获得窗口句柄
要找到某个CWnd对象的HWND,用GetSafeHwnd()。
在窗口类中,有句柄的成员变量,可以直接访问: m_hWnd
在窗口类外,可以用AfxGetMainWnd()->m_hWnd获得。
在MainFrame里直接用this;
其它地方用 CMainFrame pMainFrame = (CMainFrame)theAppm_pMainWnd;
想得到一个控件的的句柄
GetDlgItem(ID…)->m_hWnd
2.2 获得视图的句柄
AfxGetMainWnd()->GetActiveView();
SDI: ((CFrameWnd)(AfxGetApp()->m_pMainWnd))->GetActiveView();
MDI: ((CFrameWnd)(AfxGetApp()->m_pMainWnd))->GetActiveFrame()->GetActiveView();
CWnd pWnd = GetDlgItem(ID_); // 取得控件的指针
HWND hwnd = pWnd->GetSafeHwnd(); // 取得控件的句柄
关键的步骤就是获取实际窗口指针(句柄)。
不同程序和模式获取方式不同,一般可以通过参数传递、AfxGetMainWnd等MFC函数获取、全局变量、共享内存等方式获取,第一种最简单,其它的各有要求。
获取指针后GetSafeHandle可以获取句柄,然后SendMessage即可。
1、启动VS,新建C# WinForm项目。
2、在Form1中添加4个Label控件,并布局如下。
3、在Form1中添加代码,如下。
4、完成之后,调试运行,结果如下。
注意事项:
C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。
实现多语言,有个简单的办法。
就是把这种已有的资源都写到配置文件里去,根据多语言都分别新增多个对应的配置文件,然后根据选择的语言调用不同地的配置文件更新,即可实现多语言界面。
如果都是UI资源,就在RC文件中就有。
以上就是关于关于C++MFC窗口控件句柄获取问题全部的内容,包括:关于C++MFC窗口控件句柄获取问题、mfc中创建分割视图怎么获取视图窗口句柄、MFC如何获得窗口中控件的句柄等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)