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

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

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

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

Visual Studio 2013

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

Q&A

解決済

2回答

5645閲覧

「PaintEventArgs e 」を使わずに、線を描写する場所を選択することは可能ですか?

fender0131

総合スコア121

C#

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

Visual Studio 2013

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

0グッド

0クリップ

投稿2015/11/13 08:32

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

また分かりにくい質問になってしまいます。
申し訳ございません。

picturebox1~4や別フォームのpictureboxから、graph.GLineという線を描くルーチンが呼び出されます。
「graph.GLine((float)Sx, (float)Sy, (float)Ex, (float)Ey);」は引数4つで設計しなければなりません。
描画先情報が含まれていると思われる、「PaintEventArgs e」は引数で渡せないこととなっております。

この場合、描画先を指定することはできますでしょうか?

お手数おかけして申し訳ございませんが、どなた様かご指導ご鞭撻の程よろしくお願い致します。
以下、プログラムソースとなります。

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;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections;
using System.Drawing.Drawing2D;

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

private void pictureBox1_Paint(object sender, PaintEventArgs e) { float Sx=0; float Sy=0; float Ex=0; float Ey=0; Syokiti(ref Sx,ref Sy,ref Ex,ref Ey); graph.GLine((float)Sx, (float)Sy, (float)Ex, (float)Ey); } private void Syokiti( ref float _Sx, ref float _Sy, ref float _Ex, ref float _Ey) { _Sx = 10; _Sy = 10; _Ex = 100; _Ey = 100; } } class global { public static Pen PenData = new Pen(Color.White, 1); }

class graph
{
public static void GLine(float PtX1, float PtY1, float PtX2, float PtY2)
{

// Graphics g = // 書き込む場所を選択 PointF[] LinePoint = new PointF[2]; LinePoint[0] = new PointF(PtX1, PtY1); LinePoint[1] = new PointF(PtX2, PtY2); // g.DrawLine(global.PenData, LinePoint[0], LinePoint[1]); // エラー発生 } }

}

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

e以外から取得は出来ます、pictureBoxであればCreateGraphicsメソッドを使ってください。
ちなみにインスタンスの指定をgraph内で完結するのは原則無理です。
Graphicsインスタンスを渡す必要があります。

C#

1public partial class Form1 : Form 2{ 3 public Form1() 4 { 5 InitializeComponent(); 6 } 7 8 private void button1_Click(object sender, EventArgs e) 9 { 10 var g = pictureBox1.CreateGraphics(); 11 var util = new graph(g); 12 util.GLine(10, 10, 30, 30); 13 } 14} 15 16class graph 17{ 18 public Graphics target { get; set; } 19 20 public graph(Graphics g) 21 { 22 this.target = g; 23 } 24 25 //public static void GLine(float PtX1, float PtY1, float PtX2, float PtY2) 26 public void GLine(float PtX1, float PtY1, float PtX2, float PtY2) 27 { 28 29 // Graphics g = // 書き込む場所を選択 30 31 PointF[] LinePoint = new PointF[2]; 32 33 LinePoint[0] = new PointF(PtX1, PtY1); 34 LinePoint[1] = new PointF(PtX2, PtY2); 35 36 // g.DrawLine(global.PenData, LinePoint[0], LinePoint[1]); // エラー発生 37 target.DrawLine(global.PenData, LinePoint[0], LinePoint[1]); 38 } 39} 40 41class global 42{ 43 //public static Pen PenData = new Pen(Color.White, 1); 44 public static Pen PenData = new Pen(Color.Black, 1); 45 46}

投稿2015/11/13 08:57

Tak1wa

総合スコア4791

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

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

fender0131

2015/11/13 10:25

お答えありがとうございます。 Tak1wa様のソースをお借りしてプログラムを走らせてみました。 button1クリックですと、線が描写されますが、pictureBox1_Paint ですと線が描写されませんでした。何が原因でしょうか? お手数おかけして申し訳ございませんが、再度ご教授願えませんでしょうか? 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 WindowsFormsApplication7 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } /* private void button1_Click(object sender, EventArgs e) { } */ private void pictureBox1_Paint(object sender, PaintEventArgs e) { var g = pictureBox1.CreateGraphics(); var util = new graph(g); util.GLine(10, 10, 30, 30); } } class graph { public Graphics target { get; set; } public graph(Graphics g) { this.target = g; } public void GLine(float PtX1, float PtY1, float PtX2, float PtY2) { PointF[] LinePoint = new PointF[2]; LinePoint[0] = new PointF(PtX1, PtY1); LinePoint[1] = new PointF(PtX2, PtY2); target.DrawLine(global.PenData, LinePoint[0], LinePoint[1]); } } class global { public static Pen PenData = new Pen(Color.Black, 1); } }
Tak1wa

2015/11/13 10:32

何をやりたいのかよくわかりません。結局Paintイベントで描画するのであれば、e.Graphicsを使用すればいいだけなんですが…。 var g = e.Graphics;
fender0131

2015/11/16 00:50

お返事遅れてしまい申し訳ございませんでした。 自分の勘違いで、上記の意味のわからないお返事を返してしまいました。 申し訳ございません。 自動プロパティの動きが満足に理解できなかったため、少し勉強してまいります。 また、別件で質問してしまうかもしれません・・・ その時はまたお答えいただけないでしょうか? この度は大変勉強になりました。 ありがとうございます。
guest

0

まず、PictureBoxコントロールはそれ自身がビットマップイメージを保有して、それを表示するという仕組みなので、通常はPaintイベントを処理する必要はありません。
描画対象はPictureBoxコントロールが保有するイメージオブジェクトということになります。

PictureBoxコントロールには、だいたいこんな感じで描画させます。

C#

1public partial class Form1 : Form 2{ 3 public Form1() 4 { 5 InitializeComponent(); 6 } 7 8 // フォームが作成されたときに呼ばれるメソッド。初期化処理などを書きます。 9 private void Form1_Load(object sender, EventArgs e) 10 { 11 // pictureBox1が表示するビットマップオブジェクトを設定 12 // そのビットマップに描画することになります 13 var image = new Bitmap(pictureBox1.Width, pictureBox1.Height); 14 pictureBox1.Image = image; 15 16 using( var g = Graphics.FromImage(image) ) 17 { 18 // 一応黒で塗りつぶしておきます 19 g.FillRectangle(Brushes.Black, 0, 0, image.Width, image.Height); 20 } 21 } 22 23 Random rand = new Random(); // 乱数生成オブジェクト 24 25 private void button1_Click(object sender, EventArgs e) 26 { 27 // 同じ場所に線を描いても判りづらいので毎回座標を変えます 28 var size = pictureBox1.Image.Size; 29 int x1 = rand.Next(size.Width); 30 int y1 = rand.Next(size.Height); 31 int x2 = rand.Next(size.Width); 32 int y2 = rand.Next(size.Height); 33 34 // 線を描くメソッドを呼び出す 35 this.GLine(x1, y1, x2, y2); 36 } 37 38 // 線を描くメソッド 39 void GLine(int PtX1, int PtY1, int PtX2, int PtY2) 40 { 41 // 描画対象はPaintイベントのPaintEventArgs eではなく、pictureBox1のイメージオブジェクト 42 using( var g = Graphics.FromImage(pictureBox1.Image) ) 43 { 44 g.DrawLine(Pens.White, PtX1, PtY1, PtX2, PtY2); 45 } 46 // 画面に表示させるときのおまじない 47 pictureBox1.Invalidate(); 48 } 49}

座標の指定がfloatの理由がよく判りませんが、この手の描画処理ではintを使うことが多いので書き換えました。

投稿2015/11/13 14:24

編集2015/11/13 14:31
catsforepaw

総合スコア5938

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

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

fender0131

2015/11/16 00:55

お返事大変遅くなり申し訳ございませんでした。 線が書きだされるまでの流れが大変わかりやすかったです。 勉強になりました。 今回の場合ですと、GLineをクラスで分けなければいけなかったので、 Tak1wa様のソースを参考にさせて頂きました。 もちろん、catsforepaw様のプログラムソースも大変参考になりましたので、 今後プログラムソースを書く際、活かさせて頂きたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問