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); } }
关键修改说明
- 窗口样式参数修正:
CreateWindowW的第三个参数是普通窗口样式,WS_OVERLAPPEDWINDOW包含标题栏、最大化/最小化/关闭按钮等标准窗口元素;若需扩展样式(如WS_EX_CLIENTEDGE),需传入第10个dwExStyle参数(本例无需额外扩展样式,传0即可)。 - 窗口过程返回值修正:
WM_DESTROY消息处理后必须返回0,确保窗口过程的每个分支都有明确返回值。 - 统一字符集:全部使用宽字符版本API(
W后缀),避免ANSI与宽字符函数混用导致的潜在问题。
内容的提问来源于stack exchange,提问作者Dejon eltahan
相关产品推荐
相关产品推荐

