2

今日、私はパネルを描くときに、パネルが点滅する問題を解決しようとしています。

私が読んだたくさんのスレッド、これらのように:

そこで、doubleBufferedを使用してPictureBox、MyPanelに描画しようとしましたが、読んだときに、毎回g.Clear()を使用できないことがわかりました。その後、doubleBuffered以外のパネルでも、点滅が消えました。

描画が完了したらグラフィックを解放する必要があることも読みました。だから私はどこでもusing(Graphics g = panel.CreateGraphics())を使用します。

だから私の質問は、ビットマップに何かを描いたときにだけグラフィックスを作成するのは素晴らしいアイデアですか?ビットマップとグラフィックス(すべてのコンポーネントではなく、このビットマップのみ)を作成する前は、毎回このビットマップでグラフィックスを使用できたためです。

これが私のコードです:

public void newSizeDrawing()
    {
        Size size = collector.getLetterSize(selectedName);
        Size drawingSize = new Size(size.Width * (pixelSizeArray[pixelSize] + 1),size.Height * (pixelSizeArray[pixelSize] + 1));
        bitmapDraw = new Bitmap(drawingSize.Width, drawingSize.Height);
        int width = (this.MinimumSize.Width - panelDraw.MinimumSize.Width) + drawingSize.Width + 10;
        int height = (this.MinimumSize.Height - panelDraw.MinimumSize.Height) + drawingSize.Height + 10;
        this.Size = new Size(
            (width > this.MinimumSize.Width) ? width : this.MinimumSize.Width,
            (height > this.MinimumSize.Height) ? height : this.MinimumSize.Height);
        zeroDrawPosition = new Point((panelDraw.Size.Width - bitmapDraw.Width) / 2 - 1, (panelDraw.Size.Height - bitmapDraw.Height) / 2 - 1);
        using (Graphics g = panelDraw.CreateGraphics())
        {
            g.Clear(panelDraw.BackColor);
        }
        redrawDrawingLetter();
    }
public void redrawDrawingLetter()
    {
        bool[][] grid = collector.getArray(selectedName);
        using (Graphics graphicDraw = Graphics.FromImage(bitmapDraw))
        {
            graphicDraw.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed;
            graphicDraw.Clear(panelDraw.BackColor);
            int pxSize = pixelSizeArray[pixelSize];
            for (int y = 0; y < grid.Length; y++)
            {
                for (int x = 0; x < grid[y].Length; x++)
                {
                    graphicDraw.FillRectangle((grid[y][x] ? Brushes.Black : Brushes.White), x * (pxSize + 1), y * (pxSize + 1), pxSize, pxSize);
                }
            }
        }
        redrawDrawingPanel();
    }
private void redrawDrawingPanel()
    {
        using (Graphics g = panelDraw.CreateGraphics())
        {
            if (bitmapDraw != null)
                g.DrawImage(bitmapDraw, zeroDrawPosition);
        }
    }
private void panelDraw_Paint(object sender, PaintEventArgs e)
    {
        redrawDrawingPanel();
    }

誰も私にC#で最良の方法で描く方法を説明することはできません。だから私のコードは良くないかもしれませんが、それが私がそれを正しく行う方法を尋ねる理由です。

newSizeDrawingユーザーが+または-ボタンをクリックしたときにのみ、自分で呼び出されます。ピクセルがオンまたはオフの場合、ブール値の2次元配列があります。これは、マイクロチップとLEDディスプレイ(多くの場合、文字の高さ8px)の文字を描画するためのプログラムです。

マウスがある「ピクセル」から別の「ピクセル」に移動したかどうかをチェックするメソッドを作成しました。「ピクセル」は10x10ピクセルから30x30ピクセルになる可能性があるため、mouseMoveイベントを呼び出すたびに再描画することはありません。

4

1 に答える 1

1
private void panelDraw_Paint(object sender, PaintEventArgs e)
{
    redrawDrawingPanel();
}

これは根本的に間違っています。Paintイベントはe.Graphicsを渡して、ペイントしたいものを何でも描画できるようにします。ダブルバッファリングをオンにすると、e.Graphicsはビットマップを参照し、BackColorで初期化されます。次に、CreateGraphics()から取得した別のGraphicsオブジェクトを使用して描画に進みます。それは画面に直接描画します。

非常に目立つ場合に見られるちらつき効果。ほんの一瞬、他のグラフィックスコンテキストが何を描くかがわかります。次に、panelDraw_Paint()メソッドが返され、Winformsはダブルバッファリングされたビットマップを描画します。何も入っていないので、描いたものをすぐに消してしまいます。

redrawDrawingPanel()メソッドを変更し、Graphics型の引数を指定します。通話でe.Graphicsを渡します。そして、そのGraphicsオブジェクトのみを使用し、CreateGraphics()へのすべての呼び出しを削除します。

于 2012-07-10T00:14:53.170 に答える