C++ Win32窗口-无关闭消息
我目前正在制作一个小的win32窗口包装器类,但我有一些问题。 如果我按下窗口的关闭(X)按钮,窗口将立即关闭,而不发送退出或销毁消息,因此,例如,我无法阻止窗口关闭或在关闭窗口之前保存某些内容。 第二个问题是, 如果我使用这个小代码来使用窗口,那么计算机cpu就会被大量使用。 但它只是一扇小窗户。 如何更改/修复此问题C++ Win32窗口-无关闭消息,c++,winapi,C++,Winapi,我目前正在制作一个小的win32窗口包装器类,但我有一些问题。 如果我按下窗口的关闭(X)按钮,窗口将立即关闭,而不发送退出或销毁消息,因此,例如,我无法阻止窗口关闭或在关闭窗口之前保存某些内容。 第二个问题是, 如果我使用这个小代码来使用窗口,那么计算机cpu就会被大量使用。 但它只是一扇小窗户。 如何更改/修复此问题 int main() { glwCreate(); while(true/*Later here comes a method that checks, wet
int main()
{
glwCreate();
while(true/*Later here comes a method that checks, wether window close is requested*/)
{
glwUpdate();
}
glwDestroy();
return 0;
}
-
#包括“glw.h”
#包括
#包括
HINSTANCE实例句柄;
WNDCLASSEX窗口类;
窗柄;
LRESULT回调WindowMessageHandler(HWND HWND、UINT uMsg、WPARAM WPARAM、LPARAM LPARAM)
{
std::cout如果您为WM_CLOSE
添加处理,您可以控制窗口是否关闭。如果不为该消息提供自己的处理,您将从DefWindowProc
获得默认值,即销毁您的窗口。您的问题现在有点不清楚。请突出显示相关代码。为什么看起来会这样每个尝试使用简单窗口处理程序的人都会使用PeekMessage而不是GetMessage?他们没有注意到整个内核都被白白使用了吗?如果不调用PostQuitMessage(),就不会得到WM_QUIT。它不应该由窗口过程处理,窗口不再存在。需要在游戏循环中完成。
#include "glw.h"
#include <windows.h>
#include <iostream>
HINSTANCE instanceHandle;
WNDCLASSEX windowClass;
HWND windowHandle;
LRESULT CALLBACK WindowMessageHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
std::cout<<uMsg<<'\n';
switch(uMsg)
{
case WM_QUIT:
{
std::cout<<"QUIT\n";
return 0;
}
case WM_DESTROY:
{
std::cout<<"DESTROY\n";
return 0;
}
}
return (DefWindowProc(hWnd, uMsg, wParam, lParam));
}
void glwCreate()
{
instanceHandle = GetModuleHandle(0);
windowClass.cbSize = sizeof(WNDCLASSEX);
windowClass.style = CS_HREDRAW | CS_VREDRAW;
windowClass.lpfnWndProc = WindowMessageHandler;
windowClass.cbClsExtra = 0;
windowClass.cbWndExtra = 0;
windowClass.hInstance = instanceHandle;
windowClass.hCursor = LoadCursor(0,IDC_ARROW);
windowClass.hIcon = LoadIcon(0, IDI_APPLICATION);
windowClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
windowClass.lpszClassName = "atomus_window_class";
windowClass.lpszMenuName = "menu_name";
windowClass.hIconSm = LoadIcon(0, IDI_APPLICATION);
RegisterClassEx(&windowClass);
windowHandle = CreateWindowEx( 0,
"atomus_window_class",
"atomus title",
WS_OVERLAPPEDWINDOW,
0,
0,
CW_USEDEFAULT,
CW_USEDEFAULT,
0,
0,
instanceHandle,
0);
ShowWindow(windowHandle, SW_SHOW);
}
void glwDestroy()
{
DestroyWindow(windowHandle);
windowHandle = 0;
UnregisterClass(windowClass.lpszClassName, instanceHandle);
}
void glwUpdate()
{
MSG message;
while (PeekMessage (&message, 0, 0, 0, PM_REMOVE) > 0) //Or use an if statement
{
TranslateMessage (&message);
DispatchMessage (&message);
}
}