CAxWindow 与 CAxHostWindow 之间的联系, 通过跟踪调试,之间的关系是 CAxWindow 和 CAxHostWindow
是同一个实例的不同表象.可由窗口的创建过程理清二者关系.首先 CAxWindow 继承自 CWindow 而不是
CWindowImpl<>,创建的窗口的类是在AtlAxWinInit()中注册的类.其 WNDPROC 是
AtlAxWindowProc, AtlAxWindowProc2.窗口消息均由 AtlAxWindowProc 处理.在 WM_CREATE 中创建
CAxHostWindow 实例,只是创建了一个 CAxHostWindow,并没有创建任何窗口,没有窗口句柄,然后
CAxHostWindow::SubclassWindow(hWnd);至此 CAxHostWindow 已经有了一个窗口句柄可以处理窗口消息,
消息已经不再通过 AtlAxWindowProc 处理,而由 CAxHostWindow 自己的消息处理过程处理
通过 BEGIN_MSG_MAP 实现. 如下这段代码不知何意.
hRet = spUnk->QueryInterface(__uuidof(IAxWinHostWindow), (void**)&pAxWindow);
if(FAILED(hRet))
return -1; // abort window creation
::SetWindowLongPtr(hWnd, GWLP_USERDATA, (DWORD_PTR)pAxWindow);
最后 CAxWindow 也已经创建成功.以后 CAxWindow::QueryHost 等方法最终都是调用到 CAxHostWindow 内部的实现.
CAxWindow 看似有点像是从 CAxHostWindow 继承来.但是 CAxWindow 不能使用 CAxHostWindow 的任何public
变量, CAxHostWindow通过 CAxHostWindow::SubclassWindow() 为CAxWindow 处理消息.CAxWindow 在前台,
CAxHostWindow 在幕后,提供对 CAxWindow 的方法支持.
是同一个实例的不同表象.可由窗口的创建过程理清二者关系.首先 CAxWindow 继承自 CWindow 而不是
CWindowImpl<>,创建的窗口的类是在AtlAxWinInit()中注册的类.其 WNDPROC 是
AtlAxWindowProc, AtlAxWindowProc2.窗口消息均由 AtlAxWindowProc 处理.在 WM_CREATE 中创建
CAxHostWindow 实例,只是创建了一个 CAxHostWindow,并没有创建任何窗口,没有窗口句柄,然后
CAxHostWindow::SubclassWindow(hWnd);至此 CAxHostWindow 已经有了一个窗口句柄可以处理窗口消息,
消息已经不再通过 AtlAxWindowProc 处理,而由 CAxHostWindow 自己的消息处理过程处理
通过 BEGIN_MSG_MAP 实现. 如下这段代码不知何意.
hRet = spUnk->QueryInterface(__uuidof(IAxWinHostWindow), (void**)&pAxWindow);
if(FAILED(hRet))
return -1; // abort window creation
::SetWindowLongPtr(hWnd, GWLP_USERDATA, (DWORD_PTR)pAxWindow);
最后 CAxWindow 也已经创建成功.以后 CAxWindow::QueryHost 等方法最终都是调用到 CAxHostWindow 内部的实现.
CAxWindow 看似有点像是从 CAxHostWindow 继承来.但是 CAxWindow 不能使用 CAxHostWindow 的任何public
变量, CAxHostWindow通过 CAxHostWindow::SubclassWindow() 为CAxWindow 处理消息.CAxWindow 在前台,
CAxHostWindow 在幕后,提供对 CAxWindow 的方法支持.