我刚刚完成教程,就用C++和WINAPI制作了这个GUI应用程序,但无论我尝试什么都无法工作。。。
这是代码:
#include <windows.h>
LRESULT CALLBACK WinProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) {
WNDCLASS window;
window.cbClsExtra = NULL;
window.cbWndExtra = NULL;
window.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
window.hCursor = LoadCursor (hInst, IDC_ARROW);
window.hIcon = NULL;
window.hInstance = hInst;
window.lpfnWndProc = WinProc;
window.lpszClassName = "WINDOW";
window.lpszMenuName = NULL;
window.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&window);
HWND hwnd = CreateWindow("WINDOW", "Win32 Window Application", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 50, 50, 200, 200, NULL, NULL, hInst, NULL);
ShowWindow(hwnd, SW_SHOW);
MSG message;
while (GetMessage(&message, hwnd, 0, 0)){
TranslateMessage(&message);
DispatchMessage(&message);
}
}
LRESULT CALLBACK WinProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam){
switch(message){
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
break;
}
}
}
我试图将几乎所有内容都更改为不同的值,并添加头文件,但这从未奏效。
您需要对源代码进行以下更改:
-
指示窗口更新其内容:
ShowWindow(hwnd, SW_SHOW); UpdateWindow(hwnd);
-
初始化
MSG
结构,不过滤消息,适当使用GetMessage
:的返回值MSG message = {0}; while (GetMessage(&message, NULL, 0, 0) > 0){ TranslateMessage(&message); DispatchMessage(&message); }
使用
hwnd
参数筛选消息将只从该窗口的消息队列中检索消息。WM_QUIT
将丢失,并且由于您没有检查> 0
的GetMessage
的返回值,您的消息循环将无限期地继续旋转。 -
将所有未处理的消息传递给
DefWindowProc
。不这样做甚至会使窗户无法离开地面。正如Hans-Passant在上面回应的那样,WM_NCCREATE
没有被处理,导致对CreateWindow
的调用失败(检查NULL
的返回值)。此外,不要忽略编译器警告(因为您发布的代码已生成):LRESULT CALLBACK WinProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam){ switch(message){ case WM_DESTROY: PostQuitMessage(0); return 0; default: break; } return DefWindowProc(window, message, wParam, lParam); }
-
始终检查错误。任何可能失败的API调用(请参阅文档)都应该检查其返回值。特别需要检查对
RegisterClass
和CreateWindow
的调用。后者会给你线索,表明出了问题:if(RegisterClass(&window) == 0) return -1; // ... if(hwnd == NULL) return -1;
在窗口过程的末尾添加以下内容:
return DefWindowProc(window, message, wParam, lParam);
现在,除了WM_DESTROY之外,您没有处理任何消息。并且不从过程中返回任何内容,这意味着未定义的行为。