ウインドウプログラムを比較的簡単に作成するためのクラス『WinForm』を提供します。

Dim SFC
Set SFC=CreateObject("SfcMini.tools")
Execute SFC.Include("<WinForm.vbs>")





WinFormクラスには、以下のプロパティがあります。

API
 "user32","kernel32","gdi32"に含まれているAPIを呼び出すことの出来る、SfcMini.DynaCallオブジェクトです。

hWnd
 ウィンドウハンドルです。

CmdShow
 SW_SHOW、SW_MAXIMIZE等で指定される表示状態を設定します。デフォルトは、SW_SHOWです。

WindowClass
 ウィンドウクラス登録時に使用される、WNDCLASSEX構造体です。デフォルトでは次のように設定されています。
With WindowClass
    .cbSize = 48
    .style = 0
    .lpfnWndProc = WP.Address
    .cbClsExtra = 0
    .cbWndExtra = 0
    .hInstance = 0
    .hIcon = 0
    .hCursor = API.LoadCursorA(0,IDC_ARROW)
    .hbrBackground = COLOR_WINDOW
    .lpszMenuName = 0
    .lpszClassName = "Untitled"+hex((timer*90+rnd(1))*256)
    .hIconSm = 0
End With















CreateWindowClass
 ウインドウ作成時に呼び出されるAPI, CreateWindowExの引数を指定するための構造体です。デフォルトでは次のように設定されています。
with CreateWindowClass
    .dwExStyle=0
    .lpClassName=WindowClass.lpszClassName
    .lpWindowName="Untitled"
    .dwStyle=WS_OVERLAPPEDWINDOW
    .x=CW_USEDEFAULT
    .y=CW_USEDEFAULT
    .nWidth=CW_USEDEFAULT
    .nHeight=CW_USEDEFAULT
    .hWndParent=0
    .hMenu=0
    .hInstance=WindowClass.hInstance
    .lpParam=0
end with















Text(hWnd)
 ウィンドウもしくは、ウィンドウに含まれるアイテムのテキストを取得・設定します。hWndには、WinFormクラスオブジェクト・ウィンドウハンドル・アイテムIDのいずれかを指定します。

Caption(hWnd)
 Text(hWnd)と同じ機能です。

WinFormクラスには、以下のパブリックメソッドがあります。

SetFont(FontName,FontSize)
 ウィンドウ及びそこに含まれるアイテムで使用されるフォントを、フォント名とサイズで指定します。

Init
 ウィンドウの初期化を行います。具体的には、ウィンドウクラスの登録を行います。

Show
 ウインドウをCmdShowで示された状態で表示します。

TrackMsg(uMsg, rCode)
 ウインドウプロシージャでトラックされるメッセージと、そのメッセージを処理する際の戻り値を指定します。ここで指定されないメッセージはすべてAPIのDefWindowProcで処理されます。ただし、Initでウィンドウを初期化した時に、デフォルトでWM_DESTROY, WM_COMMAND, WM_CREATEの3つが指定されています。

RegisterEvent(itemID)
 itemIDで示されるIDを持ったアイテムのイベントを処理するようにウインドウプロシージャ(WinFormクラス中のDefaultWndProc)に指令します。

AddControl(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, itemID)
 フォームにアイテムを追加します。lpClassNameには、"BUTTON""LISTBOX"などのアイテムの種類を規定する文字列を、lpWindowNameには"Command1""List1"などのキャプションを、dwStyleにはWS_CHILD, WS_VISIBLE, BS_PUSHBUTTON等の表示形式を、itemIDには、アイテムIDを整数値で、もしくはイベント関数名を文字列で指定します。x, y, nWidth, nHeightでは、縦横の位置と幅を指定します。
 戻り値として、アイテムIDが返ります。

SendMessage(hWnd,Msg,wParam,lParam)
 hWndで示されるアイテム(ハンドルもしくはアイテムIDを指定)にメッセージを送ります。
 戻り値として、APIのSendMessageの戻り値が返ります。

SetWndProc(wndProcName)
 ウィンドウプロシージャを文字列で指定します。デフォルトでは、WinFormクラス中のDefaultWndProcが指定されています。
 戻り値はありません。

GetWndProc
 引数はありません。
 戻り値として、登録されているウインドウプロシージャ名が文字列で返ります。

DefaultWndProc(hWnd,Msg,wParam,lParam)
 WinFormクラスに含まれているデフォルトのウィンドウプロシージャを外部から呼び出したい時に使用します。この関数では、ウィンドウに含まれるアイテム関連の制御(表示・イベントの処理)が行われます。

MsgLoop
 メッセージループです。戻り値として、スクリプトを終了させる時に使用されるべき値が返ります。

CreateWindowEx
DispatchMessage
ShowWindow
UpdateWindow

 これらの関数を利用すると、規定のウインドウプロシージャに対応した状態でAPIが呼び出されます。

サンプルコード

 WinFormクラスを用いてウィンドウプログラムを構築する例です。サンプルプログラムとしてダウンロードファイルに含まれています。

option explicit
Dim SFC
Set SFC=CreateObject("SfcMini.tools")
Execute SFC.Include("<Menu.vbs>")
Execute SFC.Include("<WinForm.vbs>")

Dim Form1,Label1,Command1,Check1,Radio1,Radio2,Text1,List1,Combo1
Set Form1=new WinForm
Label1=Form1.AddControl(0,"STATIC","Label1", _
                 WS_CHILD+WS_VISIBLE+SS_CENTER, _
                 10,10,100,30, "")
Command1=Form1.AddControl(0,"BUTTON","Command1", _
                 WS_CHILD+WS_VISIBLE+BS_PUSHBUTTON, _
                 10,50,100,30, "Command1_Click")
Check1=Form1.AddControl(0,"BUTTON","Check1", _
                 WS_CHILD+WS_VISIBLE+BS_AUTOCHECKBOX, _
                 10,90,100,30, "Other_Click")
Radio1=Form1.AddControl(0,"BUTTON","Radio1", _
                 WS_CHILD+WS_VISIBLE+WS_GROUP+BS_AUTORADIOBUTTON, _
                 10,130,100,30, "Other_Click")
Radio2=Form1.AddControl(0,"BUTTON","Radio2", _
                 WS_CHILD+WS_VISIBLE+BS_AUTORADIOBUTTON, _
                 10,170,100,30, "Other_Click")
Text1=Form1.AddControl(0,"EDIT","Text1", _
                 WS_CHILD+WS_VISIBLE+WS_HSCROLL+WS_VSCROLL+ES_MULTILINE, _
                 10,210,260,100, "Other_Click")
List1=Form1.AddControl(0,"LISTBOX","List1", _
                 WS_CHILD+WS_VISIBLE+LBS_STANDARD, _
                 120,0,150,150,"List1_Click")
Combo1=Form1.AddControl(0,"COMBOBOX","Combo1", _
                 WS_CHILD+WS_VISIBLE+WS_VSCROLL+WS_BORDER+CBS_DROPDOWN, _
                 120,160,150,150,"Combo1_Click")

Dim MenuClass,PopupMenuClass1
set MenuClass=new Menu
set PopupMenuClass1=new PopupMenu
Call MenuClass.AppendPopupMenu(PopupMenuClass1.hMenu,"Menu")
Form1.RegisterEvent PopupMenuClass1.AppendMenu("Command1_Click","Command1")
Call PopupMenuClass1.AppendSeparator
Form1.RegisterEvent PopupMenuClass1.AppendMenu("Menu_Exit","Exit")

Form1.SetFont "MS ゴシック",9
Form1.Init
Call MenuClass.SetMenu(Form1.hWnd)
Form1.Show

'Set Items in Listbox and Combobox
Dim i
for i=1 to 20
  call Form1.SendMessage(List1,LB_ADDSTRING,0,"Data"+cstr(i)+" "+cstr(rnd(1)))
  call Form1.SendMessage(Combo1,CB_ADDSTRING,0,"Data"+cstr(i)+" "+cstr(rnd(1)))
next

'Set Check1 checked
call Form1.SendMessage(Check1,BM_SETCHECK,BST_CHECKED,0)

'Set Radio2 checked
call Form1.SendMessage(Radio2,BM_SETCHECK,BST_CHECKED,0)

wscript.quit(Form1.MsgLoop)

Sub Command1_Click(hwnd,message,wparam,lparam)
  dim T
  T="Text1: "+form1.text(Text1)+vbcrlf
  if BST_CHECKED=Form1.SendMessage(Check1,BM_GETCHECK,0,0) then
    T=T+"Check1: checked"+vbcrlf
  else
    T=T+"Check1: unchecked"+vbcrlf
  end if
  if BST_CHECKED=Form1.SendMessage(Radio1,BM_GETCHECK,0,0) then
    T=T+"Radio1: checked"+vbcrlf
  else
    T=T+"Radio1: unchecked"+vbcrlf
  end if
  msgbox T
  form1.text(form1)="Command1 Clicked"
End Sub

Sub Other_Click(hwnd,message,wparam,lparam)
  form1.caption(form1)=form1.text(LOWORD(wparam))
End Sub

Sub Menu_Exit(hwnd,message,wparam,lparam)
  Call Form1.API.PostQuitMessage(0)
End Sub

Sub List1_Click(hwnd,message,wparam,lparam)
  Dim pos,T,ID
  ID=LOWORD(wparam)
  pos=Form1.SendMessage(ID,LB_GETCURSEL,0,0)
  T=Space(Form1.SendMessage(ID,LB_GETTEXTLEN,0,0)+1)
  call Form1.SendMessage(ID,LB_GETTEXT,pos,T)
  form1.caption(form1)=form1.caption(ID)+": "+T
End Sub

Sub Combo1_Click(hwnd,message,wparam,lparam)
  Dim pos,T,ID
  ID=LOWORD(wparam)
  pos=Form1.SendMessage(ID,CB_GETCURSEL,0,0)
  T=Space(Form1.SendMessage(ID,CB_GETLBTEXTLEN,0,0)+1)
  call Form1.SendMessage(ID,CB_GETLBTEXT,pos,T)
  form1.caption(form1)="Combo1: "+T
End Sub








































































































実行結果
WinForm