0

でPanelに描画しWindows.Formsます。
このようにダブルバッファリングを使用すると、長方形の領域しか割り当てることができません。

そして、円や楕円を描くと、残りのスペースは黒い色で塗りつぶされます。
私が間違っていることや、この問題に対処する方法を理解するのを手伝ってください。
前もって感謝します!:)

this.DoubleBuffered = trueちらつきを防ごうとしました。無駄です。

Var pその上に何かを描くためのパネルです。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Dr(bool variant)
    {
        BufferedGraphicsContext currentContext;
        BufferedGraphics myBuffer;
        currentContext = BufferedGraphicsManager.Current;
        myBuffer = currentContext.Allocate(panel1.CreateGraphics(), panel1.DisplayRectangle);
        LinearGradientBrush lgb;
        if (variant) lgb = new LinearGradientBrush(new Point(0, 0), new Point(500, 500), Color.Red, Color.DarkRed);
        else lgb = new LinearGradientBrush(new Point(0, 0), new Point(500, 500), Color.DarkRed, Color.Red);
        myBuffer.Graphics.FillEllipse(lgb, 0, 0, 300, 300);
        myBuffer.Graphics.DrawString("Lorem ipsum", new Font("calibri", 40), Brushes.White, new PointF(50, 50));
        myBuffer.Render();
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Dr(true);
    }

    private void panel1_MouseEnter(object sender, EventArgs e)
    {
        Dr(false);
    }

    private void panel1_MouseLeave(object sender, EventArgs e)
    {
        Dr(true);
    }
}
4

1 に答える 1

2

ここで何をしようとしているのか、何を間違っている可能性があるのか​​、あるいは間違っている可能性があるのか​​についてコメントしなくても、基本的な問題はちらつきではありません。ダブルバッファリングは役に立ちません。バッファに追加したパネルのうち、描画しなかった部分を入力し忘れました。次のようなコードを追加します。

Brush solidBrush = new SolidBrush(p.BackColor);
myBuffer.Graphics.FillRectangle(solidBrush, 0, 0, p.Width, p.Height);

これにより、長方形全体がパネルの元の背面の色で塗りつぶされます。

ただし、これで当面の問題は解決しますが、それでも希望どおりに機能しない場合があります。フォーム上でウィンドウを移動してみてください。パネルが何らかの理由でそれ自体を塗り直さなければならないやいなや、あなたが描いたものは消えてしまいます。永続的な描画を含むパネルを作成するには、独自のコントロールを作成し、Panelから継承し、コントロールのOnPaintメソッドでカスタム描画を実装する必要があります。

C#Winformsコントロールは完全に透過的ではないため、透明な背景が必要な場合は、独自のコントロールを作成する必要があります。テクニックはここで説明されています:

https://web.archive.org/web/20141227200000/http://bobpowell.net/transcontrols.aspx

于 2011-01-14T13:05:50.267 に答える