Guiの作成について

Guiの作成の例その2

ソースコードの説明の続き

前のページの続きでカウントする奴のスクリプトの説明をします。

ボタンを押した時の処理

G_subroutine1.trr
if( ps_soundFlag ){
    SoundPlay , %ps_soundFile%
}
ps_numValue++
F_setControl(51, "ps_countText" , ps_numValue)
%--

1 を足した数字を表示させるだけの処理です。

ps_soundFlag が音を鳴らすかどうかの変数です。
これが True の時に音を鳴らすようにしています。

ps_numValue がカウントしている数字の変数です。
この変数に 1 を足して表示している数字を上書きします。

F_setControl(51, "ps_countText" , ps_numValue)

これが、数字が記入してあるコントロールの数を変更する処理です。
TextRunRun の関数を使っています。

GuiControlAHKコマンド を使った場合と同じ動作をします。

GuiControl , 51: , ps_countText , %ps_numValue%

としても同じです。

1つ減らす方のボタン

G_subroutine2.trr
if( ps_numValue > 0) {
    if( ps_soundFlag ){
        SoundPlay , %ps_soundFile%
    }
    ps_numValue--
    F_setControl(51, "ps_countText", ps_numValue)
}
%--

ー(H) のボタンを押した時の処理です。
1 を引いた数を表示させる処理です。

こちらは ps_numValue の変数の値が 0 より多い場合の時のみ数を引くようになっています。

それ以外は、足すか引くかの違いだけで、
+(K) のボタンの処理と同じ内容です。

以上

カウントするやつのスクリプトは以上のようなものになります。

G_subroutine1
51GuiClose
などを使うことで、簡易的なGuiなら TextRunRun上で作る事ができると思います。

オマケ要素

まだ説明していないスクリプトがありますが、
それらはオマケとして追加した右クリックメニューに関することです。

画像

このウインドウ内を右クリックするとメニューが表示されて、オマケ要素を扱えるようになっています。

ここから先はその説明になります。

右クリックメニュー

1_ps_start.trr のスクリプトの中に、以下の様な記述があったと思います。

; 右クリックのメニュー
Menu , ps_RClick, Add, 常に最前面(&T), G_subroutine3
Menu , ps_RClick, Add, 音を鳴らす(&N), G_subroutine4
Menu , ps_RClick, Add
Menu , ps_RClick, Add, キャンセル(&C), G_subroutine5
Menu , ps_RClick, Check, 常に最前面(&T)
Menu , ps_RClick, Check, 音を鳴らす(&N)

この部分がメニューを作っている個所です。

常に最前面(&T) が指定された場合は G_subroutine3 のサブルーチンが実行され、
音を鳴らす(&N) が指定された場合は G_subroutine4 のサブルーチンが実行されるようになっています。

キャンセル(&C) が指定された場合は G_subroutine5 のサブルーチンが実行されるようになっています。
ここでは、 G_subroutine5アイテムをあえて作らないか、スクリプトがカラのアイテムを作る事で何もしない動作を実現します。

51GuiContextMenu.trr
Menu , ps_RClick, Show, %A_GuiX% , %A_GuiY%

これが右クリックした時にメニューを表示するスクリプトです。

51GuiContextMenu の名前の アイテムを作る事で 51 の番号で作ったGuiが右クリックされた時の動作を指定できます。

常に最前面にするかどうか

G_subroutine3.trr
if( ps_alwayTopFlag ){
    ps_alwayTopFlag := False
    Gui , 51:-AlwaysOnTop
    Menu , ps_RClick, Uncheck, 常に最前面(&T)
} else {
    ps_alwayTopFlag := True
    Gui , 51:+AlwaysOnTop
    Menu , ps_RClick, Check, 常に最前面(&T)
}
%--

このスクリプトが 常に最前面(&T) のメニューを操作し、
ウインドウが最前面で固定されるかどうかを操作したものです。

音を鳴らすかどうか

G_subroutine4.trr
if( ps_soundFlag ){
    ps_soundFlag := False
    Menu , ps_RClick, Uncheck, 音を鳴らす(&N)
} else {
    ps_soundFlag := True
    Menu , ps_RClick, Check, 音を鳴らす(&N)
}
%--

このスクリプトが 音を鳴らす(&N) のメニューを操作し、
音を鳴らすかどうかを決める ps_soundFlag の変数の値を変えたものです。

G_subroutine1.trrG_subroutine2.trr のスクリプトを見ると、 ps_soundFlag の変数によって音が鳴るかどうかを指定している事が分かります。

オマケも含めた起動時のスクリプト

オマケ要素に関しては以上のようなところです。
さてここでオマケ要素も含めた
「使用できるようにする処理」を挙げます。

1_ps_start.trr
; 変数の宣言
global ps_countText = 0
global ps_soundFile := A_ScriptDir  . "\katikati.wav"
global ps_soundFlag := True
global ps_winTitle := "カウントGui"
global ps_alwayTopFlag := True
global ps_numValue = 0
; Guiを作る
ps_guiMake
; 右クリックのメニュー
Menu , ps_RClick, Add, 常に最前面(&T), G_subroutine3
Menu , ps_RClick, Add, 音を鳴らす(&N), G_subroutine4
Menu , ps_RClick, Add
Menu , ps_RClick, Add, キャンセル(&C), G_subroutine5
Menu , ps_RClick, Check, 常に最前面(&T)
Menu , ps_RClick, Check, 音を鳴らす(&N)
; 表示して、半透明にする
Gui , 51:Show
WinSet , Transparent, 180, %ps_winTitle%
%--

このスクリプトを実行する事で、簡易バードウォッチャーが使えるようになります。

今名付けましたが…

このスクリプトでは、

  1. グローバル変数の宣言
  2. Guiを作る ps_guiMakeアイテムの実行
  3. 右クリックメニューを作る
  4. さらにオマケでウインドウを半透明にする

ということをしています。

このスクリプトを実行する事でこの簡易バードウォッチャーが使えるようになりますが、
グローバル変数の宣言
Guiの作成
メニューの作成
を行っている以上、一度きりしか実行しないように気をつけなければなりません。

特に Guiの作成メニューの作成2回実行してしまうと、エラーで止まってしまいます。

ですのでこのスクリプトの アイテム起動時に実行するアイテム として扱う事を勧めます。

fromFileNamestartup フォルダの中に
1_ps_start という名のフォルダでも作るなどすればよいと思います。

起動時に実行すれば、そのときにこのウインドウが表示されるようにしています。

なお、このウインドウを一度閉じた後にまた表示させたい場合は、
Gui , 51:Show&guiShow 51 といったものを使って表示します。

ストックにでも記入しておけば、
Ctrl+[数字] のキーで使用できますし、

キーを使って表示する場合は、

&hotkeyOnTextNewFromCommand +^!b "Gui , 51:Show %--"

このようなスクリプトを 1_ps_start.trr の中に記述しておけば、
テキスト上から Ctrl+Alt+Shift+B のキーを押して表示できます。

最後に

AutoHotkey なので、Guiを作るのが比較的に楽なのと、
fromFileName を使えば、作った後に必要がなくなったら省いて、
いる時になったら再利用することがしやすいのではないかと思います。

今回でいうなら pushCounter のフォルダをどこかに移動しておき、
いる時になったらまた fromFileName のフォルダ内に加えればよいだけです。

説明が大まか過ぎたかもしれませんが、 AutoHotkey とほとんど同じスクリプトで作成できる事が確認できるのではないかと思います。