2016-02-01 2 views
0

Функция RegisterClassEx возвращает ненулевое значение, однако функция CreateWindowEx возвращает значение null. Я прочитал несколько ответов, и я, кажется, правильно слежу за всем. Может кто-нибудь, пожалуйста, просмотрите мой код и скажите мне, что происходит не так? Я предполагаю, что с моим WndProc что-то не так, но я не могу понять, что происходит не так. Я пытаюсь создать класс, который может рисовать окна, и, следовательно, функция WndProc является членом класса.Невозможно создать окно

void windowPainter::registerWindow() 
{ 
    WNDCLASSEX wcex = { 0 }; 
    wcex.cbSize = sizeof(wcex); 
    wcex.lpfnWndProc = windowPainter::WndProc; 
    wcex.hInstance = m_hInstance; 
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wcex.lpszClassName = windowClassName; 

    ATOM returnValue = RegisterClassEx(&wcex); 
    int lastErrorValue = GetLastError(); 
} 

void windowPainter::createWindow() 
{ 
    DWORD dwStyle1 = WS_EX_TOPMOST | WS_EX_LAYERED; 
    if (m_isClickThrough) 
     dwStyle1 = dwStyle1 | WS_EX_TRANSPARENT; 

    DWORD dwStyle2 = WS_POPUP; 
    RECT rc = { m_windowOriginX, m_windowOriginY, m_windowSizeX, m_windowSizeY }; 

    AdjustWindowRect(&rc, dwStyle1, FALSE); 
    BYTE alpha_value = 255; 

    m_hWnd = CreateWindowEx(dwStyle1,windowClassName, windowTitle, dwStyle2, rc.left, 
     rc.top, rc.right, 
     rc.bottom, 
     NULL, NULL, m_hInstance, NULL); 
} 

LRESULT CALLBACK windowPainter::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    PAINTSTRUCT ps; 
    HDC hdc; 
    UNREFERENCED_PARAMETER(lParam); 
    windowPainter* pThis = NULL; 
    if (WM_CREATE == message) 
    { 
     pThis = (windowPainter*)((LPCREATESTRUCT)lParam)->lpCreateParams; 
     SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)pThis); 
     return DefWindowProc(hWnd, message, wParam, lParam); 
    } 
    else 
    { 
     pThis = (windowPainter*)GetWindowLongPtr(hWnd, GWLP_USERDATA); 
    } 

    if (pThis) 
     switch (message) 
     { 
     case WM_PAINT: 
      if (pThis) 
      { 
       //do painting using members of pThis 
      }break; 

     case WM_DESTROY: 
      PostQuitMessage(0); 
      break; 
     case WM_LBUTTONDOWN: 
      pThis->onLeftButtonClick(); 
      break; 
     default: 
      return DefWindowProc(hWnd, message, wParam, lParam); 
     } 
    return DefWindowProc(hWnd, message, wParam, lParam); 
} 
+0

Проблема была в переменной windowClassName. Я не приписывал значение, которое получал после вызова c_str() (LPCWSTR) – TheBlueNotebook

ответ

1

Посмотрите на эти заявления от кода:

m_hWnd = CreateWindowEx(..., NULL); 

Здесь вы передаете NULL для lpParam аргумента.

pThis = (windowPainter*)((LPCREATESTRUCT)lParam)->lpCreateParams; 

В этой строке кода вы прочтете то же самое значение. Поскольку вы прошли NULL до lpParam при звонке CreateWindowEx, вы будете устанавливать pThis на NULL.

Вместо передачи NULL на номер lpParam при вызове CreateWindowEx вы должны передать адрес экземпляра.

m_hWnd = CreateWindowEx(..., (LPVOID)this); 

Обратите внимание, что эти изменения не должны влиять преуспевает ли не вызов CreateWindowEx или терпит неудачу. Для кода в вопросе pThis, являющийся NULL, означает, что вы всегда вызываете процедуру окна по умолчанию. Это не приведет к сбою окна. У вас, похоже, есть еще одна проблема в коде, предположительно в коде, который мы не видим.

+0

Это имеет смысл. Однако теперь мое возвращаемое значение из функции RegisterWindowEx равно нулю (и, следовательно, m_hWnd по-прежнему является нулевым) – TheBlueNotebook

+1

Вызов 'RegisterWindowEx' происходит перед вызовом' CreateWindowEx'. Как изменить один параметр на вызов функции «CreateWindowEx» на результат вызова «RegisterWindowEx»? Вы что-то изменили? –

+0

Хорошая точка. Итак, я снова проверил значения. Я создаю два экземпляра этого класса. Для одного из экземпляров я последовательно получаю возвращаемое значение нуля, а для другого - прерывистое. – TheBlueNotebook

Смежные вопросы