平滑圆角窗角

Posted

技术标签:

【中文标题】平滑圆角窗角【英文标题】:Smooth out rounded window corners 【发布时间】:2010-12-13 03:28:54 【问题描述】:

我使用 Windows API 调用 CreateRoundRgn 和 SetWindowRgn 创建了一个带有圆角边缘的窗口,但是圆角不如使用 GDI+ 绘制的圆角矩形那么平滑。有没有办法把窗角弄平?

procedure TPBSDashboardPanel.DefineWindowRegion;
var
  WindowRegion: HRGN;
begin
  if Assigned(Parent) then
  begin
    WindowRegion := CreateRoundRectRgn(0, 0, Width, Height, 20, 20);

    SetWindowRgn(Handle, WindowRegion, True);
  end;
end;

【问题讨论】:

【参考方案1】:

如果您想绘制主题矩形,请查看this link. 要渲染(半)透明位图,(我猜)你的目标是什么,请查看this function. 要使用这两个功能,请告诉我或使用 Google 启发您自己。

【讨论】:

【参考方案2】:

除了允许 Windows 进行命中测试的稍大的圆形区域之外,还可以使用具有 Alpha 透明度的位图来模拟抗锯齿。

这里的问题是 Win32 GDI 使用区域进行命中测试,因此在绘制区域中的每个点时都有整数逻辑单元坐标,因此在命中测试时可以知道它是在区域外还是在区域内。

上帝保佑

PS:AFAIK 无法定义窗口使用的实际区域,这将使窗口边框呈现抗锯齿,Win32 仅支持锯齿窗口。 Windows 7 中的 WDM 模糊了边界,但我认为这是阴影,而不是绘制模糊的实际区域。

【讨论】:

【参考方案3】:

我不是这方面的专家,但我知道 GDI+ 支持抗锯齿,而 GDI 不支持。没有抗锯齿,圆角看起来不平滑。

【讨论】:

以上是关于平滑圆角窗角的主要内容,如果未能解决你的问题,请参考以下文章

RoundRect 的圆角边缘不平滑

圆角视图不平滑

神奇的滤镜!巧妙实现内凹的平滑圆角

平滑圆角 UIView 角,仅底部

如何在 Qt 中的弹出窗口小部件上创建平滑的圆角

Android:如下关于绘制圆角矩形边框问题,怎么解决?