我希望在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);
它的工作原理和背景渐变,但复选框在渐变下消失,无法访问。现在,我该怎么办?请尽快帮助我
答案 0 :(得分:1)
修改强>
好的我知道出了什么问题。该复选框自动绘制一个底层背景,覆盖以前绘制的任何内容。
在这种情况下,您必须自己绘制复选框的外观(即检查状态等)。
您应该覆盖用于绘制背景的 OnPaintBackground
函数,而不是OnPaint
。
另一个选择是在之后调用base.OnPaint(e)
来绘制背景。
复选框在渐变下不会“消失”,您仍然可以访问它。你刚刚绘制了“背景”以上“前景”。
基本控件在base.OnPaint(e)
函数中绘制复选框的外观。如果你在调用之后绘制任何东西,那些东西将被绘制为绘制复选框前面的“叠加层”,这就是为什么你看不到复选框的外观。
如果您要自己绘制文本,则不希望出现内部绘制的复选框文本。在这种情况下,您还需要自己绘制复选框的外观。
正如我已经提到的,如果您只想绘制自定义背景,请改用 OnPaintBackground
。