A#とVisualStudio2005による.NETプログラミング・GDI+とその後

というわけで、GDI+。

Main_Form.ads
with MSSyst.Windows.Forms.Form;
with MSSyst.Windows.Forms.Button;
with MSSyst.Object;
with MSSyst.EventArgs;
with MSSyst.Windows.Forms.PaintEventArgs;

package Main_Form is
    type Typ is new MSSyst.Windows.Forms.Form.Typ with private;
    type Ref is access all Typ'Class;

    function new_Main_Form(This : Ref := null) return Ref;
    pragma MSIL_Constructor(new_Main_Form);

    procedure On_Paint(This : Ref; Object : MSSyst.Object.Ref; E : MSSyst.Windows.Forms.PaintEventArgs.Ref);
    procedure Exit_k(This : Ref; Object : MSSyst.Object.Ref; E : MSSyst.EventArgs.Ref);

private
    type Typ is new MSSyst.Windows.Forms.Form.Typ with record
        Close_Button : MSSyst.Windows.Forms.Button.Ref;
    end record;
end Main_Form;
Main_Form.adb
with MSSyst.String;
use type MSSyst.String.Ref;
with MSSyst.EventHandler;
with MSSyst.Windows.Forms.PaintEventHandler;
with Mssyst.Windows.Forms.Application;
with MSSyst.Windows.Forms.Control.ControlCollection;
with MSSyst.Drawing.Graphics;
with MSSyst.Drawing.Point;
with Mssyst.Drawing.Size;
with MSSyst.Drawing.Color;
with MSSyst.Drawing.Graphics;
with MSSyst.Drawing.GraphicsUnit;
with MSSyst.Drawing.Font;
with MSSyst.Drawing.Brushes;
with MSSyst.Drawing.StringFormat;
with MSSyst.Windows.Forms.FormBorderStyle;
with MSSyst.Windows.Forms.FormWindowState;

package body Main_Form is
    function new_Main_Form(This : Ref := null) return Ref is
        Super : MSSyst.Windows.Forms.Form.Ref := MSSyst.Windows.Forms.Form.new_Form(MSSyst.Windows.Forms.Form.Ref(This));
    begin
        This.add_Paint(Mssyst.Windows.Forms.PaintEventHandler.new_PaintEventHandler(object => This, method => Main_Form.On_Paint'Address));

        This.set_Text("Steady Talk");
        This.set_BackColor(MSSyst.Drawing.Color.get_Orange);
        This.set_Opacity(0.90);
        This.set_FormBorderStyle(MSSyst.Windows.Forms.FormBorderStyle.None);
        This.set_WindowState(MSSyst.Windows.Forms.FormWindowState.Maximized);

        return This;
    end;

    procedure On_Paint(This : Ref; Object : MSSyst.Object.Ref; E : MSSyst.Windows.Forms.PaintEventArgs.Ref) is
        G : access Mssyst.Drawing.Graphics.Typ'Class;
    begin
        This.Close_Button := Mssyst.Windows.Forms.Button.new_Button;
        This.Close_Button.set_Left(This.get_Right - 70);
        This.Close_Button.set_Top(This.get_Bottom - 33);
        This.Close_Button.set_Name("close");
        This.Close_Button.set_Size(MSSyst.Drawing.Size.new_Size(60, 23));
        This.Close_Button.set_TabIndex(1);
        This.Close_Button.set_Text("&Close");
        This.Close_Button.set_UseVisualStyleBackColor(True);
        This.Close_Button.add_Click(Mssyst.EventHandler.new_EventHandler(object => This, method => Main_Form.Exit_k'Address));
        MSSyst.Windows.Forms.Control.ControlCollection.Add(This.get_Controls, This.Close_Button);

        G := E.get_Graphics;
        G.FillRectangle(
            Mssyst.Drawing.Brushes.get_DarkRed,
            This.get_Left + 10,
            This.get_Top + 10,
            This.get_Right - 20,
            80);
        G.DrawString(
            s => "Steady Talk",
            font => MSSyst.Drawing.Font.new_Font(
            familyName => "CozGoStd-Heavy",
            emSize => 21.0),        
            brush => MSSyst.Drawing.Brushes.get_Black,
            format => MSSyst.Drawing.StringFormat.new_StringFormat,
            x => 20.0,
            y => 20.0);
        G.dispose;
    end On_Paint;

    procedure Exit_k(This : Ref; Object : MSSyst.Object.Ref; E : MSSyst.EventArgs.Ref) is
        use type Mssyst.String.Ref;
    begin
        Mssyst.Windows.Forms.Application.Exit_k;
    end Exit_k;
end Main_Form;

基本的には難しいことはない。

よく見ると、A#にはOnEvent系のメソッドが一切定義されていないので、オーバーライドできない。なので、OnPaintなども自分でイベントハンドラを登録する必要がある。

さて、どうもソースコードに日本語をハードコーディングすると文字化けするらしい。ファイルがShift-JISなのがそもそも怪しい。どうしたものかな。うーん。

さらに言えば、なんとなくFontはやはり変な気がする。コンストラクタ次第ではクラッシュしないようなのだが、書体が変わらない。