MyHandler() で PictureBox に図形を描く

ウインドウに PictureBox を貼り付けて、MyHandler() で図形を描きます。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. プログラムは PictureBox の画像の上から図形を描く と良く似ています。
    違いは PictureBox の Paint をデリゲートするか、Form の Paint をデリゲートするかです。
    空のプロジェクトを作成して、[ツールボックス] から [PictureBox] を貼り付けて下さい。
    描画はプログラムで行うので、ここでは貼り付けるだけです。
    PictureBox を貼り付ける方法は PictureBox に画像を描く を参照して下さい。
  2. Paint をデリゲート(委譲)して図形を描くので、イベントハンドラ(MyHandler)を設定して下さい。
        public MyForm()
        {
            InitializeComponent();
            Paint += new PaintEventHandler(MyHandler);
        }
        
  3. new で生成した Bitmap に図形を描いて、PictureBox の Image 領域として設定します。
    new Bitmap(pictureBox1.Width, pictureBox1.Height) で PictureBox のサイズに合わせて領域を確保します。
    pictureBox1.Image が PictureBox に表示されるイメージの領域です。
    Image の Graphics を取得して、図形を描きます。
    図形の描画は 図形を描画する を参照して下さい。
        private void MyHandler(object sender, PaintEventArgs e)
        {
            // pictureBox1.Image に新しい Bitmap を設定
            pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height) ;
            Graphics gra     = Graphics.FromImage(pictureBox1.Image) ;
    
            // ※ここで図形を描いて下さい。
    
        }
        
  4. この方法では MyHandler() が呼ばれる度に new で Bitmap 領域が生成されます。
    ガベージコレクションが自動的に開放してくれるので特に気にする必要は無いのですが、描画が同じなら毎回生成するのは気がひけます。
    出来たら MyForm() で最初に一度だけ生成する方法をお勧めします。
    試しに乱数で毎回色を変えて描画してみました。
    プログラムを起動後、アイコン表示と通常表示を切り替えると図形の色が変わるので試して下さい。
        private void MyHandler(object sender, PaintEventArgs e)
        {
            // pictureBox1.Image に新しい Bitmap を設定
            pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height) ;
            Graphics gra     = Graphics.FromImage(pictureBox1.Image) ;
            Random rand = new Random();
            int red = rand.Next(256);
            int green = rand.Next(256);
            int blue = rand.Next(256);
            Color cor = Color.FromArgb(255, red, 0, 0);
            gra.DrawLine(new Pen(cor), 10, 50, 280, 50);
            cor = Color.FromArgb(255, 0, green, 0);
            gra.DrawLine(new Pen(cor, 10), 10, 100, 280, 100);
            cor = Color.FromArgb(255, 0, 0, blue);
            gra.DrawLine(new Pen(cor, 20), 10, 150, 280, 150);
        }
        
  5. 参考として「メインのウインドウに Line を描画する」MyHandler() メソッドを示します。
    e.Graphics で取得すると PictureBox では無く、メインのウインドウの Graphics が格納されます。
    念のために申し添えますが、このコードでは PictureBox の影に隠れて Line が見えなくなるかも知れません。
        private void MyHandler(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.DrawLine(new Pen(Color.Red),10,50,280,50);
            g.DrawLine(new Pen(Color.Green,10),10,100,280,100);
        }
        

超初心者のプログラム入門(C# Frame Work)