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はやはり変な気がする。コンストラクタ次第ではクラッシュしないようなのだが、書体が変わらない。