マウス操作のためのウインドウに追加する
追加するランチャー。その6
右クリックメニュー
登録した区画を右クリックすると、
その区画を押した時に動作するスクリプトを確認したり、
その区画を削除したりできるようにします。
最初の時点で既に右クリックメニューを作成していたりします。
Guiを作るための
start2_makeGui52.trr
の下にあるスクリプトがそれです。
; カッコは全角文字。半角だと、() のネストに対応できない問題でひっかかる
Menu , menu52, Add, 削除する(&D), G_subroutine53
Menu , menu52, Add, 内容(&N), G_subroutine53
メニューを作るスクリプトには、
G_subroutine53
を指定しているのが分かると思います。
このサブルーチンで動作するようにしています。
AHK は、 [指定した名前]ContextMenu の名前のサブルーチンが Guiで右クリックした時に動作するサブルーチンです。
TRRでは、 52 のGuiの番号を使った時は、 52GuiContextMenu の アイテム が右クリックした時に動作するものになります。
以下にスクリプトを挙げます。
if(A_GuiControl != ""){
exp52_rightClickControl = %A_GuiControl%
Menu, menu52, Show, %A_GuiX%, %A_GuiY%
}
Gui右クリックされた時、
A_GuiControl
の変数に、右クリックしたコントロール変数の名前が格納されます。
コントロール変数の名前が存在しているのなら、
exp52_rightClickControl
の変数をこの後使うので、その変数にコントロール変数の名前を代入させます。
そして、メニューをマウスの位置で表示させる様にしています。
メニューが押された時に動作するアイテムのスクリプトを以下に挙げます。
if( exp52_rightClickControl == "" ){
return
}
if(A_ThisMenuItem == "削除する(&D)"){
%exp52_rightClickControl%_script =
%exp52_rightClickControl%_type =
%exp52_rightClickControl%_text =
%exp52_rightClickControl%_img =
; セーブ時にファイルを削除しているからいらない
; IniDelete, %exp52_iniFile%, %exp52_rightClickControl%
GuiControl, 52:+Hidden, %exp52_rightClickControl%
exp52_rightClickControl =
return
}
if(A_ThisMenuItem == "内容(&N)"){
F_tmpOutput( %exp52_rightClickControl%_script )
}
exp52_rightClickControl =
メニューを使って実行した場合、
A_ThisMenuItem
の変数に、選んだメニューの名前が格納されるようになっています。
削除(&D)
が選ばれた場合は削除する処理を、
内容(&N)
が選ばれたら、内容を表示する処理をするようにしています。
今回の様な場合、 ( ) の部分は、全角文字で記入する必要があります。
TRRでは、 ( ) の中に ( ) があった場合、どれに対応する括弧なのかがうまく認識できないからです。
当然メニュー名は、作成の時点で全角文字の ( ) を指定しておく必要があります。
削除(&D)
を選んだ時の処理は、
コントロールの変数名にプラスした名前の変数をそれぞれ初期化して、
コントロールを隠す処理をしているだけです。
G_subroutine52一つにまとめる
一応これで完成していますが、
G_subroutine52
と
G_subroutine53
の二つを使っているのを、
G_subroutine52
一つにまとめようと思います。
実行する時の処理に使っていた G_subroutine52 の内容を変更します。
; コントロールが取得出来てなかったら、
; 右クリックのメニューから実行と判断する
if( A_GuiControl == "" ){
if( exp52_rightClickControl == "" ){
F_tmpOutput( "右クリックの内容が取得できていない" )
return
}
if(A_ThisMenuItem == "削除する(&D)"){
%exp52_rightClickControl%_script =
%exp52_rightClickControl%_type =
%exp52_rightClickControl%_text =
%exp52_rightClickControl%_img =
; セーブ時にファイルを削除しているからいらない
; IniDelete, %exp52_iniFile%, %exp52_rightClickControl%
GuiControl, 52:+Hidden, %exp52_rightClickControl%
exp52_rightClickControl =
return
}
if(A_ThisMenuItem == "内容(&N)"){
F_tmpOutput( %exp52_rightClickControl%_script )
}
exp52_rightClickControl =
}
exp52_tmpExeScript := %A_GuiControl%_script
if( exp52_tmpExeScript == "" ){
; F_tmpOutput( "まだ、ファイルパスを登録していない。" )
return
}
F_textExe( exp52_tmpExeScript )
; 初期化する
exp52_tmpExeScript =
スクリプトの説明は、合わせただけのものなので不要だと思います。
コントロールをクリックして実行した場合、
A_GuiControl
の変数に、コントロール変数の名前が格納されるはずなので、
それに値が無い場合は右クリックメニューからの実行と判別するようにしています。
右クリックメニューから実行した場合は、
メニューから実行しているので、
A_GuiControl
には値は格納されずカラの状態になります。
これにあわせて、
start2_makeGui52.trr
の中にある、メニューを作成している部分を変える必要があります。
以下の部分を G_subroutine53 から G_subroutine52 に変えてください。
; カッコは全角文字。半角だと、() のネストに対応できない問題でひっかかる
Menu , menu52, Add, 削除する(&D), G_subroutine53
Menu , menu52, Add, 内容(&N), G_subroutine53
G_subroutine52
に変えた後は、
G_subroutine53.trr
のファイルは削除しても大丈夫です。
start2_makeGui52.trr
のスクリプトを変えたくない場合、
G_subroutine52
に変えたりしなくても、
G_subroutine53.trr
のファイルを削除していなければ動作に問題はないです。