今回は、Windows のシステムのプロパティを模倣してみましたので紹介したいと思います。
模倣しているのは一部ですが、ここで学べるのは次の項目です。
- ウィンドウの右上の最小化ボタンと最大化ボタンを非表示し、閉じるボタンのみにすること。
- ウィンドウの左上のアイコンを消す方法。
- ショートカットキーの設定
- OKボタンに常にフォーカスを合わせておくこと。
- タブのテキストをセンターに配置する。
- インプットボックス内のデータの変化に対する通知メッセージの取得。
サンプルコード
サンプルコードの解説
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <ButtonConstants.au3>
#include <StaticConstants.au3>
#include <TabConstants.au3>
#include-once
Global Const $EN_CHANGE = 0x0300
$Gui = GUICreate(" システムのプロパティ" & @CRLF, 545, 670, -1, -1, BitOR($WS_SYSMENU, $WS_CAPTION), $WS_EX_DLGMODALFRAME)
_WinAPI_DestroyIcon(_WinAPI_GetClassLongEx($Gui, $GCL_HICON))
_WinAPI_SetClassLongEx($Gui, $GCL_HICON, 0)
_WinAPI_SetClassLongEx($Gui, $GCL_HICONSM, 0)
GUISetFont(9, 0, 0, "Yu Gothic UI")
; -------------------------------ボタン開始
$OK = GUICtrlCreateButton("OK", 218, 625, 100, 35, $BS_DEFPUSHBUTTON)
GUICtrlSetState(-1, $GUI_FOCUS)
$Cancel = GUICtrlCreateButton("キャンセル", 328, 625, 100, 35)
$Tekiyou = GUICtrlCreateButton("適用(&A)", 438, 625, 100, 35)
GUICtrlSetState(-1, $GUI_DISABLE)
; ------------------------------ボタン終了
; --------------------------------TAB開始
GUICtrlCreateTab(7, 10, 532, 604)
GUICtrlSendMsg(-1, $TCM_SETMINTABWIDTH, 0, 0); タブのテキスト配置をセンターにする
$TabComputer = GUICtrlCreateTabItem("コンピューター名")
GUICtrlCreateIcon("shell32.dll", 16, 25, 60, 40, 40)
GUICtrlCreateLabel("次の情報は、このコンピューターをネットワーク上で識別するために使われます。", 91, 65, 410, 50)
GUICtrlCreateLabel("コンピューターの説明(D):", 25, 140, 170, 25)
$ComputerInput = GUICtrlCreateInput("", 195, 135, 305, 30)
GUICtrlSetState($ComputerInput, $GUI_FOCUS)
GUICtrlCreateLabel('例: "キッチンのコンピューター"、"仕事用コンピューター"', 195, 175, 305, 25)
GUICtrlCreateLabel("フル コンピューター名:", 25, 220, 170, 25)
GUICtrlCreateLabel("ワークグループ:", 25, 260, 170, 25)
GUICtrlCreateLabel("UserName", 195, 220, 170, 25)
GUICtrlCreateLabel("WORKGROUP", 195, 260, 170, 25)
GUICtrlCreateLabel("ドメインまたはワークグループに参加するためのウィザードを" & _
"使用するには [ネットワーク ID] をクリックしてください。", 25, 310, 336, 50)
GUICtrlCreateLabel("コンピューター名を変更したりドメインに参加したりするには" & _
" [変更] をクリックしてください。", 25, 390, 336, 50)
$Nid = GUICtrlCreateButton("ネットワーク ID(&N)...", 375, 310, 130, 35)
$Change = GUICtrlCreateButton("変更(&C)...", 375, 390, 130, 35)
GUICtrlCreateTabItem("ハードウェア")
GUICtrlCreateTabItem("詳細設定")
GUICtrlCreateTabItem("システムの保護")
GUICtrlCreateTabItem("リモート")
GUICtrlCreateTabItem("")
; --------------------------------TAB終了
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $OK
MsgBox(0, "", "OKをクリックしました", 0, $Gui)
Exit
Case $Cancel
MsgBox(0, "", "キャンセルをクリックしました", 0, $Gui)
Exit
Case $Nid
MsgBox(0, "", "「ネットワーク ID(&N)...」をクリックしました", 0, $Gui)
Case $Change
MsgBox(0, "", "「変更(&C)...」をクリックしました", 0, $Gui)
Case $Tekiyou
GUICtrlSetState($Tekiyou, $GUI_DISABLE)
EndSwitch
WEnd
Func WM_COMMAND($hWnd, $Msg, $wParam, $ilParam)
Switch BitAND(0xffff, $wParam)
Case $ComputerInput
If BitShift($wParam, 16) = $EN_CHANGE Then
GUICtrlSetState($Tekiyou, $GUI_ENABLE)
EndIf
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
コードの説明
#include-once
同じファイルを何度もインクルードしないために指定します。
Global Const $EN_CHANGE = 0x0300
グローバル変数の宣言をします。
$EN_CHANGE = 0x0300 は、内容が変更された場合のメッセージコードです。
$Gui = GUICreate(” システムのプロパティ” & @CRLF, 545, 698, -1, -1, BitOR($WS_SYSMENU, $WS_CAPTION), $WS_EX_DLGMODALFRAME)
$WS_SYSMENU = タイトルバーにウィンドウメニューを持つウィンドウを作成します。
$WS_CAPTION = タイトルバーを持つウィンドウを作成します。
スタイルを組み合わせるには BitOr($GUI_SS_DEFAULT_GUI, newstyle,…)というように書きます。
$WS_EX_DLGMODALFRAME = 二重のボーダーを持つウィンドウを作成します。
拡張スタイル $WS_EX_DLGMODALFRAME を指定することでウィンドウ左上のアイコンに変化を加えることができるようになります。
_WinAPI_DestroyIcon(_WinAPI_GetClassLongEx($Gui, $GCL_HICON))
_WinAPI_DestroyIcon = アイコンを破壊し、アイコンが占めていたメモリを解放します。
_WinAPI_GetClassLongEx = 指定されたウィンドウの指定された値を置き換えます。
$GCL_HICON = クラスに関連付けられているアイコンハンドルを取得します。
_WinAPI_SetClassLongEx($Gui, $GCL_HICON, 0)
取得したアイコンハンドルを「0」に置き換えます。
$GCL_HICONSM = クラスに関連付けられている小さなアイコンハンドルを取得します。
取得した小さなアイコンハンドルを「0」に置き換えます。
これでウィンドウ左上のアイコンが消えます。
GUISetFont(9, 0, 0, “Yu Gothic UI”)
ウィンドウ内で使用するフォントを指定します。
$OK = GUICtrlCreateButton(“OK”, 218, 625, 100, 35, $BS_DEFPUSHBUTTON)
$BS_DEFPUSHBUTTON を指定することで、キーボードの Enter を押した時にフォーカスが合っていなくても OK ボタンが押されるようになります。
$Tekiyou = GUICtrlCreateButton(“適用(&A)”, 438, 625, 100, 35)
文字列に「A」ではなく「&A」のように書いておくと、ショートカットキー「Alt+a」を押した時に、このコントロール ID が押されるようになります。
GUICtrlSetState(-1, $GUI_DISABLE)
適用ボタンを無効にしておきます。
GUICtrlCreateTab(7, 10, 532, 604)
GUICtrlSendMsg(-1, $TCM_SETMINTABWIDTH, 0, 0)
メッセージ $TCM_SETMINTABWIDTH をタブに送信することで、タブのテキストがセンターに配置されます。
GUICtrlCreateIcon(“shell32.dll”, 16, 25, 60, 40, 40)
アイコンコントロールを作成します。
「16」がアイコンの名前(番号)です。
shell32.dll は Windows の DLL ファイル(ダイナミックリンクライブラリ)であり、この DLL からアイコンを呼び出します。
$ComputerInput = GUICtrlCreateInput(“”, 220, 135, 280, 30)
GUICtrlSetState($ComputerInput, $GUI_FOCUS)
インプットボックスにフォーカスを合わせておきます。
GUICtrlSetState(-1, $GUI_FOCUS) と書いても構いません。
「-1」とは、1つ前のコントロール ID を意味しますので、インプットボックスを作成したすぐ後に GUICtrlSetState(-1, $GUI_FOCUS) と書けば「-1」はインプットボックスのコントロール ID になります。
GUIRegisterMsg($WM_COMMAND, “WM_COMMAND”)
Windowsメッセージに対してユーザー定義関数を登録します。
WM_COMMAND は、メニューアイテムの選択やコントロールからの通知を取得します。
Case $Tekiyou
GUICtrlSetState($Tekiyou, $GUI_DISABLE)
「適用」ボタンが押されたらボタンを無効にします。
Func WM_COMMAND($hWnd, $Msg, $wParam, $ilParam)
Switch BitAND(0xffff, $wParam)
Case $ComputerInput
If BitShift($wParam, 16) = $EN_CHANGE Then
GUICtrlSetState($Tekiyou, $GUI_ENABLE)
EndIf
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
インプットボックスの通知メッセージを取得します。
If BitShift($wParam, 16) = $EN_CHANGE Then
もしもインプットボックスに変化があったなら
GUICtrlSetState($Tekiyou, $GUI_ENABLE)
「適用」ボタンを有効にします。
EndIf
注意事項
While…WEnd などのループの中にインプットボックスの変化を監視するコードを入れることはできますが、ループの中に何かを判別するようなコードを入れるとプログラムの反応が遅くなります。
できるだけループの中に入れずに、ウィンドウメッセージを利用することをおすすめします。
このサンプルは様々なツールに応用することができますので、是非覚えてください。
コメント