【问题标题】:Windows Forms Custom Control not painting correctlyWindows 窗体自定义控件未正确绘制
【发布时间】:2013-05-16 02:10:04
【问题描述】:

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

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

代码托管在 GitHub 上:Here

【问题讨论】:

    标签: c# winforms transparency


    【解决方案1】:

    “我遇到的问题是这个。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);
        }
    

    【讨论】:

    • 你展示的图片是我想要实现的。当 RoundRectangle 大小发生变化时,问题似乎并不存在......但我会尝试任何事情:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    相关资源
    最近更新 更多