2012-07-31 100 views
1

我想在C#中有一个定制的复选框,它有一个渐变背景。我overrided的OnPaint(PaintEventArgs的E)如下:C中的自定义复选框#

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

它的工作原理,并作出gradiant背景,但gradiant下复选框消失,也无法访问。现在,我该怎么办?请尽快帮我尽可能

回答

1

编辑:

OK,我知道什么是错的。该复选框会自动绘制一个覆盖以前绘制的任何东西的底层背景。

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


应覆盖OnPaintBackground功能绘制的,而不是OnPaint背景。

另一种选择是拨打base.OnPaint(e)你已经绘制了背景。

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

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


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

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

+0

谢谢艾尔文,你的解决方案没有来得方便 – Mohsen 2012-07-31 09:45:48

+0

我叫'base.OnPaint(e);'在我的方法的底部,但它不工作 – Mohsen 2012-07-31 10:01:18

+0

我使用OnPaintBackground而不是OnPaint,但它does not无效 – Mohsen 2012-07-31 10:08:20