web-dev-qa-db-ja.com

ピクチャボックスに円と線を描くにはどうすればよいですか?

ピクチャボックスに円と線を描くにはどうすればよいですか?

14
Alexry

ピクチャーボックスはコントロールであり、ソースとして画像を持っています-そのため、画像を描画し、その画像をコントロールに渡して表示する必要があります

MyImage = new Bitmap(fileToDisplay);
pictureBox1.ClientSize = new Size(xSize, ySize);
pictureBox1.Image = MyImage;
0
Gambrinus

または:

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.DrawLine(
            new Pen(Color.Red,2f), 
            new Point(0,0), 
            new Point(pictureBox1.Size.Width, pictureBox1.Size.Height ));

        e.Graphics.DrawEllipse(
            new Pen(Color.Red, 2f),
            0,0, pictureBox1.Size.Width, pictureBox1.Size.Height  );
    }

画像ボックスのPaintイベントを処理し、そこでカスタム描画を行います。

29
Paul Sasik

最良の方法は、ピクチャボックスに円と線を描画しないことです。それはその目的のために設計されていません。

Bob PowellのGDI +ブログから:

この問題の原因は、Windowsプログラミングの基本的なルールに違反していることです。そして、絵箱の結果として、本当にそのせいではない何かのために非難されます。その理由を説明するために、以下の4つのポイントで、この場合の問題点を概説します。

  • PictureBoxコントロールは、画像を表示するためのものです。これは、グラフィックスサーフェスの便利なプレースホルダーではありません。

  • Windowsはイベント駆動型のシステムであり、各イベントは正しいコンテキストで処理される必要があり、ボタンクリックまたはマウス移動イベントを処理するためのイベントは、画面上での描画やその他の奇妙なものの実行には使用できません。

  • PictureBoxは、Imageプロパティに格納されているSystem.Drawing.Imageベースのオブジェクトを描画することにより、自身を更新します。画像がない場合は、背景色が表示されます。

  • コントロールのGraphicsオブジェクトを盗んだり描画したりすることはお勧めできません。強くお勧めしません。また、適切な場所で適切なタイミングでイベントを処理するというルールに違反します。基本的にこれを行うと痛みを引き起こします。壁に頭をぶつけると、痛みを引き起こします。それはあなたがそれをやめるべきだというしるしです。これは、PictureBox.CreateGraphics呼び出しでも同じです。

それを行う正しい方法

イベント駆動型システムのルールに従うことは簡単ですが、少しの予見が必要です。したがって、ウィンドウの前に移動して再び離れたとき、または最小化して復元したときにグラフィックスを少しだけ描画してそこに残したい場合は、希望するオブジェクトのPaintイベントを処理する必要があります。ペイントする。 PictureBoxには、この種のアプリケーションには不要な手荷物が付いています。 1か所に何かを描画したいだけの場合は、Form.Paintイベントに応答してフォームに描画します。設定された境界内で機能するグラフィックの便利なプレースホルダーが必要な場合は、Panelコントロールを使用して、Paintイベントを処理します。企業イメージのグラフィックを何度も複製する場合は、コントロールを作成し、OnPaintオーバーライドで描画を行います。

元のリンク(無効): http://bobpowell.net/picturebox.htm

注:Bob Powellのブログへの元のリンクは機能しなくなりました。歴史的な目的のためにここに残しました。ページのコンテンツは、インターネットアーカイブ( https://web.archive.org/web/20120330003635/http://bobpowell.net/picturebox.htm )でも引き続き閲覧できます。この投稿が編集された日付。

5
Chris Dunaway
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Asssignment
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)
        { 
            Graphics g = this.CreateGraphics();
            Pen p = new Pen(Color.Blue);
            int radius = 200;
            int x =Width/2;
            int y =Height/2;


            int first_point1 = (int)(Math.Cos(0) * radius + x);
            int first_point2 = (int)(Math.Sin(0) * radius + y);

            Point p1= new Point(first_point1,first_point2);
            for(int i=1;i<500; i++)
            {
                int dx = (int)(Math.Cos(i)*radius+x );
                int dy = (int)(Math.Sin(i)*radius+y );
                Point p2 = new Point(dx, dy);
                g.DrawLine(p, p1, p2);
                p1 = p2;
            }
        }
    }
}
0