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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:45:01