EasyX 中使用 WM_CLOSE 关闭窗口的方法

EasyX 图形库中,关闭窗口通常涉及到 Windows 消息处理机制,特别是 WM_CLOSE 消息。WM_CLOSE 是 Windows 系统在用户尝试关闭窗口时发送的消息,例如点击窗口右上角的关闭按
钮。处理这个消息可以让你控制窗口关闭的行为,比如在关闭前提示用户保存数据,或者阻止窗口关闭。
WM_CLOSE 与其他关闭消息的区别
在 Windows 编程中,除了 WM_CLOSE,还有 WM_DESTROY 和 WM_QUIT 消息,它们都与窗口关闭有关,但有着不同的用途和触发时机:
WM_CLOSE:当用户尝试关闭窗口时发送,例如点击关闭按钮。你可以在这个消息的处理中添加确认对话框,或者执行其他关闭前的操作。
WM_DESTROY:当窗口被销毁时发送,通常在 WM_CLOSE 消息处理后,调用 DestroyWindow 函数时触发。在这个消息的处理中,你可以释放窗口相关的资源。
WM_QUIT:当应用程序需要退出时发送,通常在 WM_DESTROY 消息处理后,调用 PostQuitMessage 函数时触发。这个消息会导致消息循环结束,程序退出。
这些消息的处理顺序通常是 WM_CLOSE -> WM_DESTROY -> WM_QUIT

#include <easyx.h>
#include <stdio.h>

WNDPROC g_OriginWndProc = NULL;

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if (uMsg == WM_CLOSE) {
       //退出前操作
        DestroyWindow(hwnd);    //销毁窗口
    }
    else if (uMsg == WM_DESTROY) {
        PostQuitMessage(0);     //发送退出消息
    }
    else {
        LRESULT result = CallWindowProc((WNDPROC)g_OriginWndProc, hwnd, uMsg, wParam, lParam);
        return result;
    }
}

int main() {
    HWND hwnd = initgraph(600, 600);
    g_OriginWndProc = (WNDPROC)GetWindowLongPtr(hwnd, GWLP_WNDPROC);
    SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)WindowProc);
    ExMessage msg;
    while (1)
    {
        if (peekmessage(&msg, -1, true))
        {
            if (msg.message == WM_KEYDOWN && msg.vkcode == VK_ESCAPE)
            {
                //退出前操作
            }
        }
    }
    closegraph();
    return 0;
}
posted @ 2026-01-03 07:25  让泪化作相思雨  阅读(16)  评论(0)    收藏  举报