質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

2回答

13240閲覧

pictureBoxに線が描けません。何故でしょうか?

fender0131

総合スコア121

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

1クリップ

投稿2016/03/01 06:12

編集2016/03/01 06:33

いつも大変お世話になっております。

上:Loadイベント時に、線を描こうとすると書けません。
下:Loadイベント時には処理を行わず、button1がクリックされたときに線を描こうとすると書けます。

これは何が原因なのでしょうか?
実際はフォームが作られた際に線を引きたいので、上の処理でプログラムを組みたいと考えております。

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 WindowsFormsApplication8 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.KeyPreview = true; } private void Form1_Shown(object sender, EventArgs e) { byouga(); } private void button1_Click(object sender, EventArgs e) { byouga(); } private void byouga() { //Panel1のGraphicsオブジェクトを作成 Graphics g = pictureBox1.CreateGraphics(); // penを作成 Pen greenPen = new Pen(Color.Green, 5); // lineの始点と終点を設定 Point Start_point5 = new Point(50, 200); Point End_point5 = new Point(250, 200); // lineを描画 g.DrawLine(greenPen, Start_point5, End_point5); // penを解放する greenPen.Dispose(); // Graphicsを解放する g.Dispose(); } } }
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 WindowsFormsApplication8 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.KeyPreview = true; } private void button1_Click(object sender, EventArgs e) { byouga(); } private void byouga() { //Panel1のGraphicsオブジェクトを作成 Graphics g = pictureBox1.CreateGraphics(); // penを作成 Pen greenPen = new Pen(Color.Green, 5); // lineの始点と終点を設定 Point Start_point5 = new Point(50, 200); Point End_point5 = new Point(250, 200); // lineを描画 g.DrawLine(greenPen, Start_point5, End_point5); // penを解放する greenPen.Dispose(); // Graphicsを解放する g.Dispose(); } } }

お手数おかけして申し訳ございませんが、どなた様かご指導ご鞭撻の程よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

CreateGraphicsメソッドで取得したGraphicsオブジェクトに対して描画した内容はPaintイベントに反映されないため、Paintイベント発生時に消されてしまいます。ですのでLoadイベントで描画しようとしても、直後のPaintイベントで消えてしまっているのです。ボタン押下で描画できているとしていますが、他のアプリのウィンドウをかぶせたりしてPaintイベントを発生させると消えてしまいます。

PictureBoxにグラフィックを描画するときは、Imageプロパティにクライアント領域と同じサイズのBitmapオブジェクトを設定し、そこに描画してください。

コード例です。

C#

1private void Form1_Load(object sender, EventArgs e) 2{ 3 pictureBox1.Image = new Bitmap(pictureBox1.ClientRectangle.Width, pictureBox1.ClientRectangle.Height); 4 byouga(); 5} 6 7private void byouga() 8{ 9 // PictureBoxのImageを描画対象にします。 10 using(var g = Graphics.FromImage(pictureBox1.Image)) 11 using(Pen greenPen = new Pen(Color.Green, 5)) 12 { 13 // lineの始点と終点を設定 14 Point Start_point5 = new Point(50, 200); 15 Point End_point5 = new Point(250, 200); 16 17 // lineを描画 18 g.DrawLine(greenPen, Start_point5, End_point5); 19 } 20 // コントロールを再描画させます。 21 pictureBox1.Invalidate(); 22}

投稿2016/03/01 06:33

編集2016/03/01 06:46
catsforepaw

総合スコア5944

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fender0131

2016/03/01 06:51

大変助かりました。 思い通りの結果を出力することができました。 今後はCreateGraphicsメソッドの特性に注意し、Bitmapオブジェクトを絡めて描画していくよう心掛けたいと思います。 大変わかりやすかったです。 ありがとうございました。
guest

0

こんにちは。

そのタイミングではフォームの必要な処理が完了していないからだと思います。
恐らく、Shownイベントで描画すればできるでしょう。

因みにイベントの発生順序がここにかかれています。参考になるかも。

投稿2016/03/01 06:23

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fender0131

2016/03/01 06:31 編集

お答えありがとうございます。 参照サイト大変参考になりましたありがとうございます。 自分もShownで試してみたのですが、描画できませんでした。 他に原因など考えられますでしょうか? private void Form1_Shown(object sender, EventArgs e) { byouga(); }
fender0131

2016/03/01 06:53

catsforepaw様の回答で無事解決できました。 今後もよろしくお願い致します。
Chironian

2016/03/01 06:57

なるほど。確かにそうでした。 戸惑わせてごめんなさい。
fender0131

2016/03/01 07:48

こちらこそ、わかりづらい質問をしてしまい申し訳ございませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問