?
CWindow::Create(...)
{
CreateWindowEx(..., (LPVOID)this);
}
LRESULT CWindow::WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
OnCreate();
break;
case xx:
OnXX();
break;
default:
return DefWindowProc(m_hwnd, ...);
}
return 0;
}
// redirect to class
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
CWindow *win = (CWindow *)GetProp(hwnd, TEXT("THIS"));
if (uMsg == WM_NCCREATE)
{
win = (CWindow*)((CREATESTRUCT*)lParam)->lpCreateParams;
win->m_hwnd = hwnd;
SetProp(hwnd, TEXT("THIS"), (HANDLE)win);
}
if (uMsg == WM_NCDESTROY)
{
RemoveProp(hwnd, TEXT("THIS"));
}
return win ? win->WndProc(uMsg, wParam, lParam) : DefWindowProc(...);
}