C#中的自定义CheckBox

时间:2012-07-31 09:35:35

标签: c# winforms custom-controls custom-component

我希望在C#中有一个自定义CheckBox,它上面有一个渐变的backgronud。我覆盖了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);

它的工作原理和背景渐变,但复选框在渐变下消失,无法访问。现在,我该怎么办?请尽快帮助我

1 个答案:

答案 0 :(得分:1)

修改

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

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


您应该覆盖用于绘制背景的OnPaintBackground函数,而不是OnPaint

另一个选择是在之后调用base.OnPaint(e) 来绘制背景。

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

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


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

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