WinAPI. CreateWindow возвращает NULL
WinAPI.
Почему CreateWindow может возвращать NULL? Класс зарегистрирован верно, всё, вроде как, делаю правильно, но CreateWindow упорно возвращает 0, при том, что окно создается и работает нормально, только вот проблема в его дескрипторе, который мне очень нужно сохранить. GetLastError() так же возвращает 0.
Вот код:
http://pastebin.com/x1Dk0Ssi
Почему CreateWindow может возвращать NULL? Класс зарегистрирован верно, всё, вроде как, делаю правильно, но CreateWindow упорно возвращает 0, при том, что окно создается и работает нормально, только вот проблема в его дескрипторе, который мне очень нужно сохранить. GetLastError() так же возвращает 0.
Вот код:
http://pastebin.com/x1Dk0Ssi
1 ответов
Корень проблемы лежал в том, что WM_CREATE было не первым сообщением, что принимала оконная процедура. И до завершения работы функции CreateWindow, оконная процедура уже принимала несколько сообщений, на тот момент, когда значение переменной MainWnd было NULL. К тому же в сообщении WM_CREATE передается не сам this, а &this, т.е. Test**.
Решилась проблема следующими преобразованиями:
Внешняя оконная процедура:
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam){
Test* T;
if(iMsg == WM_CREATE){
SetWindowLong(hwnd, GWL_USERDATA, (LONG)(*((Test**)lParam)));
lParam = (LPARAM)hwnd;
}
T = (Test*)GetWindowLong(hwnd, GWL_USERDATA);
if(!T) return DefWindowProc(hwnd, iMsg, wParam, lParam);
return T->WndProcClass(iMsg, wParam, lParam);
}
Внутренняя оконная процедура:
LRESULT WndProcClass(UINT iMsg, WPARAM wParam, LPARAM lParam){
if(iMsg == WM_CREATE){
MainWnd = (HWND)lParam;
}
if(iMsg == WM_PAINT){
PAINTSTRUCT ps;
HDC hDC = BeginPaint(MainWnd, &ps);
TextOut(hDC, 100, 100, "SUCCESS!!!", strlen("SUCCESS!!!"));
EndPaint(MainWnd, &ps);
return 0;
}
if(iMsg == WM_DESTROY){
PostQuitMessage(0);
return 0;
}
return DefWindowProc(MainWnd, iMsg, wParam, lParam);
}