创build响应式Windows winapi c ++

我正在学习使用winapi创build一个GUI,但是我遇到了一个问题。 我可以创build一个这样的窗口

#include "stdafx.h" #include <windows.h> int main() { HWND hwnd = CreateWindow(L"STATIC",NULL,WS_VISIBLE|WS_SYSMENU|WS_CAPTION,0,0,600,600,NULL,NULL,NULL,NULL); UpdateWindow(hwnd); MSG msg; while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } _gettch(); } 

但是当closuresbutton被点击时,窗口不会closures,窗口也不能被拖动或移动。 我想知道如何启用窗口的这些function。

静态窗口不是正常的窗口,你应该尝试查找如何使用RegisterWindowEx注册和处理自己的类,然后使用相同的类名创建一个窗口。 你必须有自己的窗口过程来处理消息。 所有由系统注册的窗口类都运行它们自己的默认窗口过程,据我所知,它们都不处理WM_CLOSE(即关闭按钮),这就是为什么你不能关闭它。

对于你的主窗口总是使用类似WS_OVERLAPPEDWINDOW的东西,所以它会清楚,如果没关系,从而消除你不需要的标志。

你如何设置:

 WNDCLASSEX wndcls; HWND hMainWnd; // Register your own window class ZeroMemory(&wndcls,sizeof(WNDCLASSEX)); wndcls.cbSize=sizeof(WNDCLASSEX); wndcls.style=CS_VREDRAW+CS_HREDRAW; wndcls.lpfnWndProc=&appWndFunc; wndcls.hInstance=hInstance; wndcls.hIcon=hMainIcon; // or just LoadIcon(hInstance,MAKEINTRESOURCE(IDI_MAIN_ICON)) wndcls.hIconSm=hMainIcon; wndcls.hCursor=LoadCursor((HINSTANCE)NULL,IDC_ARROW); wndcls.hbrBackground=(HBRUSH)COLOR_APPWORKSPACE; wndcls.lpszClassName="myWndClass"; if (RegisterClassEx(&wndcls)==0) { // failed to register class name return false; } // Create window with your own class hMainWnd=CreateWindowEx(0,\ "myWndClass","widnow title",\ WS_OVERLAPPEDWINDOW|WS_VISIBLE,\ 0,\ 0,\ 250,\ 250,\ hMainWnd,NULL,hInstance,NULL); if (hMainWnd==(HWND)NULL) { // failed to create main window return false; } 

那么你的主循环:

 bool bAppMainLoop=false while(!bAppMainLoop) { WaitMessage(); while(PeekMessage(&emsg,NULL,0,0,PM_NOREMOVE)) { if(GetMessage(&emsg,NULL,0,0)==0) { bAppMainLoop=true; break; } TranslateMessage(&emsg); DispatchMessage(&emsg); } } 

这是比平常更多的设置,所以让我解释一下,为了不烧坏CPU,你用WaitMessage等待消息,它会阻塞,直到发生什么事情,如移动窗口,点击,绘画等PeekMessage将返回true如果有消息,所以在while循环中调用它将确保消耗消息队列,如果消息返回0,则GetMessage将获得消息,这意味着您的应用程序调用PostQuitMessage(0),因此在消息中找到了WM_QUIT这意味着是时候从消息循环中跳出来了。 其余的翻译和调度做它的名字说。

最后你需要你自己的窗口过程:

 LRESULT CALLBACK appWndFunc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { if (uMsg==WM_CLOSE) { PostQuitMessage(0); return 0; } return DefWindowProc(hWnd,uMsg,wParam,lParam); } 

DefWindowProc是必不可少的,可以处理来自系统的所有常见信息,因此您不需要在这里处理这些信息。 您只需响应在要关闭窗口时发送的WM_CLOSE消息,并将退出的消息发送到您将捕获并退出的消息循环中。

附加信息:不需要发布你的东西,因为Windows为你做了这样的事情,所以下次你启动你的程序时它不会被锁定,但是至少在你的主循环之后取消注册你的窗口类是一个很好的习惯。

顺便说一句,这是错误的主要功能: WinMain这是正确的。 另外为了避免更多的错误,请确保编译一个Windows GUI应用程序。