3

私は現在、pictureBoxを使用しています。約2x2の正方形のサイズのグリッドを画像ボックスに描画するのに問題があります。さて、以下のコードは私に線を引いただけです。どうすればpictureBoxの上に完全なグリッドを描画できますか?

コード:

private Graphics g1;

    public Form1()
    {
        InitializeComponent();


        pictureBox1.Image = new Bitmap(500, 500);
        g1 = Graphics.FromImage(this.pictureBox1.Image);
        Pen gridPen = new Pen(Color.Black, 2);
        g1.DrawLine(gridPen, 0, 0, 100, 100);

    }

これは私が達成したいことです: ここに画像の説明を入力してください

4

2 に答える 2

9

私はこの質問を見つけました: Windowsフォームで効率的にグリッドを描画します

その要点は次のとおりです。

private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            int numOfCells = 200;
            int cellSize = 5;
            Pen p = new Pen(Color.Black);

            for (int y = 0; y < numOfCells; ++y)
            {
                g.DrawLine(p, 0, y * cellSize, numOfCells * cellSize, y * cellSize);
            }

            for (int x = 0; x < numOfCells; ++x)
            {
                g.DrawLine(p, x * cellSize, 0, x * cellSize, numOfCells * cellSize);
            }
        }

それに応じてカスタマイズ

于 2012-10-03T14:20:22.403 に答える
1

もちろん、MikeBの受け入れられた答えは正しいですが、OPはまだ混乱していて、人々はまだこれを見ているので、明確な答えを追加します(はい、8年後)。

マイクの方法

private void pictureBox1_Paint(object sender, PaintEventArgs e)

は、適切なタイミングで呼び出す必要があるスタンドアロンメソッドです。これを実現するには、OnPaintイベントディスパッチャーに登録する必要があります。これにより、OnPaintイベントが発生するたびに呼び出されます。これを行うには、クラスのコンストラクターなどの便利な場所に次の行を配置します。

OnPaint += pictureBox1_Paint;

このアプローチは問題ありませんが、描画パフォーマンスが本当に必要な場所に到達すると、PaintEventArgsを作成して渡すために余分なコストがかかるため、問題が発生します。より良いアプローチは、親クラスのOnPaintメソッドをオーバーライドし、描画コードをOnPaintメソッドに直接配置することです。そうすれば、イベントハンドラーを接続する必要がなく、実行速度が速くなります。コードはほとんど同じに見えます:

protected override void OnPaint (PaintEventArgs e)
        {
            base.OnPaint(e);
            Graphics g = e.Graphics;
            int numOfCells = 200;
            int cellSize = 5;
            Pen p = new Pen(Color.Black);

            for (int y = 0; y < numOfCells; ++y)
            {
                g.DrawLine(p, 0, y * cellSize, numOfCells * cellSize, y * cellSize);
            }

            for (int x = 0; x < numOfCells; ++x)
            {
                g.DrawLine(p, x * cellSize, 0, x * cellSize, numOfCells * cellSize);
            }
        }

最後の提案:PictureBoxコントロールで描画を行うことはほとんどありません。多くの人がそれをしますが、多くの専門家はそのようにそれをしません。これらは描画キャンバスとして設計されたものではなく、すべてのフォームベースのコントロールと同じ機能を継承しているだけです。複雑さが増し、便利な機能をまったく追加せずに速度が低下します。ピクチャーボックスを取り除き、ピクチャーボックスを保持していたフォームまたはパネルに直接描画すると、より幸せになります。

于 2018-03-11T02:15:24.367 に答える