Mono メモ

2017年12月20日

はじめに

Mono による C#/GUI プログラミングのメモ。

セットアップ

Ubuntu 16.04 でのセットアップ。ここ を参考にする。

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
$ echo "deb http://download.mono-project.com/repo/ubuntu xenial main" | sudo tee /etc/apt/sources.list.d/mono-official.list
$ sudo apt-get update
$ sudo apt-get install mono-devel
$ sudo apt-get install monodevelop

MonoDevelop の起動。

$ monodevelop

起動すれば OK。

ウインドウ

ウインドウを表示する。MonoDevelop を起動する。メニュー [ファイル]-[新規]-[ソリューション...] で [その他]-[.NET]-[空のプロジェクト] を選ぶ。[プロジェクト名] を "window" にする。[位置] でディレクトリの作成位置を指定。[作成] を押すと、指定位置に "window" というディレクトリができる。

ツリーには「ソリューション」に「プロジェクト」が1つある状態になっている。プロジェクトのアイコン (ツリーの子のほう) を右クリックして [追加]-[新しいファイル] で [空のクラス] を選び、"Program" という名前で [作成] を押す。

プログラムを以下のように書き換える。

using System;

namespace window
{
	public class Program
	{
		[STAThread]
		private static void Main(string[] args)
		{
		}
	}
}

プロジェクトのアイコンを右クリックし [windows をビルド] を選ぶ (あるいは F7 を押す)。エラーが出なければ OK。

同様にして "Window" というクラスを追加。

ツリーの "参照" を右クリックし、[参照アセンブリの編集] を選択。"System"、"System.Windows.Forms" にチェックを入れて [OK]。

また、プロジェクトのアイコン右クリックし [オプション] を選び、[ビルド]-[一般] の [コード生成]-[コンパイルのターゲット] を "GUI実行可能ファイル" に変更する (こうしないと Windows で起動したときにコマンドプロンプトが表示される)。

コードを以下のようにする。

Window.cs

using System;
using System.Windows.Forms;

namespace window
{
	public class Window : Form
	{
		public Window ()
		{
		}
	}
}

Programs.cs

using System;
using System.Windows.Forms;

namespace window
{
	public class Program
	{
		[STAThread]
		private static void Main(string[] args)
		{
			Application.Run(new Window());
		}
	}
}

実行 (F5) してウインドウが表示されれば OK。

タイトルの設定、サイズの指定

this.Text = "Window";
this.Width = 640;
this.Height = 480;

ウインドウを画面中央に表示

this.StartPosition = FormStartPosition.CenterScreen;

マウス

マウスイベントを扱う。

新規で "mouse" ソリューションを作成。プロジェクトに "window" の 2 つのファイルを追加する (Copy を選ぶ)。namespace を "mouse" に変更する。

ツリーの "参照" を右クリックし、[参照アセンブリの編集] を選択。"System"、"System.Windows.Forms"、"System.Drawing" にチェックを入れる。

Window.cs

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

namespace mouse
{
	public class Window : Form
	{
		Label label1;
		Label label2;
		Label label3;

		public Window ()
		{
			this.Text = "mouse";
			this.Width = 640;
			this.Height = 480;

			this.StartPosition = FormStartPosition.CenterScreen;

			this.label1 = new Label ();
			this.label1.Parent = this;
			this.label1.Location = new Point(0, 0);
			this.label1.AutoSize = true;
			this.label1.Text = "Point:";

			this.label2 = new Label ();
			this.label2.Parent = this;
			this.label2.Location = new Point(0, 15);
			this.label2.AutoSize = true;
			this.label2.Text = "Button:";

			this.label3 = new Label ();
			this.label3.Parent = this;
			this.label3.Location = new Point(0, 30);
			this.label3.AutoSize = true;
			this.label3.Text = "Wheel:";

			this.MouseMove += new MouseEventHandler(this.mouseMove);
			this.MouseDown += new MouseEventHandler(this.mouseDown);
			this.MouseUp += new MouseEventHandler(this.mouseUp);
			this.MouseWheel += new MouseEventHandler(this.mouseWheel);
		}

		void mouseMove(object sender, MouseEventArgs e) {
			this.label1.Text = String.Format("Point: ({0}, {1})", e.X, e.Y);
			this.label3.Text = "Wheel:";
		}

		void mouseDown(object sender, MouseEventArgs e) {
			string eventString = null;

			switch (e.Button) {
			case MouseButtons.Left:
				eventString = "Left";
				break;
			case MouseButtons.Right:
				eventString = "Right";
				break;
			case MouseButtons.Middle:
				eventString = "Middle";
				break;
			case MouseButtons.None:
			default:
				break;
			}

			this.label2.Text = "Button: " + eventString;
			this.label3.Text = "Wheel:";
		}

		void mouseUp(object sender, MouseEventArgs e) {
			this.label2.Text = "Button:";
		}

		void mouseWheel(object sender, MouseEventArgs e) {
			this.label3.Text = String.Format ("Wheel: {0}", e.Delta);
		}
	}
}

マウスイベントに対してメソッドを登録して、ラベルに情報を表示している。