マウス操作のためのウインドウに追加する

追加するランチャー。その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アイテム が右クリックした時に動作するものになります。

以下にスクリプトを挙げます。

52GuiContextMenu.trr
if(A_GuiControl != ""){
    exp52_rightClickControl = %A_GuiControl%
    Menu, menu52, Show, %A_GuiX%, %A_GuiY%
}

Gui右クリックされた時、
A_GuiControl の変数に、右クリックしたコントロール変数の名前が格納されます。

コントロール変数の名前が存在しているのなら、
exp52_rightClickControl の変数をこの後使うので、その変数にコントロール変数の名前を代入させます。

そして、メニューをマウスの位置で表示させる様にしています。

メニューが押された時に動作するアイテムのスクリプトを以下に挙げます。

G_subroutine53.trr
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_subroutine52G_subroutine53 の二つを使っているのを、
G_subroutine52 一つにまとめようと思います。

実行する時の処理に使っていた G_subroutine52 の内容を変更します。

G_subroutine52.trr
; コントロールが取得出来てなかったら、
; 右クリックのメニューから実行と判断する
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 のファイルを削除していなければ動作に問題はないです。

次のページに移行します。