C++ Win32窗口-无关闭消息

C++ Win32窗口-无关闭消息,c++,winapi,C++,Winapi,我目前正在制作一个小的win32窗口包装器类,但我有一些问题。 如果我按下窗口的关闭(X)按钮,窗口将立即关闭,而不发送退出或销毁消息,因此,例如,我无法阻止窗口关闭或在关闭窗口之前保存某些内容。 第二个问题是, 如果我使用这个小代码来使用窗口,那么计算机cpu就会被大量使用。 但它只是一扇小窗户。 如何更改/修复此问题 int main() { glwCreate(); while(true/*Later here comes a method that checks, wet

我目前正在制作一个小的win32窗口包装器类,但我有一些问题。 如果我按下窗口的关闭(X)按钮,窗口将立即关闭,而不发送退出或销毁消息,因此,例如,我无法阻止窗口关闭或在关闭窗口之前保存某些内容。 第二个问题是, 如果我使用这个小代码来使用窗口,那么计算机cpu就会被大量使用。 但它只是一扇小窗户。 如何更改/修复此问题

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);
    }
}