C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: Pensクラスの受け渡しについて


(過去ログ 131 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■77299 / inTopicNo.1)  Pensクラスの受け渡しについて
  
□投稿者/ ゆーきゃん (61回)-(2015/10/06(Tue) 14:45:21)

分類:[C#] 

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

VisualStdio2013 C# windowsフォームアプリケーションでプログラムを組んでいます。

テキストボックスに入力された値を元に線の色を変更したいのですが、ご教授願えませんでしょうか。 
以下は作成途中のプログラムです。 
省略している箇所もありますが、大体このような流れでプログラムを組んでおります。 

Pens_color情報を e.Graphics.DrawEllipseに上手く渡せていない状態です。 


 public struct Kouzoutai 
 { 
        public float zahyou_x; 
        public float zahyou_y; 
        public char[] color_control; 
 } 



// 線の色を変えるクラス 
 public class Pens_Color
 {
        public static Kouzoutai k;

        public static void pen_c(Pen pen_color)
        {

            switch (k.color_control[0])// textboxから色番号を取っています。 
            {
                case '0':

                    pen_color = new Pen(Color.Black, 1);
                    break;

                case '1':

                    pen_color = new Pen(Color.Blue, 1);
                    break;

                case '2':

                    pen_color = new Pen(Color.Green, 1);
                    break;
                   
                    ・
          ・
          ・

             }
        }                 
 }       
  

// 線・円を描くクラス 
public static class Draw 
{ 
        public static Kouzoutai k; 

        public static void draw_test(object sender, PaintEventArgs e) 
        { 
                e.Graphics.DrawEllipse( /*ここにPen_color情報を持ってきたい */., k.zahyou_x, k.zahyou_y, 1, 1); 
        } 
}

引用返信 編集キー/
■77301 / inTopicNo.2)  Re[1]: Pensクラスの受け渡しについて
□投稿者/ 魔界の仮面弁士 (517回)-(2015/10/06(Tue) 15:22:03)
No77299 (ゆーきゃん さん) に返信
> public static void pen_c(Pen pen_color)
引数で返却するのであれば、
 public static void pen_c(out Pen pen_color)
という宣言にする必要があります。


しかし今回の場合は、戻り値で扱ったほうが良いと思います。
具体的には、
> public static void pen_c(Pen pen_color)

 public static Pen pen_c()
に変更し、さらに
>  pen_color = new Pen(Color.Black, 1);
の代わりに
  return new Pen(Color.Black, 1);
とします。


それを利用する側は、
>  e.Graphics.DrawEllipse( /*ここにPen_color情報を持ってきたい */., k.zahyou_x, k.zahyou_y, 1, 1);
の部分を、下記のように変更します。

 // Pen は IDisposable であり、使用後には
 // Dispose する必要があるため、using ブロックで囲む
 using(Pen p = Pens_Color.pen_c())
 {
   e.Graphics.DrawEllipse(p, k.zahyou_x, k.zahyou_y, 1, 1);
 }


もし、利用側で using するのが面倒なようなら、
(pen_c メソッドで)毎回 new Pen(…); するのではなく、
生成済みの Pen インスタンスを返却するようにしておくと
良いかと思います。
(Pens クラスの static なプロパティのようにするということ)
引用返信 編集キー/
■77302 / inTopicNo.3)  Re[1]: Pensクラスの受け渡しについて
□投稿者/ Hongliang (350回)-(2015/10/06(Tue) 15:22:10)
> public static void pen_c(Pen pen_color)
メソッド内でpen_colorに代入しても、呼び出し元には影響しませんよ?

描画メソッドを静的メソッドとして外に出す、を目的として私が設計するならこんな感じかなぁ…。

class DrawInfo {
    public DrawInfo() {
        this.PenColor = Color.Black;
        this.PenWidth = 1;
        this.Coordinates = new PointF(0, 0);
    }
    public PointF Coordinates { get; set; }
    public Color PenColor { get; set; }
    public float PenWidth { get; set; }

    public DrawInfo Clone() {
        return (DrawInfo)this.MemberwiseClone();
    }
    public bool Equals(DrawInfo other) {
        return this.Coordinates == other.Coordinates
            && this.PenColor == other.PenColor
            && this.PenWidth == other.PenWidth;
    }
}

class Form1 : Form {
    private DrawInfo m_DrawInfo = new DrawInfo();
    // 諸々
    private void TextBox1_TextChanged(object sender, EventArgs e) {
        this.UpdateDrawInfo();
    }
    private void Label1_Paint(object sender, PaintEventArgs e) {
        Painter.Draw(e.Graphics, this.m_DrawInfo);
    }

    private void UpdateDrawInfo() {
        DrawInfo original = this.m_DrawInfo.Clone();

        this.m_DrawInfo.PenColor = this.ConvertTextToColor(this.TextBox1.Text);
        // ほかにCoordinatesの更新とかも行う

        // 描画情報に変更があればラベルを再描画する
        if (!this.m_DrawInfo.Equals(original)) {
            this.Label1.Invalidate();
        }
    }
    private Color ConvertTextToColor(string text) {
        if (String.IsNullOrEmpty(text)) {
            return Color.Black;
        }
        else {
            switch (text[0]) {
                // 以下略
            }
        }
    }
}

static class Painter {
    public static void Draw(Graphics g, DrawInfo drawInfo) {
        using (Pen pen = new Pen(drawInfo.PenColor, drawInfo.PenWidth)) {
            // 以下penを使って描画する
        }
    }
}

引用返信 編集キー/
■77303 / inTopicNo.4)  Re[1]: Pensクラスの受け渡しについて
□投稿者/ しま (104回)-(2015/10/06(Tue) 15:31:45)
No77299 (ゆーきゃん さん) に返信
> いつもお世話になっております。
> 
> VisualStdio2013 C# windowsフォームアプリケーションでプログラムを組んでいます。
> 
> テキストボックスに入力された値を元に線の色を変更したいのですが、ご教授願えませんでしょうか。 
> 以下は作成途中のプログラムです。 
> 省略している箇所もありますが、大体このような流れでプログラムを組んでおります。 
> 
> Pens_color情報を e.Graphics.DrawEllipseに上手く渡せていない状態です。 
> 

上手く渡せていないではなくて、渡すような仕組(しくみ)があなたの示すコードに無いだけでしょう?
一番簡単なのは(実用になるかどうかは別です) class Draw に使いたい色情報を知らせる関数(メソッド)を
追加することでしょう。

public static class Draw{
    public static kouzoutai k;
    public setColor(kouzoutai k_) { k = k_; }

    ... //必要な処理 
}

余計なお世話だとは思いますが、
それよりも、今の設計があなたのやりたい事にかなうものかどうか見直した方がいいかもしれません。
色違いで位置も大きさも違う楕円を幾つも描画するのなら、今の設計ではかなり難しいことになりそうな気がするからです。

引用返信 編集キー/
■77307 / inTopicNo.5)  Re[2]: Pensクラスの受け渡しについて
□投稿者/ ゆーきゃん (62回)-(2015/10/06(Tue) 18:52:23)
No77301 (魔界の仮面弁士 さん) に返信

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

return new Pen(Color.Black, 1); で値を返すことができるのですね!
大変勉強になりました。
プロパティを設定して色情報を渡したりと色々試行錯誤はしていたのですが、
このコードですと見やすく、理解しやすいですね。

早速、参考にさせて頂き思い通りの結果を出力することができました。


少しここから別件になってしまうのですが、お付き合い願いますでしょうか?

次に線種もテキストボックスに入力された値を元に変更しようとしているのですが、
どのようにプログラムを組むことで色情報のように受け渡しできるのかわからず困っております。

Pen.DashStyle = DashStyle.Dot;
Pen Pen = new Pen(Color.Green, 3);

このような場合、色の時同様イコール後の「DashStyle.Dot」をreturnで返せばよろしいのでしょうか?
以下作成途中のプログラムとなります。

お手数おかけして申し訳ございませんが、再度ご教授頂けないでしょうか?


 public struct Kouzoutai 
 { 
        public float zahyou_x; 
        public float zahyou_y; 
        public char[] color_control; 
    public char[] sensyu_control;
 } 


 public class Pens_Color
 {
        public static Pen pen_c(Kouzoutai k)
        {
            switch (k.color_control[0])
            {
                case '0':
                    return new Pen(Color.Black,1);
                    ・・・
            }
        }
 }


 public class Pens_Sensyu
 {
        public static Pen pen_s(Kouzoutai k)
        {
            switch (k.sensyu_control[0])
            {
                 case '0':
                    return  //  DashStyle.Dot;
                            // どのようにreturnで線種情報を返せますでしょうか?
      }
        }
 } 
      

 public partial class Draw
 {
        public static Kouzoutai k;
        
        public static void draw_test(object sender, PaintEventArgs e)
        {
            using (Pen p1 = Pens_Color.pen_c(k))
            {
         using (Pen p2 = Pens_Sensyu.pen_s(k ,p1))
               {
                     e.Graphics.DrawEllipse(p2, k.zahyou_x, k.zahyou_y, 1, 1);
                 }
            }
        }
 }

引用返信 編集キー/
■77308 / inTopicNo.6)  Re[2]: Pensクラスの受け渡しについて
□投稿者/ ゆーきゃん (63回)-(2015/10/06(Tue) 19:01:46)
No77302 (Hongliang さん) に返信
> > public static void pen_c(Pen pen_color)
> メソッド内でpen_colorに代入しても、呼び出し元には影響しませんよ?
>
> 描画メソッドを静的メソッドとして外に出す、を目的として私が設計するならこんな感じかなぁ…。
>

呼び出し方・受け渡し方が分かってないですね・・・ご指摘ありがとうございます。
プログラムソースまで貼って頂き、ありがとうございます。
自分が組んでいるプログラムソースと違い、まとまっているのが素人目から見てもわかりました。

一度自分の組んでいるテストプログラムが一区切りつきましたら、Hongliang さんのプログラムソースを元にもう一度作ってみようと思います。

その際、疑問点など出ましたら、再度ご教授頂くことは可能でしょうか?
よろしくお願い致します。
引用返信 編集キー/
■77309 / inTopicNo.7)  Re[2]: Pensクラスの受け渡しについて
□投稿者/ ゆーきゃん (64回)-(2015/10/06(Tue) 19:10:29)
No77303 (しま さん) に返信
> ■No77299 (ゆーきゃん さん) に返信
>
> 上手く渡せていないではなくて、渡すような仕組(しくみ)があなたの示すコードに無いだけでしょう?

はい。その通りです。受け渡し方が分かっておりませんでした。
申し訳ないです。

> 余計なお世話だとは思いますが、
> それよりも、今の設計があなたのやりたい事にかなうものかどうか見直した方がいいかもしれません。
> 色違いで位置も大きさも違う楕円を幾つも描画するのなら、今の設計ではかなり難しいことになりそうな気がするからです。
>

一度、今のテストプログラムを形にしてから考えていこうと思います。
ご指摘ごもっともだと思います。
完成後、実際に動かしてみて、問題点をピックアップして、今後に活かそうと思います。
引用返信 編集キー/
■77314 / inTopicNo.8)  Re[3]: Pensクラスの受け渡しについて
□投稿者/ ゆーきゃん (65回)-(2015/10/07(Wed) 10:11:29)
ご迷惑おかけしました。
自己解決いたしました。

以下プログラムを提示しておきます。

public class Pens_Sensyu
{
        public static Pen pen_s(Kouzoutai k , Pen p)
        {
            switch (k.sensyu_control[0])
            {
                 case '0':

                    p.DashStyle = DashStyle.Solid;
                    return p;
            ・
            ・ 
            ・
            }
        }
}


public partial class Draw
{
        public static Kouzoutai k;
        
        public static void draw_test(object sender, PaintEventArgs e)
        {
            Pen p = Pens_Color.pen_c(k);
            Pen p1 = Pens_Sensyu.pen_s(k, p);

            e.Graphics.DrawEllipse(p1, k.zahyou_x, k.zahyou_y, 1, 1);
        }
}


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -