1

我想在 C# 中有一个自定义 CheckBox,上面有一个渐变背景。我覆盖了 OnPaint(PaintEventArgs e) 如下:

Graphics g = e.Graphics;

        base.OnPaint(e);
        //// Fill the background
        //SetControlSizes();

        // Paint the outer rounded rectangle
        g.SmoothingMode = SmoothingMode.AntiAlias;
        using (GraphicsPath outerPath = GeneralUtilities.RoundedRectangle(mLabelRect, 1, 0))
        {
            using (LinearGradientBrush outerBrush = new LinearGradientBrush(mLabelRect,
                   mGradientTop, mGradientBottom, LinearGradientMode.Vertical))
            {
                g.FillPath(outerBrush, outerPath);
            }
            using (Pen outlinePen = new Pen(mGradientTop, mRectOutlineWidth))
            {
                outlinePen.Alignment = PenAlignment.Inset;
                g.DrawPath(outlinePen, outerPath);
            }
        }

        //// Paint the gel highlight
        using (GraphicsPath innerPath = GeneralUtilities.RoundedRectangle(mHighlightRect, mRectCornerRadius, mHighlightRectOffset))
        {
            using (LinearGradientBrush innerBrush = new LinearGradientBrush(mHighlightRect,
                   Color.FromArgb(mHighlightAlphaTop, Color.White),
                   Color.FromArgb(mHighlightAlphaBottom, Color.White), LinearGradientMode.Vertical))
            {
                g.FillPath(innerBrush, innerPath);
            }
        }
        // Paint the text
        TextRenderer.DrawText(g, Text, Font, mLabelRect, Color.White, Color.Transparent,
        TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.EndEllipsis);

它可以工作并为背景制作渐变,但复选框在渐变下消失并且无法访问。现在,我该怎么办???请尽快帮助我

4

1 回答 1

1

编辑:

好的,我知道出了什么问题。该复选框会自动绘制一个覆盖之前绘制的任何内容的底层背景。

在这种情况下,您必须自己绘制复选框的外观(即选中状态等)。


您应该重写OnPaintBackground用于绘制背景的函数,而不是OnPaint.

另一种选择是在绘制背景base.OnPaint(e) 调用。

该复选框不会在渐变下“消失”,您仍然可以访问它。您刚刚在“前景”上方绘制了“背景”。

base.OnPaint(e)基本控件在函数中绘制复选框的外观。如果你在调用它之后绘制任何东西,这些东西将在绘制的复选框前面绘制为“覆盖”,这就是你看不到复选框外观的原因。


如果您还打算自己绘制文本,则不希望出现内部绘制的复选框文本。在这种情况下,您还需要自己绘制复选框的外观。

正如我已经提到的,如果您只想绘制自定义背景,请OnPaintBackground改用。

于 2012-07-31T09:37:12.400 回答