我已经使用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;
}
}
}
我试图将几乎所有内容更改为不同的值并添加头文件,但这种方法从来没有用过。
答案 0 :(得分:4)
您需要对源代码应用以下更改:
指示窗口更新其内容:
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
会丢失,因为您没有检查GetMessage
> 0
的返回值,您的消息循环会无限期地继续旋转。
将您未处理的所有邮件传递给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;
答案 1 :(得分:0)
在窗口过程结束时添加以下内容:
return DefWindowProc(window, message, wParam, lParam);
现在你不处理除WM_DESTROY之外的任何消息。并且也没有从过程中返回任何内容,这意味着未定义的行为。