Если ты хочешь, чтобы для данного окна вызвались функции данного объекта класса, то нужно каким-то образом связать this и окно. Так как, функция-обработчик оконных сообщений обязана быть статической (в силу строго задания её прототипа), то единственное, как можно привязать this к окну, это через GWL_USERDATA. Если не ошибаюсь, то именно так выполняет привязку MFC.
Подход состоит в следующем:
Код: Выделить всё
class CMyWindow
{
public:
void CreateWindow( /* some parameters, i.g. window title */)
{
WNDCLASSEX wcl;
wcl.lpfnWndProc = &GlobalWndProc;
...
HWND hWnd = ::CreateWindowEx( /* do not set WS_VISIBLE style */ , wcl, ...);
::SetWindowLong(hWnd, GWL_USERDATA, (long)this);
::ShowWindow(hWnd, SW_SHOW);
}
private:
static LRESULT CALLBACK GlobalWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
long nThis = GetWindowLong(hWnd, GWL_USERDATA);
CMyWindow* pThis = (CMyWindow*)nThis;
if (pThis)
{
return pThis->WndProc(hWnd, message, wParam, lParam);
}
return ::WindowProc(hWnd, message, wParam, lParam);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// your impelentation
}
}
При таком подходе есть свои тонкости, например, WM_CREATE твоя процедура не получит. Это можно обойти, если послать в CreateWindow в качестве последнего параметра тоже this и предусмотреть этот вариант развития событий в GlobalWndProc.