WinAPI设置窗口样式时部分宏导致窗口不显示,如何禁用窗口大小调整
问题修复方案
问题根因
你遇到的窗口无法显示问题核心是参数使用场景混淆:
WNDCLASSEXW结构体的style字段属于窗口类样式,仅接受CS_开头的宏定义(比如CS_HREDRAW、CS_VREDRAW),你将WS_开头的窗口样式写入该字段属于参数传值错误,直接导致窗口类注册异常,窗口无法正常创建。WS_CAPTION、WS_SYSMENU这类WS_开头的宏属于窗口实例样式,应该传入CreateWindowExW函数的第4个参数,而非窗口类的style字段。
修复步骤
步骤1:修正窗口类注册代码
将wcex.style改为合法的类样式,常规场景使用如下配置即可:
ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); // 替换为合法的窗口类样式:水平/垂直大小变化时重绘窗口 wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT1)); wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT1); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&wcex); }
步骤2:修正窗口创建代码,实现禁止调整大小效果
禁止窗口调整大小的核心是去掉窗口样式中的WS_THICKFRAME(可拖拽调整的厚边框)属性,同时将窗口类参数改为你自己注册的szWindowClass,不要用系统自带的STATIC静态控件类:
HWND hWnd = CreateWindowExW( 0, szWindowClass, // 改为你自己注册的窗口类名 L"Learn to Program Windows", // 窗口样式:包含标题栏、系统菜单、最小化/最大化按钮,没有可调整边框,无法拖拽改大小 WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, 500, 300, // 可以固定宽高避免CW_USEDEFAULT的不确定大小 NULL, NULL, hInstance, NULL ); // 窗口创建完成后需要调用ShowWindow显示 ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd);
补充说明
如果需要对已创建的窗口动态修改样式,可以使用SetWindowLongPtrW函数修改GWL_STYLE属性,修改完成后调用SetWindowPos触发窗口边框刷新即可生效。
内容的提问来源于stack exchange,提问作者Cahir7
相关产品推荐
相关产品推荐

