2015-04-05 2 views
0

Я начал смотреть видеоролики с изображением ручной работы, и я пытаюсь создать окно win32, но функция CreateWindowEx() продолжает терпеть неудачу.C++ CreateWindowEx() не удается создать окно

Я проверил код ошибки, и я получаю 1407.

код ниже.

Заранее спасибо.

#include <Windows.h> 

LRESULT CALLBACK WindowProcedure(
    HWND hwnd, 
    UINT uMsg, 
    WPARAM wParam, 
    LPARAM lParam 
    ) 
{ 
    LRESULT result; 

    switch (uMsg) 
    { 
    case WM_ACTIVATEAPP: 
     { 
      OutputDebugStringA("The window is now active"); 

      break; 
     } 

    case WM_SIZE: 
     { 
      OutputDebugStringA("The window is now being resized"); 

      break; 
     } 

    case WM_CREATE: 
     { 
      OutputDebugStringA("The window has been created"); 

      break; 
     } 

    default: 
     { 
      result = DefWindowProc(hwnd, uMsg, wParam, lParam); 

      break; 
     } 
    } 

    return result; 
}; 

int CALLBACK WinMain(
    HINSTANCE hInstance, 
    HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, 
    int nCmdShow 
    ) 
{ 
    WNDCLASS GameWindow; 

    GameWindow.style = CS_OWNDC|CS_HREDRAW|CS_VREDRAW; 
    GameWindow.lpfnWndProc = WindowProcedure; 
    GameWindow.hInstance = hInstance; 
//  HICON  hIcon; 
    GameWindow.lpszClassName = "HandmadeHeroWindowClass"; 

    RegisterClass(&GameWindow); 

    if (HWND GameWindowHandle = CreateWindowEx(
     0, 
     GameWindow.lpszClassName, 
     "Handmade Hero", 
     WS_OVERLAPPEDWINDOW | WS_VISIBLE, 
     CW_USEDEFAULT, 
     CW_USEDEFAULT, 
     CW_USEDEFAULT, 
     CW_USEDEFAULT, 
     0, 
     0, 
     hInstance, 
     0 
     )) 
    { 

     for (;;) 
     { 
      MSG message; 
      BOOL messageResult = GetMessage(&message, GameWindowHandle, 0, 0); 
      if (messageResult != 0) 
      { 
       DispatchMessage(&message); 
      } 
      else if (messageResult == 0) 
      { 
       break; 
      } 
      else 
      { 
       // ERROR 
      } 
     } 

    } 
    else 
    { 
     OutputDebugStringA("Couldn't create window"); 
    } 

    DWORD error = GetLastError(); 

    return 0; 
}; 
+2

1407 == 'ERROR_CANNOT_FIND_WND_CLASS' – Michael

+0

Посмотрите, прошел ли ваш класс регистра. Я предполагаю, что это не так. – tMJ

+1

Я согласен с IMJ. 'RegisterClass()', скорее всего, не работает, потому что многие из полей 'WNDCLASS' не инициализируются. Всегда ноль-инициализировать структуры API и всегда проверять коды ошибок на вызовы функций API. –

ответ

1

Благодаря ответу Remy Lebeau проблема заключалась в том, что мой WNDCLASS имел неинициализированные значения для всех полей, кроме тех, которые я изменил, что привело к сбою RegisterClass() и, следовательно, CreateWindowEx() завершился с ошибкой.

Я изменил WNDCLASS заявление на это:

WNDCLASS GameWindow = {0}; 

Спасибо всем, кто помог.

1

Ваша оконная процедура возвращает неинициализированный переменной в каждом пути для default: за исключением, это неопределенное поведение и отказ создания оконного вполне возможно.

Для WM_CREATE, документация говорит:

Если приложение обрабатывает это сообщение, оно должно возвратить нуль, чтобы продолжить создание окна.


Как Майкл отметил в комментариях, RegisterClass не удается. В той же категории ошибок вы передаете структуру WNDCLASS, оставляя большинство участников неинициализированными.

+0

@Remy: документация фактически не говорит, что происходит для всех ненулевых значений. Просто ноль и -1. В любом случае возврат неинициализированного значения - UB. –

+0

Я удалил свой переключатель и получил его так, чтобы он возвращал DefWindowProc (hwnd, uMsg, wParam, lParam), все еще не работает. – mkdewidar

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