如何在Delphi Alexandria的FireMonkey Windows应用中实现Win11风格控件圆角
解决方案总览
方案1:原生FireMonkey属性实现(无需调用Windows API,跨平台兼容)
- 所有FireMonkey可视控件都自带
Corners属性组,直接设置即可实现圆角:- 调整
CornerRadius属性为需要的圆角数值即可,Win11官方推荐的控件圆角值为8px,窗体圆角为12px - 可通过
Corners属性单独指定需要启用圆角的角(支持全部角/左上/右上/左下/右下独立配置) - 配套调整
Stroke.Color为Win11风格的浅灰色边框,Fill.Color匹配系统主题色即可还原Win11设计风格
- 调整
- 如果需要贴合Win11的云母/亚克力特效,可配合
TAlphaEffect控件调整透明度,叠加背景模糊效果实现
方案2:调用Windows API实现(仅Windows平台生效,完美匹配系统风格)
FireMonkey在Windows平台下编译时,主窗体以及每个放置了
TWindowHandle组件的容器都可以获取合法的HWND句柄,并非完全不支持句柄操作
- 第一步:获取窗体/容器HWND,引用
FMX.Platform.Win单元后调用以下代码即可:
var TargetHWND: HWND; begin // 获取主窗体HWND TargetHWND := WindowHandleToPlatform(Form.Handle).Wnd; // 如果需要获取控件对应的HWND,先把控件放入TWindowHandle容器,再获取该容器的句柄即可 end;
- 第二步:调用Win11官方圆角API设置效果,配合编译指令仅Windows平台生效即可:
{$IFDEF MSWINDOWS} uses Winapi.DwmApi; procedure SetWin11RoundedStyle(ATargetHandle: HWND); var RoundedAttr: DWORD; begin RoundedAttr := DWMWCP_ROUND; // 调用系统默认圆角规则,自动适配系统风格 DwmSetWindowAttribute(ATargetHandle, DWMWA_WINDOW_CORNER_PREFERENCE, @RoundedAttr, sizeof(RoundedAttr)); end; {$ENDIF}
适配注意事项
- 当系统版本低于Win11时,调用
DwmSetWindowAttribute设置圆角的代码会自动失效,无需额外做版本判断,不会触发运行错误 - 原生属性方案的显示效果在所有Windows版本上完全统一,不会随系统版本变化
内容的提问来源于stack exchange,提问作者Gordon Turner
相关产品推荐
相关产品推荐

