barus's diary

とても真面目なblogですにゃ

C#3D立方体ワイヤーフレーム (第4回) for VS2013 Express

f:id:hatakeka:20160912174949g:plain

 

4回目

 

CThreeD.cs   C#3D立方体ワイヤーフレーム (第1回) for VS2013 Express
CBond.cs    C#3D立方体ワイヤーフレーム (第2回) for VS2013 Express
CRubic.cs    C#3D立方体ワイヤーフレーム (第3回) for VS2013 Express
Form1.cs    C#3D立方体ワイヤーフレーム (第4回) for VS2013 Express

 

今回は、1回~3回目で作成したクラスを使用します。

 

C#グラフィック コッホ曲線 for VS2013 Expressで作成したのを流用します。

 

コモンコントロールより

button1と、picturebox1とtextbox1、textbox2を追加

してペタペタ貼り付けて下さい。

 

コモンコントロールの使い方が分からない方は

Windowsアプリを作成してみよう for VS2015 Express for Desktop C#

を参照して下さいね。

 

 

 

 

 

f:id:hatakeka:20160912194806p:plain

 

こんな感じ。

 

Form1 クラス

Form1.cs

 

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 WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        CRubic m_pRubic;// = new CRubic();
        bool nFlags = false;

        public Form1()
        {
            //int scale = int.Parse(textBox2.Text);
            m_pRubic = new CRubic(600);
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            ondraw();

        }

        void ondraw()
        {
            //描画先とするImageオブジェクトを作成する
            Bitmap canvas = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            //ImageオブジェクトのGraphicsオブジェクトを作成する
            Graphics gra = Graphics.FromImage(canvas);

            //Penオブジェクトの作成(幅1の黒色)
            //(この場合はPenを作成せずに、Pens.Blackを使っても良い)
            Pen pen = new Pen(Color.Blue, 1);

            //立方体
            int scale = int.Parse(textBox2.Text);
            m_pRubic.DrawRubic(gra, pen, scale);

            pen.Dispose();
            gra.Dispose();

            //PictureBox1に表示する
            pictureBox1.Image = canvas;
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {

        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            Point point = new Point();
            point.X = e.X;
            point.Y = e.Y;
            if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
            {
                nFlags = true;
                m_pRubic.SetClickPoint(point);
            }
            else if ((e.Button & MouseButtons.Right) == MouseButtons.Right)
            {
                nFlags = true;
                m_pRubic.SetClickPoint(point);
            }
            ondraw();
        }

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {

            Point point = new Point();
            point.X = e.X;
            point.Y = e.Y;
            if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
            {
                nFlags = false;
            }
            else if ((e.Button & MouseButtons.Right) == MouseButtons.Right)
            {
                nFlags = false;

            }
            ondraw();

        }

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {

            Point point = new Point();
            point.X = e.X;
            point.Y = e.Y;

            if (nFlags && (e.Button & MouseButtons.Left) == MouseButtons.Left)
            {
                m_pRubic.TurnViewPoint(point);
                ondraw();
            }
            else if (nFlags && (e.Button & MouseButtons.Right) == MouseButtons.Right)
            {

                m_pRubic.MoveCubes(point);
                ondraw();
            }
        }

    }


}

 

 

 

 

void ondraw()
{
 //描画先とするImageオブジェクトを作成する
 Bitmap canvas = new Bitmap(pictureBox1.Width, pictureBox1.Height);
 //ImageオブジェクトのGraphicsオブジェクトを作成する
 Graphics gra = Graphics.FromImage(canvas);
 //Penオブジェクトの作成(幅1の黒色)
 //(この場合はPenを作成せずに、Pens.Blackを使っても良い)
 Pen pen = new Pen(Color.Blue, 1);
 //立方体
 int scale = int.Parse(textBox2.Text);
 m_pRubic.DrawRubic(gra, pen, scale);
 pen.Dispose();
 gra.Dispose();
 //PictureBox1に表示する
 pictureBox1.Image = canvas;
}

 

ondraw()関数はよく使われるので関数化した。

 //立方体
 int scale = int.Parse(textBox2.Text);
 m_pRubic.DrawRubic(gra, pen, scale);

の部分以外は同じ使い回し。

 

textBox2で、スケール情報をもたせた。

 

イベント

pictureBox1上で、マウスがクリックされた情報を取得し

それを、今まで作ったクラスに渡してpictureBox1に描画しています。

 

なので、pictureBox1上でマウスがクリックされた、動いた、

ボタンが離されたという情報を以下の関数で取得しています。

 

pictureBox1_MouseDown   ・・・pictureBox1上マウスがクリックされた
pictureBox1_MouseUp    ・・・pictureBox1上マウスがクリックから離された
pictureBox1_MouseMove   ・・・pictureBox1上マウスをクリックしたまま動いた

 

この関数名は覚える必要はありません。

以下のやり方で自動生成しています。

 

エディタ上で、右クリックしてプロパティをクリックすると
以下のような画面が表示されます。雷マークみたいをクリックします。

f:id:hatakeka:20160912195646p:plain

 

雷マークをクリックすると

このpictureBox1で拾えるイベント一覧が表示されます。

 

f:id:hatakeka:20160912195800p:plain

 

この中の

pictureBox1_MouseDown   ・・・マウスがクリックされたとき
pictureBox1_MouseUp    ・・・マウスがクリックから離されたとき
pictureBox1_MouseMove   ・・・マウスをクリックしたまま動したとき

 

のそれぞれをWクリックすると、ソースが自動で追加されます。
それを編集することになります。

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
 Point point = new Point();
 point.X = e.X;
 point.Y = e.Y;
 if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
 {
  nFlags = true;
  m_pRubic.SetClickPoint(point);
 }
 else if ((e.Button & MouseButtons.Right) == MouseButtons.Right)
 {
  nFlags = true;
  m_pRubic.SetClickPoint(point);
 }
 ondraw();
}

 

左マウスがクリックされた時、m_pRubic.SetClickPoint( point );が処理される。
左マウスが離された時、nFlagstrue;になる。
右マウスがクリックされた時、m_pRubic.SetClickPoint( point );が処理される。
右マウスが離された時、nFlagstrueになる。

 


private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
 Point point = new Point();
 point.X = e.X;
 point.Y = e.Y;
 if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
 {
  nFlags = false;
 }
 else if ((e.Button & MouseButtons.Right) == MouseButtons.Right)
 {
  nFlags = false;
 }
 ondraw();
}


左マウスが離された時、nFlagsfalse;になる。
右マウスが離された時、nFlagsfalse;になる。

 

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
 Point point = new Point();
 point.X = e.X;
 point.Y = e.Y;

 if (nFlags && (e.Button & MouseButtons.Left) == MouseButtons.Left)
 {
  m_pRubic.TurnViewPoint( point );
  ondraw();
 }
 else if (nFlags && (e.Button & MouseButtons.Right) == MouseButtons.Right)
 {
  m_pRubic.MoveCubes(point);
  ondraw();
 }
}

 

左マウスがクリックされた状態で動いた時、m_pRubic.TurnViewPoint( point );が処理される。
右マウスがクリックされた状態で動いた時、m_pRubic.MoveCubes( point );が処理される。


このイベントという概念は、C#だけのものではなく他の言語にもあります。
Windowsだけでなく、Linuxにもあり、似たり寄ったりなので
こういうもんだと思って頂ければよいかと思います。

 


終わり。

 

 

 

 


 

 


 

 


 

 

 

作って覚えるVisual C# 2015 デスクトップアプリ入門

作って覚えるVisual C# 2015 デスクトップアプリ入門

 
猫でもわかるC#プログラミング 第3版 (猫でもわかるプログラミング)

猫でもわかるC#プログラミング 第3版 (猫でもわかるプログラミング)