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 に答える