使用DwmSetWindowAttribute创建Win32圆角窗口失败的原因咨询
Win32经典应用调用DwmSetWindowAttribute设置圆角窗口未生效的原因及解决办法
核心原因分析
- 函数名拼写错误:代码中调用的
DwmSetWindowAttribite存在拼写错误,正确函数名为DwmSetWindowAttribute(缺少字母u)。拼写错误会导致函数调用失败,甚至编译报错,自然无法生效。 - Windows版本不兼容:
DWMWA_WINDOW_CORNER_PREFERENCE属性及DWMWCP_ROUND枚举值是Windows 11及以上系统才新增的API,Windows 10原生不支持该属性,因此在Win10系统下调用此API毫无作用。
对应解决办法
针对Windows 11系统(修正代码)
先修正函数拼写错误,同时确保系统版本符合要求,修正后的代码如下:
MainWindow = CreateWindow(wxex.lpszClassName, WindowTitle, WS_OVERLAPPEDWINDOW, 0, 0, nWidth, nHeight, NULL, NULL, hin, NULL); // 补充原代码遗漏的逗号 DWM_WINDOW_CORNER_PREFERENCE pef = DWMWCP_ROUND; // 修正函数名拼写,并检查调用结果 HRESULT hr = DwmSetWindowAttribute(MainWindow, DWMWA_WINDOW_CORNER_PREFERENCE, &pef, sizeof(pef)); if (FAILED(hr)) { // 可添加错误处理逻辑,比如输出错误码 } ShowWindow(MainWindow, SW_SHOW);
针对Windows 10系统(替代方案)
Win10不支持上述DWM属性,可通过SetWindowRgn自定义窗口区域实现圆角效果,示例代码:
// 窗口创建完成后调用 int cornerRadius = 20; // 自定义圆角半径 HRGN hRgn = CreateRoundRectRgn(0, 0, nWidth, nHeight, cornerRadius, cornerRadius); if (hRgn != NULL) { SetWindowRgn(MainWindow, hRgn, TRUE); DeleteObject(hRgn); // 使用完毕后释放GDI资源 } ShowWindow(MainWindow, SW_SHOW);
内容的提问来源于stack exchange,提问作者DGAF
相关产品推荐
相关产品推荐

