2015-12-31 4 views
0

Вот довольно чистое окно с только полем редактирования (дескриптор окон находится в моей GameLibrary.h), но я создал много окон раньше, и он отлично работал, теперь я не могу потому что жизнь меня узнает, почему окно открывается и закрывается.C++ Win32 - Окно закрывается при запуске

Я смотрел на свой WndProc и проверял, что что-то просачивается в сообщение DestroyWindow, но нет. Может ли кто-нибудь дать мне свежую пару глаз и рассказать мне, что может быть причиной этой проблемы? Благодаря!

#include "stdafx.h" 
#include "GameLibrary.h" 

LRESULT CALLBACK LoginWndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam); 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow) { 

    //Attributes for the Login Class 
    wchar_t szLoginWindowClassName[] = L"GameLauncherLogin"; 
    MSG msg; 
    WNDCLASSW LoginWindowClass; 

    LoginWindowClass.cbClsExtra = 0; 
    LoginWindowClass.cbWndExtra = 0; 
    LoginWindowClass.hbrBackground = HBRUSH(GetStockObject(WHITE_BRUSH)); 
    LoginWindowClass.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_ARROW)); 
    LoginWindowClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); 
    LoginWindowClass.hInstance = hInstance; 
    LoginWindowClass.lpfnWndProc = LoginWndProc; 
    LoginWindowClass.lpszClassName = szLoginWindowClassName; 
    LoginWindowClass.lpszMenuName = NULL; 
    LoginWindowClass.style = CS_HREDRAW | CS_VREDRAW; 

    if (!RegisterClass(&LoginWindowClass)) { 
     MessageBox(NULL, L"Class was not able to register!", L"Class Registration Error", MB_ICONERROR | MB_OK); 
    } 

    hLoginWindow = CreateWindow(szLoginWindowClassName, L"GameLibrary Login", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, NULL, NULL, hInstance, NULL); 

    if (hLoginWindow == NULL) { 
     return 1; 
    } 

    ShowWindow(hLoginWindow, SW_SHOW); 
    UpdateWindow(hLoginWindow); 

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

    return msg.wParam; 
} 

Это WndProc.

LRESULT CALLBACK LoginWndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam) { 

     switch (uMessage) { 

     case WM_CREATE: { 
      hUsername = CreateWindow(L"Edit", L"Test", WS_VISIBLE | WS_CHILD, 5, 5, 5, 5, hWnd, NULL, NULL, NULL); 
      break; 
     } 
     case WM_DESTROY: { 
      PostQuitMessage(0); 
      break; 
     } 

     default: { 
      return DefWindowProc(hWnd, uMessage, wParam, lParam); 
     } 

    } 
    return 0; 
} 
+0

'break' для' WM_CREATE', а не 'return', является неточным. И, возможно, 'DefWindowProc' возвращает логическое значение ошибки для' WM_CREATE'. Во всяком случае, возьмите на себя ответственность. –

+0

Другие общие рекомендации: при использовании C++, код на уровне C++. C-isms и Microsoft-isms просто делают код более подробным и менее понятным. –

+0

@ Cheersandhth.-Alf: В коде нет ни одной строки, которую можно было бы изменить, чтобы сделать код более C++ - ish. Структуры 'MSG' и' WNDCLASSW' могут быть правильно инициализированы нулем, но тогда это тоже не строго C++. Какие * «C-isms» * и * «Microsoft-измы» * вы бы предложили избавиться, и что вы предлагаете в качестве замены? – IInspectable

ответ

3

Цикл сообщений должен быть ... петлей!

while (GetMessage(&msg, NULL, 0, 0)) 
+0

О, мой Иисус! Спасибо огромное! Я на самом деле делал что-то в то время, когда думал о выражении if, когда писал это. #NoobStatus –

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