<ライブラリ>
WinForm.vbs
ウインドウプログラムを比較的簡単に作成するためのクラス『WinForm』を提供します。
WinFormクラスには、以下のプロパティがあります。
API
"user32","kernel32","gdi32"に含まれているAPIを呼び出すことの出来る、SfcMini.DynaCallオブジェクトです。
hWnd
ウィンドウハンドルです。
CmdShow
SW_SHOW、SW_MAXIMIZE等で指定される表示状態を設定します。デフォルトは、SW_SHOWです。
WindowClass
ウィンドウクラス登録時に使用される、WNDCLASSEX構造体です。デフォルトでは次のように設定されています。
CreateWindowClass
ウインドウ作成時に呼び出されるAPI, CreateWindowExの引数を指定するための構造体です。デフォルトでは次のように設定されています。
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クラスを用いてウィンドウプログラムを構築する例です。サンプルプログラムとしてダウンロードファイルに含まれています。
実行結果
Dim SFC
Set SFC=CreateObject("SfcMini.tools")
Execute SFC.Include("<WinForm.vbs>")
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
.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
.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
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
実行結果
