ペンタブ初心者用のまる練習用ツールを作る(その4)


アニメ『ラブライブ!』
ケロロ軍曹→ケロロのように、一作目が必ずしも短いタイトルではないと思ってたので、あまり疑ってなかったのですが、サンシャインに、μ’s(ミューズ)というグループ名が出てきたので、もしや! と思い、サンシャインではなく、ラブライブ!が一作目なんだとようやく分かりました。。
ラブライブ!より先に、サンシャイン!を見てしまった。まあ、途中で気づいたので、取り戻せます。

本ブログで作っている「まる訓練ツール」(今命名しました)は、模範画像が一枚だけですので、複数枚表示できるように修正します。
マウスアップ毎に以下の3枚の画像を入れ替えていくツールにしてみます。

まずは、C#でディレクトリ内のファイルを取得する方法から。

takk@deb8:~/Desktop$ cat -n test.cs
     1	using System;
     2	
     3	class Test {
     4	    [STAThread] public static void Main() {
     5	        string[] files = System.IO.Directory.GetFiles(
     6	        @"./", "*", System.IO.SearchOption.AllDirectories);
     7	        foreach(string m in files) {
     8	            Console.WriteLine("[{0}]",m);
     9	        }   
    10	    }
    11	}

Windowsで動かす場合は、csc.exeがあるディレクトリを探して、パスを通して、ビルドして、実行。

C:\Users\takk>dir C:\Windows /b/s | findstr csc.exe$
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe
C:\Users\takk>set PATH=%PATH%;C:\Windows\Microsoft.NET\Framework\v4.0.30319\
C:\Users\takk>csc test.cs
Microsoft (R) Visual C# Compiler Version 4.0.30319.36366
for Microsoft (R) .NET Framework 4.5
Copyright (C) Microsoft Corporation. All rights reserved.


C:\Users\takk>test

Linuxの場合は、monoをインストールしてから、mono プログラム名.exeで実行できます。

takk@deb8:~/Desktop$ sudo apt-get install mono-devel mono-mcs 
takk@deb8:~/Desktop$ mcs test.cs
takk@deb8:~/Desktop$ ls
test.cs  test.exe
takk@deb8:~/Desktop$ 
takk@deb8:~/Desktop$ touch a b c
takk@deb8:~/Desktop$ mono test.exe
[./a]
[./b]
[./c]
[./test.cs]
[./test.exe]
takk@deb8:~/Desktop$ 

ディレクトリのファイルを取得するプログラムを、まる訓練ツールに組み込みます。
まず、必要な変数。画像数は可変なので、配列にしておきます。また、現在どの画像を表示しているかのインデックスとしてfile_noという変数も用意しました。

     7	    Image[] img;
     8	    string[] files;
     9	    int file_no = 0;

画像ファイルの読み込みと、img変数へのセットです。

    19	        files = System.IO.Directory.GetFiles(
    20	        @"img", "*.png", System.IO.SearchOption.AllDirectories);
    21	        img = new Image[files.Length];
    22	        foreach(string m in files) {
    23	            img[file_no++]=Image.FromFile(m);
    24	        }   
    25	        file_no=0;

タイマ満了した時に、画像を切り替えしますので、画像番号の上限チェックしつつインクリメントします。

    68	    void OnTimer(object sender, EventArgs e){
    69	        t.Enabled = false;
    70	        if(++file_no >= files.Length){
    71	            file_no = 0;
    72	        }
    73	        pb1.Image = img[file_no];
    74	        pb1.Invalidate();
    75	        Graphics g = Graphics.FromImage(bmp);
    76	        g.Clear(Color.Transparent);
    77	        pb2.Invalidate();
    78	        g.Dispose();
    79	    }

全プログラムです。

     1	using System;
     2	using System.Drawing;
     3	using System.Windows.Forms;
     4	
     5	class Test : Form
     6	{
     7	    Image[] img;
     8	    string[] files;
     9	    int file_no = 0;
    10	    PictureBox pb1 = new PictureBox();
    11	    PictureBox pb2 = new PictureBox();
    12	    Bitmap bmp = new Bitmap(640,480);
    13	    bool pen = false;
    14	    Timer t;
    15	
    16	    Test()
    17	    {
    18	
    19	        files = System.IO.Directory.GetFiles(
    20	        @"img", "*.png", System.IO.SearchOption.AllDirectories);
    21	        img = new Image[files.Length];
    22	        foreach(string m in files) {
    23	            img[file_no++]=Image.FromFile(m);
    24	        }   
    25	        file_no=0;
    26	
    27	        this.Text = "目を描く練習";
    28	        this.Size = new Size(img[0].Width+40,img[0].Height+40);
    29	
    30	        pb1.Dock = DockStyle.Fill;
    31	        pb1.Image = img[file_no];
    32	        pb1.BackColor = Color.Transparent;
    33	
    34	        pb2.Dock = DockStyle.Fill;
    35	        pb2.BackColor = Color.Transparent;
    36	        pb2.Image = bmp;
    37	
    38	        pb2.MouseDown += new MouseEventHandler(MouseDown);
    39	        pb2.MouseMove += new MouseEventHandler(MouseMove);
    40	        pb2.MouseUp += new MouseEventHandler(MouseUp);
    41	
    42	        Controls.Add(pb1);
    43	        pb1.Controls.Add(pb2);
    44	
    45	        t = new Timer();
    46	        t.Interval = 500;
    47	        t.Tick += new EventHandler(OnTimer);
    48	    }
    49	    void DrawPen(int x, int y){
    50	        Graphics g = Graphics.FromImage(bmp);
    51	        Rectangle r = new Rectangle(x-2, y-2, 5, 5);
    52	        g.FillEllipse(Brushes.Black, r);
    53	        pb2.Invalidate();
    54	        g.Dispose();
    55	    }
    56	    new void MouseDown(object sender, MouseEventArgs e){
    57	        pen = true;
    58	    }
    59	    new void MouseMove(object sender, MouseEventArgs e){
    60	        if(pen == true){
    61	            DrawPen(e.X, e.Y);
    62	        }
    63	    }
    64	    new void MouseUp(object sender, MouseEventArgs e){
    65	        pen = false;
    66	        t.Enabled = true;
    67	    }
    68	    void OnTimer(object sender, EventArgs e){
    69	        t.Enabled = false;
    70	        if(++file_no >= files.Length){
    71	            file_no = 0;
    72	        }
    73	        pb1.Image = img[file_no];
    74	        pb1.Invalidate();
    75	        Graphics g = Graphics.FromImage(bmp);
    76	        g.Clear(Color.Transparent);
    77	        pb2.Invalidate();
    78	        g.Dispose();
    79	    }
    80	    [STAThread]
    81	    public static void Main()
    82	    {
    83	        Application.Run(new Test());
    84	    }
    85	}

One response to “ペンタブ初心者用のまる練習用ツールを作る(その4)

  1. Pingback: ペンタブ初心者用のまる練習用ツールを作る(その5) | コマンドの達人

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA