PaintBoxによる直接描画

前回はDataGridViewで表示していたが、自分の用途には多機能すぎる気がしたので、PaintBoxにより描画の面倒を自前で全部見ることにした。

とりあえず表示だけならこんな感じ。

DataGridView使うより楽な気がする。描画でSolidBrushとかをちゃんとdisposeすべきかとか、Fontとかを毎回newするのは遅くなるかとかはとりあえず気にしないことにする。

マウスやキーボードイベントを取れれば、UIまわりはすぐできそう。

ソースは以下の通り。

using System;
using System.Collections;
using System.IO;
using System.Drawing;
using System.Windows.Forms;

namespace WinApp {
  public class TestForm : Form {

    PictureBox pbox = new PictureBox();
    Color DefaultColor = ColorTranslator.FromHtml("#E3FFF3");
    public TestForm() {
      ClientSize = new Size(600, 400);
      Text = "TestForm";
      Controls.Add(pbox);
      pbox.Dock = DockStyle.Fill;
      pbox.BorderStyle = BorderStyle.Fixed3D;
      Load += new EventHandler(TestForm_Load);
    }

    private void TestForm_Load(object sender, System.EventArgs e) {
      Draw();
    }

    void Draw() {
      pbox.Image = new Bitmap(pbox.Width,pbox.Height);
      Graphics g = Graphics.FromImage(pbox.Image);
      Font f = new Font("MS ゴシック",12,FontStyle.Regular);
      SolidBrush brush_dir = new SolidBrush(Color.Blue);
      SolidBrush brush_file = new SolidBrush(Color.Black);
      g.FillRectangle(new SolidBrush(DefaultColor),0,0,pbox.Width,pbox.Height);
      string cdir = Directory.GetCurrentDirectory();
      ArrayList dirs = new ArrayList();
      dirs.Add(" <.> ");
      dirs.Add(" <..> ");
      foreach (string dir in Directory.GetDirectories(cdir)) {
         String s = " <" + Path.GetFileName(dir) + "> ";
        dirs.Add(s);
      }
      string [] files = Directory.GetFiles(cdir);
      int i=0;
      foreach (string dir in dirs) {
         g.DrawString(dir,f,brush_dir,0,i*14);
         i++;
      }
      foreach (string file in files) {
         String s = " " + Path.GetFileName(file) + " ";
         g.DrawString(s,f,brush_file,0,i*14);
         i++;
      }
    }

    [STAThread]
    static void Main() {
      Application.Run(new TestForm());
    }
  }
}