0

所以我正在尝试制作一个漂亮的圆形开关,当点击它时它会向左或向右滑动以基本上打开或关闭某些东西(它可以用于其他事情)。我有一个矩形版本的工作有点好(我想为它做一些调整)但我遇到的问题是使用圆角矩形。我做了一些课程来帮助我自己。我有一个叫 RoundRectanglePath。使用 Create 方法,我给它一个 Rectangle(或 x、y、w、h)和角的半径,它返回一个封闭的 GraphicsPath,然后我可以使用 Graphics.[Fill|Draw]Path。然后我有一个 RoundRectangle 类,它只是一个与标签非常相似的控件。我发现如果我覆盖 OnPaintBackground 并且不将事件发送到基础,而是绘制一个与其父级颜色相同的矩形。BackColor 比我得到的控制是真的圆的错觉。(作为相关的旁注,我允许透明)

对于我的 RoundMovableSwitch 类,我使用 2 个 RoundRectanglePaths 将控件分成两半。左边是绿色,右边是粉红色(现在想起来,我可以只使用水平线性渐变画笔......哦哦哦哦)然后我在相对两侧绘制字符串 On 和 Off。在该控件中,我添加了一个 RoundRectangle。当用户单击 RoundRectangle 或 MoveableSwitch 时,控件会一次将 RoundRectangle 向左或向右移动 1 个像素。运动效果很好。我遇到的问题是这个。RoundRectangle 的外边缘是正确的透明颜色。内侧边缘颜色错误。请参见下图中的 RoundMovingSwitch 1 和 2。一旦我让代码正常工作,我将返回并重新组织代码。

问题示例

代码托管在 GitHub 上:这里

4

1 回答 1

2

“我遇到的问题是这个。RoundRectangle 的外边缘是正确的透明颜色。内边缘是错误的颜色。”

不确定我是否理解问题...

您是否试图摆脱圆边之外的蓝色角落?

如果是这样,那么在 RoundRectangle 中试试这个: 在此处输入图像描述

    public RoundRectangle()
    {
        this.ResizeRedraw = true;
        this.VisibleChanged += new EventHandler(RoundRectangle_VisibleChanged);
    }

    private bool RegionSet = false;
    void RoundRectangle_VisibleChanged(object sender, EventArgs e)
    {
        if (this.Visible && !RegionSet)
        {
            RegionSet = true;
            var r = new RectangleEx(this.ClientRectangle);
            var path = RoundRectanglePath.Create(r.ToRectangle(), this.Radius, this.Corners);
            this.Region = new Region(path);
        }
    }

*如果控件的大小发生变化,则应将 Region() 属性重置为新大小。

编辑:要使其在大小更改时重置区域:

    protected override void OnSizeChanged(EventArgs e)
    {
        base.OnSizeChanged(e);
        var r = new RectangleEx(this.ClientRectangle);
        var path = RoundRectanglePath.Create(r.ToRectangle(), this.Radius, this.Corners);
        this.Region = new Region(path);
    }
于 2013-05-16T05:13:44.723 回答