Вот довольно чистое окно с только полем редактирования (дескриптор окон находится в моей 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;
}
'break' для' WM_CREATE', а не 'return', является неточным. И, возможно, 'DefWindowProc' возвращает логическое значение ошибки для' WM_CREATE'. Во всяком случае, возьмите на себя ответственность. –
Другие общие рекомендации: при использовании C++, код на уровне C++. C-isms и Microsoft-isms просто делают код более подробным и менее понятным. –
@ Cheersandhth.-Alf: В коде нет ни одной строки, которую можно было бы изменить, чтобы сделать код более C++ - ish. Структуры 'MSG' и' WNDCLASSW' могут быть правильно инициализированы нулем, но тогда это тоже не строго C++. Какие * «C-isms» * и * «Microsoft-измы» * вы бы предложили избавиться, и что вы предлагаете в качестве замены? – IInspectable