WinAPI. CreateWindow возвращает NULL

WinAPI.
Почему 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);
  }