#include <stdio.h>
#include <stdbool.h>
#include <Windows.h>
HWND WindowHandle;
HINSTANCE Instance;
const wchar_t WindowClassName[] = L"Temp Projcet";
LRESULT CALLBACK WindowProc(HWND _windowHandle, UINT _msg, WPARAM _param, LPARAM _param1) {
switch (_msg) {
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(WindowHandle, &ps);
FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
EndPaint(WindowHandle, &ps);
} break;
case WM_CLOSE: {
if (IDOK == MessageBoxW(WindowHandle, L"Quit?", L"My application", MB_OKCANCEL)) {
DestroyWindow(WindowHandle);
}
return false;
} break;
case WM_DESTROY: {
PostQuitMessage(0);
} break;
default:
break;
}
return DefWindowProcW(WindowHandle, _msg, _param, _param1);
}
ATOM RegisterWindowClass(void) {
WNDCLASS wc = { 0 };
wc.lpfnWndProc = WindowProc;
wc.hInstance = Instance;
wc.lpszClassName = WindowClassName;
return RegisterClassW(&wc);
}
int APIENTRY wWinMain(HINSTANCE _instance, HINSTANCE _prevInstance, PWSTR _cmdLine, int _cmdShow) {
Instance = _instance;
RegisterWindowClass();
WindowHandle = CreateWindowExW(
0,
WindowClassName,
L"This a window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL,
NULL,
Instance,
NULL
);
DWORD err = GetLastError();
// Why error 1400 Invalid window handle?
MSG msg = { 0 };
while (GetMessageW(&msg, WindowHandle, 0, 0)) {
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
return 0;
}
왜 창을 만들 때 1400 개의 잘못된 핸들을 반환합니까? 그럴 필요 없나요? 윈도우 생성 함수에는 창 핸들이 없습니다. 어떻게 그것이 잘못된 핸들이 될 수 있습니까? 나는 오랜 시간 동안 검색 엔진을 통해 검색했지만 아직도이 문제를 해결할 수 없습니까? CreateWindowExW()
가 1400을 반환하는 이유는 무엇입니까? 라인 여기에 실제로 오류가되어있는 경우, 테스트하지 않았습니다왜 오류 1400 잘못된 창 핸들입니까?
DWORD err = GetLastError();
(44)
디버거를 통해 실행 해 보셨습니까? –
다시 할 수 있습니다. 'RegisterWindowClass'는 성공했지만'CreateWindowExW'는 실제로'NULL'을 리턴합니다. – zett42
그냥 버그 일 뿐이므로 _windowHandle 매개 변수를 사용해야합니다. 전역 변수는 나중에 CreateWindowEx가 반환 될 때까지 값을 가져 오지 않습니다. 현재 WM_NCCREATE의 처리가 엉망이되어 버렸습니다. –