ラベル Form の投稿を表示しています。 すべての投稿を表示
ラベル Form の投稿を表示しています。 すべての投稿を表示

2018年2月23日金曜日

はじめてのWindows Formアプリケーション

今回から、WindowsのFormアプリの学習に入ります。

 Formアプリケーションは、Windows上でウインドウを持つアプリケーションのことです。

昔から持っているイメージは、プログラミングで使う言語の習得よりも、Windowsで走るプログラムのお作法を勉強する方が大変、MFCクラスライブラリの仕様を勉強しなきゃいけなくて大変、っていうもの。

以前Visual C++を買った時には、その辺の敷居が高すぎて、どうにもこうにも学習する気にならなかったものでした。

Formアプリケーション


下記が学習で打ち込んだリストです。Formアプリケーションというと、Visual Studioでデザイナーを使ってウインドウの設計をして・・・・と、普通は考えると思います。

しかし、ウインドウを表示してその中に文字列を表示させる、という程度の動作であれば、デザイナーを使ってウインドウの設計をする、という作業は不要です。下記リストをテキストエディタで打ち込んで、sample.csというファイル名で保存し、Windowsのコマンドプロンプトから

csc sample.cs

と入力すればコンパイル可能で、そのままコマンドプロンプトからsample.exeと入力すればウインドウが現れます。

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

namespace MyFrmApp
{
    public class MyForm : Form
    {

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

        public MyForm()
        {
            Label label = new Label();
            label.Text = "Welcome to C#!";
            label.Font = new Font("geneva", 18, FontStyle.Regular);
            label.Height = 30;
            label.Width = 300;
            this.Controls.Add(label);
            this.Width = 300;
            this.Height = 200;

        }
    }
}

起動させると、このようなウインドウが出ると思います。

なお、このソースは、Macではライブラリの違いからコンパイルできません。Windowsの.NET Framework環境固有のライブラリを使用しているからです。

さて、今回のプログラムですが、新しい単語が幾つか出てきています。


これらは、System.DrawingとSystem.Windows.Forms名前空間にあるクラスを参照するために記述しています。それぞれの名前空間にどんなものが定義してあるかは、それぞれに付いているリンク先に記述があります。

今回のプログラムで具体的に何をするために記述しているのかというと、System.DrawingはFontクラスを使うために記述しているようです。また、System.Windows.Formsは、Formクラス、Labelクラスを使用する為ですね。


  • [STAThread]


これは、これが書かれたメソッドがシングルスレッドで動くようにする為の属性指定です。.NET Frameworkで動くウインドウは、原則としてシングルスレッドで動くように設計されているとのこと。

この属性指定を行う事で、ウインドウの中で呼び出される処理は、全てウインドウが動いているスレッドの中で処理される、ということだそうです。

参考文献:初心者のためのC#プログラミング入門

このプログラムの仕掛けは、

  • MyFormクラスをFormクラスの派生クラスとして定義
  • MainメソッドでMyFormクラスのインスタンスを生成して、そのインスタンスを起動
  • MyFormクラスのインスタンスが生成されるときに、コンストラクタとしてpublic MyForm()が起動し、その中で
     Labelクラスのインスタンスを生成(名前:label)
     生成したlabelに
      Text属性
      Font属性(これは、Fontクラスのインスタンスを生成して当てる)
      Height属性
      Width属性
     を設定
  • このlabelオブジェクトを、MyFormのControl.Addメソッドを使ってMyFormの上に置く
  • MyFormのWidth属性、Height属性を設定

ということになります。

というわけで、今回はここまで。