65.9K
CodeProject 正在变化。 阅读更多。
Home

GDI+ 圆角矩形

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.80/5 (9投票s)

2002 年 2 月 16 日

2分钟阅读

viewsIcon

104269

downloadIcon

1562

为 GDI+ 提供 RoundedRect 函数

Sample Image - Screenshot.jpg

引言

虽然 GDI+ 是 GDI 的一个非常令人兴奋的扩展,但出于某种原因,并没有提供 RoundedRect 函数。虽然可以使用 GDI 函数与 GDI+ 配合使用,但这并不能让我们在圆角矩形中使用新的特性,例如纹理和 Alpha 透明度。幸运的是,GDI+ 提供了 GraphicsPath 类,我们可以使用它来创建任何形状,然后使用任何画笔进行绘制。我提供了一个函数,可以将其添加到任何项目中,并按如下所示使用它来绘制圆角矩形,并提供了一个演示应用程序,允许通过滑块设置圆角百分比。它比较粗糙(现在很晚了),但足以展示该函数的功能。该函数如下所示

GraphicsPath* MakeRoundRect(Point topLeft, Point bottomRight, INT percentageRounded)
{
          ASSERT (percentageRounded >= 1 && percentageRounded <= 100);

          INT left  = min(topLeft.X, bottomRight.X);
          INT right = max(topLeft.X, bottomRight.X);

          INT top    = min(topLeft.Y, bottomRight.Y);
          INT bottom = max(topLeft.Y, bottomRight.Y);

          INT offsetX = (right-left)*percentageRounded/100; 
          INT offsetY = (bottom-top)*percentageRounded/100;

          GraphicsPath pt;
          GraphicsPath * path = pt.Clone();

          path->AddArc(right-offsetX, top, offsetX, offsetY, 270, 90);

          path->AddArc(right-offsetX, bottom-offsetY, offsetX, offsetY, 0, 90);

          path->AddArc(left, bottom - offsetY, offsetX, offsetY, 90, 90);

          path->AddArc(left, top, offsetX, offsetY, 180, 90);

          path->AddLine(left + offsetX, top, right - offsetX/2, top);

          return path;
}

有趣的是,自从我第一次编写这段代码以来,调用 new 来创建 GraphicsPath 的能力已经被以某种方式移除了(尝试一下就知道了)。相反,我必须创建一个局部对象,并调用它的 'Clone' 方法。完全有可能我只是在这么晚的时候忽略了什么,但它似乎符合 GDI+ 中的其他类,你需要使用 GDI+ 方法通过指针创建新对象,而不是使用 new,我推测这是因为其他 .NET 语言不支持指针。

差不多就是这样了。这段代码有一个缺陷 - 函数创建对象,而调用者必须删除它,这是一种糟糕的设计。但是,GDI+ 很好地不允许我们以对象的形式返回路径,只能以指针的形式返回。我猜这与 GDI+ 以引用形式返回每个类有关,但我不太确定。为了好玩,我建议你尝试可以添加到此路径的其他内容 - Warp 方法看起来可能特别有趣。

© . All rights reserved.