Windows窗体自定义控件无法正确绘制

时间:2013-05-16 02:10:04

标签: c# winforms transparency

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

对于我的RoundMovableSwitch类,我使用2个RoundRectanglePaths将Control拆分为一半。左边是绿色,右边是粉红色(想想它现在我可以使用一个水平的LinearGradient画笔......哎呀哦)然后我在对面画出字符串On和Off。对于该控件,我添加了一个RoundRectangle。当用户单击RoundRectangle或MoveableSwitch时,Control会一次向左或向右移动RoundRectangle 1个像素。运动很棒。我遇到的问题是这个。 RoundRectangle的外边缘是正确的透明颜色。内边缘是错误的颜色。请参见下图中的RoundMovingSwitch 1和2。一旦我使代码正常工作,我将返回并重新组织代码。

Example of problem

代码托管在GitHub上:Here

1 个答案:

答案 0 :(得分:2)

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

不确定我理解这个问题......

您是否想要摆脱圆边之外的蓝色角落?

如果是这样,那么在RoundRectangle中尝试: enter image description here

    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);
    }