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

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

ただいまの
回答率

90.76%

  • C#

    6573questions

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

Virtual Sutudio 2017 でペイントソフトを作る事から始めましたが…

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 311

mistletoe

score 2

 前提・実現したいこと

現在 Virtual Sutudio 2017 で言語の勉強の先駆けにペイントソフトを作っています。
ネットに落ちているサンプルコードを切り貼りしたり打ち込みながら自分なりの解釈で作ろうと実践していました。自分用のノートもかねてなので汚いメモと考えてもらえればよいですが、何もかも分からないスタートです故、お手柔らかにお願いします。
まず、見つかったYoutubeの動画を見ながらpictureBoxに線を引いたり、キャンバスカラーを変更することに成功しましたが、少しずつ変えながら何度も失敗し、これだけで20回はソリューションを作り直しました。
参考1:https://www.youtube.com/watch?v=gFIVnfw1Ywo&list=PLzEbEpZ4njvPYeBohSQ9te-W_L27r77Fg&index=80
参考2:https://www.codeproject.com/Tips/811495/Simple-Paint-Application-in-Csharp
参考3:http://skylinker.blog.fc2.com/blog-entry-57.html

 発生している問題・エラーメッセージ

コードがややこしくなった為かpictureBox1に線が引けなくなる問題。
コードがややこしくなった為かキャンバスカラーを変えられていたのに、ボタンが反応しなくなる問題。
このデータはもう重いので作り直すか迷っていますが、分からないので疲れてしまいました。

 該当のソースコード

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;

namespace WindowsFormsApp4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            g = pB1.CreateGraphics();
        }
        Graphics g;

        private void Form1_Load(object sender, EventArgs e)
        {
            bmp = new Bitmap(pB1.Width, pB1.Height);
            draw();
        }
        private static void draw()
        {
        }

        Bitmap bmp = null;
        bool drawFlg = false; //true:描画中

        //nullable int for staing Null value
        int? initX = null;
        int? initY = null;
        bool startPaint = false;
        bool drawSquare = false;
        bool drawRectangle = false;
        bool drawCircle = false;

        //Event Fired when mouse pointer is over Panel and a mouse button is pressed
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            //描画中にする
            drawFlg = true;

            pictureBox1_MouseMove(sender, e);
            /*
            startPaint = true;
            if (drawSquare)
            {
                //Use Solid Brush for filling the graphic shaoes
                SolidBrush sb = new SolidBrush(btnPenColor.BackColor);
                //Setting the width and height some for creating square.
                //Getting the width and Height value from Texitbox(txtShapeSize)
                g.FillRectangle(sb, e.X, e.Y, int.Parse(txtShapeSize.Text), int,Parse(txtShapeSize.text));
                //Setting startPaint and drawSquere value to false for creating one graphic on one click.
                startPaint = false;
                drawSquare = false;
            }
            if (drawRectangle)
            {
                SolidBrush sb = new SolidBrush(btnPenColor, BackColor);
                g.FillRectangle(sb, e.X, e.Y, 2*int.Parse(txtShapeSize.Text));
                startPaint = false;
                drawRectangle = false;
            }
            if (drawCircle)
            {
                SolidBrush sb = new SolidBrush(btnPenColor.BackColor);
                g.FillEllipse(sb, e.X, e.Y, int.Parse(txtShapeSize.Text));
                startPaint = false;
                drawCircle = false;
            }
            */
        }

        Point oldLocation = new Point();

        //Event fired when the mouse pointer is moved over the Panel(pictureBox).
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {

            //test
            using (Graphics g = Graphics.FromImage(bmp)) ;
            {
                g.DrawLine(Pens.Blue, oldLocation, e.Location);
                //新しい位置を保存する
                oldLocation = e.Location;
            }
            pB1.Image = bmp;

            //描画中でない場合は、処理を抜ける
            if (drawFlg == false) return;
            {
                //描画する
                //draw(g.oldLocation, e.Location);
            }

            if(startPaint)
            {
                /*
                //Setting the Pen BackColor and Line whdth
                Pen p = new Pen(btnPenColor.BackColor, float.Parse(cmbPenSize.Text));
                //Drawing the line.
                g.DrawLine(p, new Point(initX ?? e.X, initY ?? e.Y), new Point(e.X, e.Y));
                initX = e.X;
                initY = e.Y;
                */
            }
        }

        //Fired when the mouse pointer is over the pictureBox and mousebutton is released.
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            //描画中を解除する
            drawFlg = false;

            startPaint = false;
            initX = null;
            initY = null;
        }
        /*
         * 
        for (int x xy1.X; x <= xy2.X; x++)
        {
            RectangleF rect = new RectangleF(
                x - (penWidth / 2),
                y - (penWidth / 2),
                penWidth,penWidth);
            g.FillEllipse(brush, rect)
        }
        //Y軸基準で描画
        float x = (float)xy1.X;


        for (int y = xy1.Y; y <=xy2,Y; y++)
            {
            RectangleF rect = new RectangleF(
                x - (penWidth / 2)
                y - (penWhdth / 2)
                penWidth, penWidth);
            g.FillEllipse(Brush, rect);
            x = x + a;
            }
        */

        //Button for Setting pen Color
        private void btnPenColor1_Click(object sender, EventArgs e)
        {
            ColorDialog c = new ColorDialog();
            if(c.ShowDialog()==DialogResult.OK)
            {
                btnPenColor1.BackColor = c.Color;
            }
        }
        //New
        private void newToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //Clearing the graphics from the Panel(pictureBox)
            //g.Clear(pictureBox1.BackColor);
            //Setting the BackColor of pictureBox and btnCanvasColor to white on Clicking New File Menu
            pB1.BackColor = Color.White;
            btnCanvasColor.BackColor = Color.White;
        }
        //Setting the Canvas Color
        private void btnCanvasColor_Click(object sender, EventArgs e)
        {
            ColorDialog c = new ColorDialog();
            if(c.ShowDialog()==DialogResult.OK)
            {
                pB1.BackColor = c.Color;
                btnCanvasColor.BackColor = c.Color;
            }
        }
        private void drawSquare_Click(object sender, EventArgs e)
        {
            //drawSquare = true;
        }

        private void drawRectangle_Click(object sender, EventArgs e)
        {
            //drawRectangle = true;
        }

        private void drawCircle_Click(object sender, EventArgs e)
        {
            //drawCircle = true;
        }
        //Exit under File Menu
        private void newToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            clear ();
        }
        private void clear()
        {
            using (Graphics g = Graphics.FromImage(bmp)) ;
            g.FillRectangle(Brushes.White,new Rectangle(0,0, bmp.Width, bmp.Height));
        }
        private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Image img = Bitmap.FromFile("test.png");
            bmp = new Bitmap(img);
            pB1.Image = bmp;
        }
        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if(MessageBox.Show("Do you want to Exit?","Exit",MessageBoxButtons.YesNo,MessageBoxIcon.Information)==DialogResult.Yes)
            {
                Application.Exit();
            }
        }
        private void saveToolStripMenuItem_Click(object sender, EventArgs e)
        {
            bmp.Save("test.png", ImageFormat.Png);
        }
        //About under Help Menu
        private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //About a = new About();
            //a.ShowDialog();
        }

        //test
        /*
        private void btn1_Click(object sender, EventArgs e)
        {
            using (Graphics g = pB1.CreateGraphics()) ;
            {
                g.DrawLine(Pens.Blue, 100, 100, 300, 200);
                using (Graphics g = Graphics.FromImage(bmp)) ;
                {
                    g.DrawLine(Pens.Blue, 100, 100, 300, 200);
                }
                pB1.Image = bmp;
            }
        }*/
    }
}

 試したこと

サンプルコードを見ながら自分で打ち込む。
一から作り直して試す。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

解決ではない(たぶん)ですが、いくつか気になる点を。

        private void clear()
        {
            using (Graphics g = Graphics.FromImage(bmp)) ;
            g.FillRectangle(Brushes.White,new Rectangle(0,0, bmp.Width, bmp.Height));
        }

このusingで、g は開放されてしまうんじゃないかと
やるなら、

        using (Graphics g = Graphics.FromImage(bmp)){
            g.FillRectangle(Brushes.White,new Rectangle(0,0, bmp.Width, bmp.Height));
        }
とするとかなんとか

んでもひとつ、

        //Button for Setting pen Color
        private void btnPenColor1_Click(object sender, EventArgs e)
        {
            ColorDialog c = new ColorDialog();
            if(c.ShowDialog()==DialogResult.OK)
            {
                btnPenColor1.BackColor = c.Color;
            }
        }

これだと、ColorDialogが残ったままになるので、

            using( ColorDialog c = new ColorDialog()){
                 なんやかや
       }
と、すべきかと

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/23 10:05

    回答ありがとうございます。
    参考にさせていただきます。

    キャンセル

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    6573questions

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