ウィンドウの作成
タイトルのみのウィンドウを作成します。
Global Const $GUI_EVENT_CLOSE = -3 ; ウィンドウを閉じるイベントの値
GUICreate(" タイトル ") ; ディスプレイの中央にGUI ウィンドウを作成します。
GUISetState(@SW_SHOW) ; GUI ウィンドウを表示します。
While 1
$msg = GUIGetMsg() ; ウィンドウ上で起こっているイベントを取得します。
If $msg = $GUI_EVENT_CLOSE Then ExitLoop ; ウィンドウの閉じるボタンが押されたら ExitLoop で While ループを抜けます。
WEnd
ウィンドウ上には普段使っている Windows の各ウィンドウのように、コントロール(ボタン、インプットボックス等)を作成することができます。
ユーザーがウィンドウに対して何かをするたびにイベントが発生します。
これらのイベントは、ループの中で GUIGetMsg 関数から取得、またはイベントモードで取得し、取得されたイベントに対してどのような動作をするかをプログラミングしていきます。
ウィンドウメッセージ
メッセージループモード
Global Const $GUI_EVENT_CLOSE = -3
GUICreate(" ウィンドウ ")
$Input = GUICtrlCreateInput("1111", 10, 35, 300, 20)
$btn = GUICtrlCreateButton(" インプットボックスの値を取得 ", 40, 75, 200, 20)
GUISetState(@SW_SHOW)
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg = $btn
$D = GUICtrlRead($Input)
MsgBox(0, "", " インプットボックスの値: " & $D)
EndSelect
WEnd
無限ループの中で常にウィンドウに対して起こっているイベント情報をチェックしています。
上記のコードは、ウィンドウを閉じるイベントが発生した場合、ループを抜け、ボタン($btn)が押された場合、GUICtrlRead 関数でインプットボックス内のデータを読み取り、メッセージボックスを表示するというコードです。
メッセージループモードは、プログラムを理解しやすいモードです。
イベントモード
Global Const $GUI_EVENT_CLOSE = -3
Opt("GUIOnEventMode", 1)
GUICreate(" ウィンドウ ")
GUISetOnEvent($GUI_EVENT_CLOSE, "main")
$Input = GUICtrlCreateInput("1111", 10, 35, 300, 20)
$btn = GUICtrlCreateButton("インプットボックスの値を取得", 40, 75, 200, 20)
GUICtrlSetOnEvent($btn, "main")
GUISetState(@SW_SHOW)
While 1
GUISetBkColor(RandomColor())
Sleep(3000)
WEnd
Func main()
Switch @GUI_CtrlId
Case $GUI_EVENT_CLOSE
Exit
Case $btn
$D = GUICtrlRead($Input)
MsgBox(0, " インプットボックスの値: ", $D)
EndSwitch
EndFunc ;==>main
Func RandomColor()
Return "0x" & Hex(Random(0, 255, 1), 2) & Hex(Random(0, 255, 1), 2) & Hex(Random(0, 255, 1), 2)
EndFunc ;==>RandomColor
イベントモードを使用するには、Opt(“GUIOnEventMode”, 1) を追加する必要があります。
さらに GUISetOnEvent 関数でシステムボタンがクリックされた際に呼ばれるユーザー定義関数を定義します。
main()関数を見てみましょう。
マクロ @GUI_CtrlId は、最後にクリックしたGUI コントロールのIDです。(イベント関数でのみ有効)
上記のコードを見るとわかるように、イベントモードでは、ウィンドウにイベントが起きた時のみにイベントに対しての処理を行っています。
さらに、無限ループ内で別の処理ができ、イベントに対しての遅延も発生しないのがイベントモードの良い所です。
※メッセージループモードでメインループ内に Sleep を入れた場合、ウィンドウメッセージは遅延されるか、または応答しません。
メッセージループモードとイベントモードは、状況により使い分けましょう。
コメント