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

8-1-2.コマンドラインからC#
「ラブライブ!」TVアニメ1期 アニメーションPV集 前編【スクスタリリース記念!】

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

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

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

takk@deb8:~/Desktop$ cat -n test.cs
     1  using System;
     
     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;
 
 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  }
maru 4

コメント

  1. […] 「ペンタブ初心者用のまる練習用ツールを作る(その4)」の続きです。 「ペンタブ初心者用のまる練習用ツールを作る(その4)」までは、Windows.Formsを使ってましたが、せっかくDXライブラリを使い始めたので、DXライブラリを使用するプログラムに変えてみます。 […]

タイトルとURLをコピーしました