到静态的InitProc,CreateWindow的时候给最后一个参数,即初始化参数赋值为this指针:
CreateWindowEx(
dwExStyle,
szClass,
szTitle,
dwStyle,
x,
y,
width,
height,
hParentWnd,
hMenu,
hInst,
this //初始化参数
);,
在InitProc里面取出该指针:
LRESULT WINAPI CMyWnd::InitProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam)
{
if(uMsg == WM_NCCREATE)
{
CMyWnd *w = NULL;
w = (CMyWnd*)((LPCREATESTRUCT)lParam)->lpCreateParams;
if(w)
{
//记录hWnd
w->m_hWnd = hWnd;
//改变窗口过程为m_thunk
SetWindowLong(hWnd,GWL_WNDPROC,(LONG)w-CreateThunk());
return (*(WNDPROC)(w->GetThunk()))(hWnd,uMsg,wParam,lParam);
}
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
这样就大功告成。
窗口过程转发流程:
假设已建立CMyWnd类的窗口对象 CMyWnd *window,初始化完毕后调用window->Create,这时Create的窗口其窗口过程函数是静态CMyWnd::InitWndProc
InitWndProc 实现功能:window->Create创建窗口时已把对象this指针放入窗口初始化参数中,在此过程的WM_NCCREATE消息中把this指针取出来:CMyWnd *w = (CMyWnd*)((LPCREATESTRUCT)lParam)->lpCreateParams;记录HWND:w->m_hWnd = hWnd,然后设置窗口过程为w->m_thunk(thunk是一个WNDPROC类型的成员数据,所以可以设置)
└→ window->m_thunk 实现功能:跳转到静态CMyWnd::stdProc,在此之前替换系统的调用参数HWND为this指针
└→ stdProc 实现功能:把HWND转换为窗口类指针:
CMyWnd *w = (CMyWnd*)hWnd;
return w->WindowProc(uMsg,wParam,lParam)
└→ &nb