句柄映射 MFC在把句柄封装成对象方面不遗余力,为了保证同一线程内对象<->句柄映射是一对一的,创建了各种各样的句柄映射,窗口,GDI对象,菜单诸如此类。为了封装GetDlgItem,SelectObject这样的API返回的临时的句柄,MFC还产生临时的对象<->句柄映射。句柄映射使得GetParentFrame这样的函数可以实现。 CFrameWnd* CWnd::GetParentFrame() const { if (GetSafeHwnd() == NULL) // no Window attached return NULL; ASSERT_VALID(this); CWnd* pParentWnd = GetParent(); // start with one parent up while (pParentWnd != NULL) { if (pParentWnd->IsFrameWnd()) return (CFrameWnd*)pParentWnd; pParentWnd = pParentWnd->GetParent(); } return NULL; } _AFXWIN_INLINE CWnd* CWnd::GetParent() const { ASSERT(::IsWindow(m_hWnd)); return CWnd::FromHandle(::GetParent(m_hWnd)); } 看到了么,它首先调用API GetParent,然后去本线程的窗口<->句柄映射查找对象指针,然后调用CWnd::IsFrameWnd来决定对象是否是框架。(谢天谢地,这个函数是用虚函数而不是用CObject::IsKindOf,不然又得遍历一遍运行时类信息) 在一些经常调用的函数里面也使用到这个映射 LRESULT CALLBACK AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam) { // special message which identifies the window as using AfxWndProc if (nMsg == WM_QUERYAFXWNDPROC) return 1; |
正在阅读:分析MFC中的映射分析MFC中的映射
2004-04-02 10:19
出处:CSDN
责任编辑:sdq
键盘也能翻页,试试“← →”键