MFC获取各个窗口(体)之间的指针(对象) 本是古典 何须时尚 2022-08-13 18:49 124阅读 0赞 [MFC][] 在很多的对话框操作中,我们经常要用到在一个对话框中调用另一个对话框的函数或变量.可以用如下方法来解决. HWND hWnd=::FindWindow(NULL,\_T("Sphere")); //得到对话框的句柄 C\*\*\*Dialog\* pWnd= (C\*\*\*Dialog\*)C\*\*\*Dialog::FromHandle(hWnd); //由句柄得到对话框的对象指针 pWnd->xxx( ); //调用C\*\*\*Dialog中的函数xxx(); 以上参考:http://www.cnblogs.com/del/archive/2008/02/28/1085432.html。 通过窗口类函数:CWnd \*GetWindow获得窗口指针,pWnd->m\_hWnd(The handle of the Windows window attached to this CWnd)在::FromHandle(hWnd); 获取主窗口句柄: CWnd \*wnd = AfxGetMainWnd(); HWND hwnd = wnd->GetSafeHwnd(); 设置控件为窗口焦点:GetDlgItem(IDC\_TREE1)->SetFocus(); 获取控件句柄:HWND hwndctrl = ::GetDlgItem(mainHwnd, IDC\_TREE1);//获取树形控件的句柄IDC\_TREE IDC\_COMBO1 获取当前最上层窗口的句柄: HWND mainHwnd = ::GetForegroundWindow();//获取当前topmost的窗口句柄 获取当前窗口的焦点句柄: HWND currentFocus = ::GetFocus(); (一) [MFC][] 中获得各个类的句柄总结 VC中编程,最大的障碍和问题就是消息机制和指针获取与操作。其实这些内容基本上是每本VC学习工具书上 必讲的内容,而且通过MSDN很多问题都能解决。下面文字主要是个人在编程中指针使用的一些体会,说的不当的地方请指正。一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针获取和操作问题。 下面这节内容主要是一般的框架,然后再讲多线程中的指针使用。使用到的类需要包含响应的头文件。首先一般获得本类(视,文档,对话框都支持)实例指针this,用this的目的,主要可以通过类中的函数向其他类或者函数中发指针,以便于在非本类中操作和使用本类中的功能。 这其中的关键在于理解 m\_pMainWnd, AfxGetApp(),AfxGetMainWnd() 的意义! 1) 在View中获得Doc指针 CYouSDIDoc \*pDoc=GetDocument();一个视只能有一个文档。 2) 在App中获得MainFrame指针 CWinApp 中的 m\_pMainWnd变量就是MainFrame的指针,也可以: CMainFrame \*pMain =(CMainFrame \*)AfxGetMainWnd(); 3) 在View中获得MainFrame指针 CMainFrame \*pMain=(CmaimFrame \*)AfxGetApp()->m\_pMainWnd; 4) 获得View(已建立)指针 CMainFrame \*pMain=(CmaimFrame \*)AfxGetApp()->m\_pMainWnd; CyouView \*pView=(CyouView \*)pMain->GetActiveView(); 5) 获得当前文档指针 CDocument \* pCurrentDoc =(CFrameWnd \*)m\_pMainWnd->GetActiveDocument(); 6) 获得状态栏与工具栏指针 CStatusBar \* pStatusBar=(CStatusBar \*)AfxGetMainWnd()->GetDescendantWindow(AFX\_IDW\_STATUS\_BAR); CToolBar \* pToolBar=(CtoolBar \*)AfxGetMainWnd()->GetDescendantWindow(AFX\_IDW\_TOOLBAR); 7) 如果框架中加入工具栏和状态栏变量还可以这样 (CMainFrame \*)GetParent()->m\_wndToolBar; (CMainFrame \*)GetParent()->m\_wndStatusBar; 8) 在Mainframe获得菜单指针 CMenu \*pMenu=m\_pMainWnd->GetMenu(); 9) 在任何类中获得应用程序类 AfxGetInstanceHandle 得到句柄,AfxGetApp 得到指针 B1.如何在自己的类和“应用程序类”中获得“文档类”的句柄? SDI AfxGetMainWnd() -> GetActiveView() -> GetDocument() 得到指针 MDI AfxGetMainWnd() -> MDIGetActive() -> GetActiveView() -> GetDocument() 得到指针 B3.如何在“框架类”中获得“文档类”句柄? SDI GetActiveView() -> GetDocument() 得到指针,MDI MDIGetActive() -> GetActiveView() -> GetDocument() 从 CMainFrame 得到指针,GetActiveView() -> GetDocument() 从 CChildFrame 得到指针 B4.如何在“视图类”中获得“文档类”句柄? GetDocument() C1.如何在“文档类”中获得“视图类”句柄? GetView(),调用 GetFirstViewPosition 和 GetNextView 函数得到指针。 C2.如何在自己的类和“应用程序类”中获得“视图类”句柄? SDI GetActiveView 得到指针 MDI MDIGetActive() -> GetActiveView() 从 CMainFrame 得到指针,GetActiveView 从 CChildFrame 得到指针 最后提醒大家,在提取到各个句柄之后,因为初次提取的都是标准类句柄,所以,在使用时要注意将标准句柄转换成自己的类的句柄。如: AfxGetApp();//得到的是WinApp类的句柄, 所以操作前记得转换成自己定义的类的句柄。 如:((CMyApp\*)AfxGetApp())->XXXX();//这的xxxx()就是你定义的类中间的成员。 (二)MFC中**句柄、指针、ID之间的转换** win32直接操作的是句柄HANDLE,每个句柄就对应windows窗口,而vc对HANDLE进行类封装,间接操作的都是HANDLE,现在句柄只是类的一个成员变量。 从句柄到指针 CWnd\* pWnd=CWnd::FromHandle(hWnd); //a temporary CWnd object is created //and attached. pWnd->Attach(hWnd); //Attaches a Windows window to a CWnd object 从指针到句柄 HWND hWnd=pWnd->GetSafeHandle(); hWnd=pWnd->m\_hWnd; SDK编程中窗口ID,句柄,指针三者相互转换函数 ID--HANDLE--HWND三者之间的互相转换 id->句柄-----------hWnd = ::GetDlgItem(hParentWnd,id); id->指针-----------CWnd::GetDlgItem(); 句柄->id-----------id = GetWindowLong(hWnd,GWL\_ID); 句柄->指针--------CWnd \*pWnd=CWnd::FromHandle(hWnd); 指针->ID----------id = GetWindowLong(pWnd->GetSafeHwnd,GWL\_ID); GetDlgCtrlID(); 指针->句柄--------hWnd=cWnd.GetSafeHandle() or mywnd->m\_hWnd; HICON->ID--------HICON hIcon = AfxGetApp()->LoadIcon(nIconID); HICON hIcon = LoadIcon(AfxGetApp()->m\_hInstance, MAKEINTRESOURCE(nIconID)); 附注:获得窗口句柄三种方法 1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName) HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName) 2.HWND WindowFromPoint(POINT& Point)//获得当前鼠标光标位置的窗口HWND 本文来自CSDN博客:http://blog.csdn.net/cy757/archive/2009/08/07/4423756.aspx VC++中有关句柄和指针及其转换 1.MFC窗口的句柄和指针的转换 (1) 一般窗口对象都会有一个其对应的句柄变量,所以我们可以取此对象的m\_hWnd属性来得到句柄。 (2)使用GetSafeHwnd函数取得程序所在窗口类的句柄 (3)使用FromHandle函数来通过句柄得到其想要的指针 其他的一些方法: GetActiveWindow 取当前活动窗口句柄 AfxGetMainWnd 取主窗口句柄 GetForegroundWindow 取前台窗口句柄 FindWindow寻找参数指定的窗口 EnumWindow枚举窗口 2. 上下文无关设备的句柄和指针的转换 (1)this->m\_hDC (2)CDC::GetSafeHdc (3)可以使用FromHandle函数来通过句柄得到其想要的指针 3.Gdi对象的句柄和指针的转换 (1)this->m\_hObject (2)CGdiObject::GetSafeHandle (3)可以使用FromHandle函数来通过句柄得到其想要的指针 4.窗口、控件的指针和句柄的相互转化 (1)指针转化为句柄 在MFC应用程序中首先要获得窗口的指针,然后将其转化为句柄 CWnd\* pWnd; HANDLE hWnd = pWnd->GetSafeHwnd(); (2)句柄转化为指针 在MFC应用程序中首先获得对话框控件的句柄,然后获得其指针 HANDLE hWnd; GetDlgItem(IDC\_xxx,&hWnd); CWnd \* pWnd = FromHandle(hWnd); 获得程序窗口指针的办法 (1)获得主框架窗口指针(任何时候都可以用,只要是MFC程序中) CWnd\* pWnd = AfxGetMainWnd(); (2)获得对话框中控件指针 CWnd\* pWnd = GetDlgItem(IDC\_xxx); (3)获得对话框中某控件的句柄 HANDLE GetDlgItem(m\_hDLG,m\_nID\_DlgItem); (4)获得[GDI][]对象的句柄 HANDLE m\_h[GDI][]Obj = m\_pGDIObj->GetSafeHanle(); [MFC]: http://www.it165.net/pro/pkmfc/ [GDI]: http://www.it165.net/pro/
还没有评论,来说两句吧...