You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows API编程:创建的窗口未显示关闭按钮问题求助

窗口无法显示关闭按钮的问题修复

问题根源

你的代码存在三个关键问题导致关闭按钮不显示:

  • 错误地将扩展窗口样式WS_EX_OVERLAPPEDWINDOW传入CreateWindowW的窗口样式参数(第三个参数),该参数应使用普通窗口样式WS_OVERLAPPEDWINDOW,扩展样式需要放在第10个参数位置。
  • WindowProcedure中处理WM_DESTROY消息后未返回值,会触发未定义行为。
  • 混用ANSI版本GetMessageA与宽字符API(W后缀函数),可能引发字符集不匹配问题。

修正后的代码

#include <windows.h>

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int ncmdshow)
{
    WNDCLASSW wc = {0};

    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hInstance = hInst;
    wc.lpszClassName = L"myWindowClass";
    wc.lpfnWndProc = WindowProcedure;

    if (!RegisterClassW(&wc))
        return -1;

    // 修正:将扩展样式放到第10个参数,窗口样式使用WS_OVERLAPPEDWINDOW
    CreateWindowW(
        L"myWindowClass",
        L"HI THIS IS A TEST",
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        100, 100, 500, 500,
        NULL, NULL, NULL, NULL
    );

    MSG msg = {NULL};
    // 修正:使用宽字符版本GetMessageW
    while (GetMessageW(&msg, NULL, NULL, NULL))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
    switch (msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0; // 修正:添加返回值
    default:
        return DefWindowProcW(hWnd, msg, wp, lp);
    }
}

关键修改说明

  1. 窗口样式参数修正:CreateWindowW的第三个参数是普通窗口样式,WS_OVERLAPPEDWINDOW包含标题栏、最大化/最小化/关闭按钮等标准窗口元素;若需扩展样式(如WS_EX_CLIENTEDGE),需传入第10个dwExStyle参数(本例无需额外扩展样式,传0即可)。
  2. 窗口过程返回值修正:WM_DESTROY消息处理后必须返回0,确保窗口过程的每个分支都有明确返回值。
  3. 统一字符集:全部使用宽字符版本API(W后缀),避免ANSI与宽字符函数混用导致的潜在问题。

内容的提问来源于stack exchange,提问作者Dejon eltahan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:09:50