C#でフォームサイズ変更で消えない描画の方法

このQ&Aのポイント
  • C#の初心者の方が、ボタンをクリックして描画した図形がフォームサイズを変更すると消えてしまう問題について解決方法を教えてください。
  • 具体的な問題として、ボタンをクリックするとピクチャーボックスに円を描くプログラムを作成しましたが、ウィンドウサイズを小さくして再び元のサイズに戻すと円が消えたままになります。
  • さらに、円を描くためにピクチャーボックスのペイントイベントを使用した場合、フォームのサイズを変更しても円が自動的に再描画されますが、プログラムが起動すると円が最初から描画されてしまいます。
回答を見る
  • ベストアンサー

C# フォームサイズ変更で消えない描画の方法

前略 ・C#の初心者です。 ・ボタンをクリックして作成した描画がウィンドウサイズを小さくして、再び元のサイズにした場合再描画されずに消えたまになってしまいます。消えない描画の方法をおしえてください。 ・下記はボタンをクリックするとピクチャーボックスに円を描くプログラムです。これだとウィンドウサイズを小さくしたあと、再びウィンドウを大きくしたとき円は消えたままです。 private void button1_Click(object sender, EventArgs e) { Graphics g = pictureBox1.CreateGraphics(); g.DrawEllipse(Pens.Black, 0, 0, 100, 100); } ・また下記はピクチャーボックスのペイントイベントを用いて円を描いたもので、フォームのサイズを小さくして円をかくした後フォームサイズを元にもどしても円は自動的に再描画されますが、プログラムが起動すると円が描画されてしまうプログラムです。 private void pictureBox1_Paint(object sender, PaintEventArgs e) {   Graphics g = e.Graphics; g.DrawEllipse(Pens.Black, 0, 0, 100, 100); } ★ ボタンをクリックすると円が描画され、ウィンドウを小さくして円を隠し、ウィンドウサイズをもとの大きさにもどした時自動的に再描画する方法をおしえてください。 以上、よろしくお願いします

noname#154688
noname#154688

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

PictureBoxのImageに書き込んでやれば保持されるんじゃないですか。 前提として、フォームのLoadかShownイベントに以下の行を仕込んでおきます。 pictureBox1.Image = new Bitmap(100, 100); // pictureBox1のwidth,heightにしといた方がいいかも で、肝心のコードはbutton1_Clickの方で Graphis g = FromImage(pictureBox1.Image); g.DrawEclipse(...); pictureBox1.Invalidate(); としとけばOKなはず。

参考URL:
http://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html
noname#154688
質問者

お礼

前略 ・さっそく回答ありがとうございます。  教示にしたがい、下記のコードで実行したところ、ボタンクリックで作成した円がフォームサイズを小さくして円を隠した後 再びフォームを大きくしても自動的に円が再描画されるようになりました。 private void button1_Click(object sender, EventArgs e) { pictureBox1.Image = new Bitmap(pictureBox1.Width,pictureBox1.Height); Graphics g = Graphics.FromImage(pictureBox1.Image); g.DrawEllipse(Pens.Black,0,0,100,100); }  昨日から悩んでいた問題が解決しました。ありがとうございます。 以上

関連するQ&A

  • VC# 追加フォーム生成時、フォームに描画できない

    前略 ・VC#(.NET 2008)のプログラムでおしえてください。 ・メインのWindowsフォームからボタンクリックで 追加したサブWindowsフォーム上のピクチャーボックス上に何も操作なしでに描画したいのですができません。CreateGraphics()でオブジェクトを生成して描画しています。どのようにしたらよいのかおしえてください。フォームのイベントとして、Paint,Load,shown,Activated等いろいろやってもだめでした。  尚、サブフォームにボタンをもうけ このメソッドの中に描画コマンドを書き、ボタンを操作すると描画できます。下記は円を描こうとしていますが、shapeコンポーネントでは描けな複雑な描画をしたいと思っています。 ・以下に 下記の動作となるソースコードを記載します。 (1)起動するとメインフォームForm1のpictureBox1に 赤い円が描かれる (2)ボタンbutton1をクリックするとForm2が表示される。  Form2上のラベルlabel1とlabel2の文字色は青色に変わっています。  しかし、円は何故か描かれていません (3)Form2上のボタンをクリックすると赤い円がForm2上に描かれます。  どこをどのように直せば追加のサブフォームForm2が表示された時に Form2上のpictureBox1に円が描がかれているのでしょうか。以上、よろしくお願いします //----------------------------------------------------------- //メインフォーム using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace temp2 { public partial class Form1 : Form { public Form1(){ InitializeComponent(); } private void button1_Click(object sender, EventArgs e){ Form2 form2 = new Form2(); form2.ShowDialog(); } private void Form1_Paint(object sender, PaintEventArgs e){ Graphics g = pictureBox1.CreateGraphics(); g.DrawEllipse(Pens.Red, 0, 0, 200, 200); } } } //サブフォーム using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace temp2 { public partial class Form2 : Form { public Form2(){ InitializeComponent(); } private void pictureBox1_Paint(object sender, PaintEventArgs e){ label1.ForeColor = Color.Blue; Graphics g1 = pictureBox1.CreateGraphics(); g1.DrawEllipse(Pens.Blue, 0, 0, 50, 50); label2.ForeColor = Color.Blue; } private void button1_Click(object sender, EventArgs e){ Graphics g2 = pictureBox1.CreateGraphics(); g2.DrawEllipse(Pens.Blue, 0, 0, 50, 50); } private void Form2_Paint(object sender, PaintEventArgs e){ } private void Form2_Load(object sender, EventArgs e){ } private void Form2_Shown(object sender, EventArgs e){ } } } 以上

  • Form1 Load で実行されない。

    以前も同じ質問をしましたが、カテゴリーが不適当だったようですので、再度質問します。 よろしくお願いします。 VB2010のある参考書に下記のようなプログラムがありました。 Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Dim g As Graphics = Me.PictureBox1.CreateGraphics() g.DrawEllipse(Pens.Black, 0, 0, 100, 100) End Sub ボタンをクリックすると円が描けます。これをプログラムの起動時に実行させようと思い Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim g As Graphics = Me.PictureBox1.CreateGraphics() g.DrawEllipse(Pens.Black, 0, 0, 100, 100) End Sub と、しましたが実行されません。 どうすれば良いのでしょうか?

  • VC++:pictureBoxにイベントなしで描画

    前略 ・ Visual Studio 2012 のVC++を使っています。 フォームに貼り付けたピクチャーボックスに、フォームが表示された時にボタンクリック等特にイベントを発生させないでも 描画したいのですができません。 どなたか教えていただければ幸いです。  以下の例で具体的に教えてください。 ボタンもフォームに貼りつけてボタンクリックイベントの中に以下のようにコーディングしてボタンをクリックすると円が描けます。 どのようにすれば、ボタンクリックしないでもフォームが表示された時に、円がピクチャーボックスの中に描画されているようになるのででしょうか?    private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { // 描画を行うグラフィックスクラスを生成 Graphics^ g = pictureBox1->CreateGraphics(); //円の描画 Pen^ blackPen = gcnew Pen(Color::Black, 3); g->DrawEllipse(blackPen, 50, 50, 75,75); //基点(50,50) 幅×高さ:75×75  } 以上、よろしくお願いします

  • C#を用いて描画する四角形の角を丸くする方法

    教えて下さい。 書籍やインターネットで調べているのですが、四角形の角を丸く(ワードの図形描画にある「角丸四角」です。)したり面取り(日曜大工で角を落とすのとおなじ)にはどのようにしたら良いのでしょうか? 多角形は参考するのがあったのですが、「角」の加工について調べたのですが見当たりませんでした。 【四角形描画】 //Graphicsオブジェクトの作成 Graphics g = PictureBox1.CreateGraphics(); //Penオブジェクトの作成(幅1の黒色) //(この場合はPenを作成せずに、Pens.Blackを使っても良い) Pen p = new Pen(Color.Black, 1); //(10,20,100,80)の長方形を描く g.DrawRectangle(p, 10, 20, 100, 80); //リソースを開放する p.Dispose(); g.Dispose(); 【四角形の一箇所の角を丸くする】  →四角形の角の描画が残ってしまう。 //Graphicsオブジェクトの作成 Graphics g = PictureBox1.CreateGraphics(); //位置(10, 20)に100x80の四角を赤色で描く g.DrawRectangle(Pens.Red, 10, 20, 100, 80); //先に描いた四角に外接する楕円の一部 //(開始角度 0度、スイープ角度 90度)を黒で描く g.DrawArc(Pens.Black, 10, 20, 100, 80, 0, 90); //リソースを開放する g.Dispose();

  • 描画した後での塗りるぶし VB

    丸を描画後にColorDialogで指定された色で丸の範囲だけ塗りつぶすというプログラムを作っているのですが、なかなかうまくいきません。 丸は、このように描画するようにしています。 Private Sub PictureBox1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove If (e.Button = MouseButtons.Left) Then Dim g As Graphics = PictureBox1.CreateGraphics() Dim ePos As MouseEventArgs PictureBox1.Refresh() g.DrawEllipse(New Pen(Color.Black, 2), Spos.X, Spos.Y, e.X - Spos.X, e.Y - Spos.Y) ePos = e g.Dispose() End If End Sub Private Sub PictureBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown If (e.Button = System.Windows.Forms.MouseButtons.Left) Then Spos = e End If End Sub VB2010を使っています。 どなたか教えていただけるとありがたいです。よろしくお願いします。

  • C#のpictureBoxの描画のタイミング

    C#のpictureBoxの描画について質問します。 drawにpictureBoxの描画コードが有りますがあり、Form1() の InitializeComponent();の 後(コードA)では、描画できませんが、button1_Click(コードB)では、描画できるようです。 Q1)プログラムの起動時に、描画できる方法はありますか? public Form1() { InitializeComponent(); 処理コード draw(); //コードA } private void button1_Click(object sender,EventArgs e) { draw(); //コードB }

  • グラフックが消えてしまう

    vb2010expressの初心者です シリアル通信で温度が送られてきます。それをTimer1を使って定期的に グラフ化して表示しています。プログラムは Private Sub Timer1_Tick grph =PictureBox1.CreateGraphics() grph.DrawEllipse(Pens.Black, x, y, 2, 2) と、ここまではなんとか成功しています。ところが別のアプリを起動したりして グラフが隠れてしまうと、これまで描いたグラフが消えてしまいます。そこで paintでやってみたんですが、たしかに一度目のデータは消えないけど今度は 二番目からのデータが更新されずかたまったままです。プログラムは Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As _    System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint e.Graphics.DrawEllipseLine(Pens.Red, x, y, 2, 2) なんかむづかしいですね。どうしたらいいんでしょうか。

  • VB.netで図形描画ができません^^;

    初心者質問で申し訳ないです。 VB.net(Visual Studio 2005)で図形描画を行っています。 ボタン押下で図形(四角形)を描画する方法は理解できたのですが 起動時に表示するほうほうが分かりません。 どなたか教えてもらえないでしょうか? Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim g As Graphics g = PictureBox1.CreateGraphics() g.DrawRectangle(Pens.Black, 100, 50, 100, 100) g.Dispose() End Sub 上記のようにLoadから読み込むようにしましたが描画されませんでした。 よろしくお願い致します><

  • テキストボックスに描画

    テキストボックスの上でマウスを動かすと赤い線を描画するプログラムを書きました。 Private Sub TextBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseMove Dim g As Graphics = sender.CreateGraphics() g.FillEllipse(Brushes.Red, e.X, e.Y, 5, 5) End Sub この方法の場合、フォームが再描画されると書いたものが消えてしまいます。 再描画されても消えなくて、なおかつアプリケーションをいったん終了しても復元できる方法があれば、教えてください。

  • VB2005のピクチャーボックス内の図形の移動

    VB2005で、formにPictureBox一つと、Button三つをおいて、Button1で、PictureBoxに丸を書いて、Button2とButton3で、PictureBox内で、丸を右左に移動させようと考えています。で丸を書くことと、同じプロシジャー内では、移動させることはできました。が、別のプロシジャーから移動させるってことは出来るのでしょうか?VB2005をやり始めたばかりなのでてんでわかりません。どなたか詳しい方いらっしゃいましたら教えてください。よろしくお願いします。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim g As Graphics = PictureBox1.CreateGraphics() g.Clear(PictureBox1.BackColor) Dim w As Integer = PictureBox1.ClientSize.Width / 3 Dim h As Integer = PictureBox1.ClientSize.Height / 3 g.ResetTransform() g.DrawEllipse(Pens.Black, 0, 0, w, h) g.TranslateTransform(80, 50) g.DrawEllipse(Pens.Black, 0, 0, w, h) g.ResetTransform() g.Dispose() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim g As Graphics = PictureBox1.CreateGraphics() g.TranslateTransform(80, 50) End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click End Sub End Class

専門家に質問してみよう