MFC_句柄总结
| MFC在很多的对话框操作中,我们经常要用到在一个对话框中调用另一个对话框的函数或变量.可以用如下方法来解决. HWNDhWnd=::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(Thehandle of the Windows window attached to this CWnd)在::FromHandle(hWnd); 获取主窗口句柄: CWnd*wnd = AfxGetMainWnd(); HWNDhwnd = 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() 得到指针,MDIMDIGetActive() -> 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 iscreated //and attached. pWnd->Attach(hWnd); //Attaches a Windows window to a CWndobject 从指针到句柄 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(HWNDhwndParent, 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_hGDIObj = m_pGDIObj->GetSafeHanle(); |
浙公网安备 33010602011771号