2016-03-11 15 views
1

У меня есть следующий бит кода;CreateWindow никогда не запускает WM_CREATE

#include <windows.h> 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ 
    printf("%d\n", message); 

    return 0; 
} 

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

    WNDCLASSEX wc = {0}; 

    wc.cbSize = sizeof(WNDCLASSEX); 

    wc.lpfnWndProc = WndProc; 
    wc.hInstance  = hInstance; 
    wc.hbrBackground = (HBRUSH)(COLOR_BACKGROUND); 
    wc.lpszClassName = "oglversionchecksample"; 
    wc.style = CS_OWNDC; 

    if(!RegisterClassEx(&wc)) 
     return 1; 

    CreateWindow(wc.lpszClassName, "openglversioncheck", WS_OVERLAPPED, 0, 0, 640, 480, 0, 0, hInstance, 0); 

    return 0; 
} 

Вызов CreateWindow() триггеров номера сообщений 36 WM_GETMINMAXINFO, 129 WM_NCCREATE, а затем 130 WM_NCDESTROY, но номер сообщения 1 WM_CREATE никогда не срабатывает, как это должно быть.

Что я делаю неправильно, что вызывает WM_CREATE, чтобы не срабатывать?

+0

Возможный дубликат [CreateWindow() в Visual C++ всегда возвращать нуль] (http://stackoverflow.com/questions/31493124/createwindow-in-visual-c- always-return-null) –

ответ

3

Он не вызывает никаких сообщений, поскольку цикл сообщений еще не вызывается.

Вы должны поставить это после CreateWindow

MSG msg; 
while (GetMessage(&msg, NULL, 0, 0)) 
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 

Кроме того, WndProc не просто возвращать ноль. Она должна возвращать следующее:

return DefWindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 

Visual Studio или другой IDE, можно создать C++ -> Win32 проект основной проект, он настраивает весь код.

+0

Вы получили его. Проблема заключалась в следующем: 'return 0;' не позволяло создавать окно. Часть 'GetMessage()' не требуется для запуска 'WM_CREATE'. –

2

Созданное окно не имеет времени для приема сообщений, оно немедленно закрывается. Вы должны вызвать GetMessage в цикле, чтобы окно осталось живым.

// Step 3: The Message Loop 
while(GetMessage(&Msg, NULL, 0, 0) > 0) 
{ 
    TranslateMessage(&Msg); 
    DispatchMessage(&Msg); 
} 
return Msg.wParam; 

Смотрите этот пример: http://www.winprog.org/tutorial/simple_window.html