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

追加するランチャー。その2

Guiの作成

変数の宣言は前回で終了したので、次に行きます。
早速ですが、Guiの作成のスクリプトです。

start2_makeGui52.trr
if( exp52_make >= 2 ){
    F_output("すでに作成済み")
    return
}
exp52_make++

Gui , 52:Font, S9, メイリオ

Gui , 52:Show, Hide x690 y30 w280 h320, 追加するランチャー
Gui , 52:+Resize

; カッコは全角文字。半角だと、() のネストに対応できない問題でひっかかる
Menu , menu52, Add, 削除する(&D), G_subroutine53
Menu , menu52, Add, 内容(&N), G_subroutine53

この簡易ランチャーは、後々追加していく形式のため、初期の状態は簡素なものです。

このスクリプトを上から順に説明しておくと、

exp52_make の変数は 2回目以降の実行かどうかを確認する変数です。
この start2_makeGui52アイテム
2回以上実行されてしまうと、 エラーでストップしてしまうので
一応、変数を使って 2回以上実行しないようにしたものです。
別にあっても無くてもよいスクリプトです。

次にフォントの指定をしています。
これを指定しておくと、追加するものに 9pxメイリオ のフォントの文字が使用されると思います。

その後は、 Gui, 52:Show, Hide を使うことで初期の配置とサイズを指定し、ウインドウタイトルも合わせて指定しています。

最後は、右クリックのメニューを使うつもりなのでそれを使うための準備をしています。

コメント文でも書いていますが、 ( ) は、半角文字では記入しないでください。
今の TRR では、後にでてくるスクリプトでうまく動作しない事になります。

閉じる場合の指定

TRR でGuiを作る場合、 51 から 59 の番号のGuiを使う場合は、 [Guiの番号]GuiCloseアイテム を作って閉じる動作を指定しないといけないので、それを作っておきます。

ついでに、 Esc キーを押しても閉じれるようにしておきます。

52GuiClose.trr
Gui , 52:Hide
52GuiEscape.trr
Gui , 52:Hide

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

追加するランチャー。その2後編

ボタンを追加する

Guiを作った後は、さっそく中身を追加する方法に入ります。

以下のスクリプトは区画を追加する時に使う アイテムです。
ボタンのコントロールを追加します。

addButtonGui52.trr
; 引数1にサブルーチン名。引数2に表示する文字。
exp52_tmpSubroutine = %B_itemArg1%
exp52_tmpViewText = %B_itemArg2%
if( exp52_tmpViewText == "" ){
    F_errorOutput( B_itemNameOwn  .  " のエラー。`n引数の指定が足りない" )
    return
}
exp52_tmpHeightCount := exp52_count // exp52_widthNumber
exp52_tmpWidthCount := Mod(exp52_count, exp52_widthNumber)
exp52_tmpPosX := exp52_tmpWidthCount * exp52_width
exp52_tmpPosY := exp52_tmpHeightCount * exp52_height

exp52_tmpOption = X%exp52_tmpPosX% Y%exp52_tmpPosY% w%exp52_width% h%exp52_height% g%exp52_tmpSubroutine%
Gui, 52:Add, Button, %exp52_tmpOption%,  %exp52_tmpViewText%

exp52_count++
%--

まず、この アイテム の使い方から説明します。

この addButtonGui52 を使う場合、引数を 2つ指定して使う事になります。

1つめの引数に、 区画がクリックされた時に実行させる サブルーチン名 を指定します。

G_subroutine を指定する事になります。

2つめの引数に、 区画の中に表示する文字を指定します。

addButtonGui52 G_subroutine1 ボタン1

を実行することで、 ボタン1 と表記されたボタンが追加されます。
このボタンを押すと、 G_subroutine1アイテムが実行されます。

スクリプトの説明

それでは、上から順に説明していきます。

B_itemArg1B_itemArg2 を使っています。

この変数に アイテムの 引数に使われている文字が代入されています。

最初に B_itemArg1B_itemArg2 を別の変数に代入してそっちを使う様にしています。

B_itemArg1 といった変数は、 別のスレッドが同時進行で実行されていたりする時、 別の値が割り込むかもしれないので、スクリプトの最初に別の変数に代入してその変数をスクリプト内で使う事を勧めます。

そして、 B_itemArg1 といった変数を使う場合は、
スクリプトの最後に %-- を記入する必要があることに注意してください。

次の if 文は、引数が指定されているかをチェックする個所です。
引数が無ければエラーの文を出力して return で終了する様にしています。

次のスクリプトは配置する位置に関するものです。

exp52_tmpHeightCount := exp52_count // exp52_widthNumber
exp52_tmpWidthCount := Mod(exp52_count, exp52_widthNumber)
exp52_tmpPosX := exp52_tmpWidthCount * exp52_width
exp52_tmpPosY := exp52_tmpHeightCount * exp52_height

exp52_widthNumber の変数ですが、これは一行に何個配置するかを指定した変数です。
グローバル変数の宣言時に、 3 を代入しています。

上の列から順に左から右に、
3個になったら、 次の列に移行する様に配置します。

別に言わなくてもいいんでしょうけど、
// が割り算。
Mod( ) が余りを求める関数。
* が掛け算の演算子です。

とりあえずこの式を使えばその順番通りに配置できるように位置がもとめられます。

後は、 GuiAHKコマンド でボタンを追加するだけです。

オプションの記述が長いので、先に変数に代入してからそれを使って記述していますが、
変数に代入せずに Gui のコマンドの中にそのまま記述しても同じです。

蛇足

オプションを指定した変数には、
ボタンの大きさと配置する位置と実行させるサブルーチンの指定をしています。
ボタンの大きさは、グローバル変数の宣言時に決めた時のままで、
配置する位置は先ほどの式でもとめた位置を。
サブルーチンは引数で指定したものを使用します。
ボタンに記入する文字も、引数で指定したものです。

後は、 exp52_count が何個目を配置しているかを表す変数なので 1つプラスします。

画像で区画を作る

マウス操作のためのウインドウ と同じ様に、画像のコントロールで追加するスクリプトが以下の例です。

addPictureGui52.trr
; 引数1にサブルーチン名。引数2に画像が無かった場合の文字。
; 引数3に画像のファイルパスを指定する
exp52_tmpSubroutine = %1
exp52_tmpViewText = %2
exp52_tmpNoExtFile = %*
if( exp52_tmpNoExtFile == "" ){
    F_errorOutput( "addPictureGui52のエラー。`n引数の指定が足りない" )
    return
}

exp52_tmpHeightCount := exp52_count // exp52_widthNumber
exp52_tmpWidthCount := Mod(exp52_count, exp52_widthNumber)
exp52_tmpPosX := exp52_tmpWidthCount * exp52_width
exp52_tmpPosY := exp52_tmpHeightCount * exp52_height

exp52_tmpOption = X%exp52_tmpPosX% Y%exp52_tmpPosY% w%exp52_width% h%exp52_height% g%exp52_tmpSubroutine%
exp52_imgExistFlag := F_GuiAddPictureNoExtFile(52, exp52_tmpNoExtFile, exp52_tmpOption)
if( exp52_imgExistFlag == False ){
    Gui, 52:Add, Button, %exp52_tmpOption%,  %exp52_tmpViewText%
}
exp52_count++
; 初期化
exp52_tmpNoExtFile =

この アイテム の使い方から説明します。

この addPictureGui52 を使う場合、引数を 3つ指定して使う事になります。

1つめの引数に、 区画がクリックされた時に実行させる サブルーチン名 を指定します。

2つめの引数に、 区画の中に表示する文字を指定します。
今回は画像を追加するので、ここで指定した文字は画像のファイルパスが見つからなかった時に表示する文字を指定します。

3つめの引数に、画像のファイルパスを指定します。
その画像が区画の背景になります。
区画の大きさは 64x64 の大きさになっているのでその大きさに縮小・拡大されます。

拡張子を除いたファイルパスも指定できます。
拡張子を除いた場合は、指定したファイルパスから
jpeg、gif、png のいずれかの拡張子が付いたファイルパスを探して見つかればそれを使うようにします。

拡張子が付いているなら、指定したファイルパスが見つかればそのままそれを使います。

addPictureGui52 G_subroutine2 ボタン2 %A_ScriptDir%\trrEvery\doc\icon\Suspend.ico

を実行することで、 画像のコントロールが追加されます。
この画像をクリックすると、 G_subroutine2アイテムが実行されます。

指定している画像のファイルパスが存在しない場合は、
ボタンのコントロールが代わりに追加されます。
そのときは、 ボタン2 の文字が記入されます。

諸注意

この画像をクリックすると、クリップボードにこの画像のファイルパスが格納されるようになっています。

できれば、そうなる様にはしたくないのですが、これは AHK 自体の仕様なので、そうならないようには出来ません。

スクリプトの説明

スクリプトの説明ですが、先程挙げた addButtonGui52 のスクリプトとほとんど同じ様なものです。
ですので、同じ部分の説明は省きます。

引数の取得の方法について

addButtonGui52 のときは、
B_itemArg1B_itemArg2 の変数を使っていました。
今回はそれを使わず、 %1%2%* を代わりに使っています。

その理由は 3つめの引数は ファイルパスを指定する仕様になっているので、
その場合「半角スペース」があるファイルパスがあった場合どうするかの問題を考えたからです。

引数3 の部分を %* で取得する様にすれば、「半角スペース」があっても問題ないためこちらを使っています。

B_itemArg1 ではなく、 %1 などを使った場合、
スクリプトの最後に %-- を記入していると、 %1 が意味をなさなくなるので注意してください。

正直、 B_itemArg1 の方を使おうと %1 の方を使おうとどちらでもよいと思います。

「半角スペース」があるファイルパスを指定する必要があった場合は、 「引数を , で区切るルール 」を使って指定する方法もあります。

%1 などを使った場合、引数がどの位置に配置されるかを、
Alt+o で確認できるため、確認をする上では少し便利だと思います。

B_itemArg1 の方を使った場合は、若干処理が軽いと思います。
目に見えた違いはないでしょうが。
後、不具合は B_itemArg1 の方が少ないと思います。

画像のコントロールを追加する部分

他の部分はボタンを追加するときと同じなため、画像を追加する部分を説明します。

F_GuiAddPictureNoExtFile( ) の関数を使っています。
前回に説明をした関数です。

この関数は、引数2 に指定したファイルパスが見つからなければ False の値を返します。
次の if を見ても分かるように、指定したファイルパスが見つからないときは、代わりにボタンのコントロールを追加するようにしています。

画像を追加する方法の説明は以上です。

だいたいこの様なスクリプトで、
マウス操作のためのウインドウ と同じ様な区画を配置する アイテムが作れます。

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