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

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

マウスのドロップで登録

ファイルをマウスのドロップを使って登録できるようにしていきます。

画像

AHK は、 [指定した名前]DropFiles の名前のサブルーチンが Guiにマウスのドロップがかかった時に動作するサブルーチンです。

TRRでは、 52 のGuiの番号を使った時は、 52GuiDropFilesアイテム がGuiにマウスのドロップがかかった時に動作するものになります。

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

52GuiDropFiles.trr
StringSplit, exp52_files, A_GuiEvent, %B_LineFeedLF%
exp52_tmpIconPath = %exp52_files1%

; exp52_tmpIconPath の拡張子が、txt、画像ファイル、lnk なら、
; exp52_tmpIconPath に SHELL32.dll のファイルを。exp52_tmpIconOption に アイコン番号を代入する
myClickGui52_getIconAddGui52

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_count++
if(exp52_count >= exp52_many){
    F_tmpOutput( "これ以上は追加できない" )
    return
}
exp52_tmpControlVar = exp52_area%exp52_count%

; ドロップ登録はタイプ3
%exp52_tmpControlVar%_type = 3
%exp52_tmpControlVar%_text = 画像がない
%exp52_tmpControlVar%_img = %exp52_files1%

exp52_tmpOption = %exp52_tmpIconOption% X%exp52_tmpPosX% Y%exp52_tmpPosY% w%exp52_width% h%exp52_height% v%exp52_tmpControlVar% gG_subroutine52
F_GuiAddPictureFileExist(52, exp52_tmpIconPath, exp52_tmpOption)
; F_GuiAddPictureNoExtFile(52, exp52_tmpIconPath, exp52_tmpOption)

%exp52_tmpControlVar%_script = %exp52_files1%

exp52_tmpIconOption =

スクリプトの説明です。
一行目が、ドロップされたファイルを変数に格納する処理です。

ファイルがGuiにドロップされた時、
A_GuiEvent の変数には、ファイルパスが格納されます。

複数のファイルがドロップされた場合は、改行で区切られて 複数のファイルパスが格納されるようです。

StringSplitについて

StringSplit の説明が少し長くなります。

StringSplit, exp52_files, A_GuiEvent, %B_LineFeedLF%

StringSplitAHKコマンド を指定して、 A_GuiEvent の値を改行で区切って、別の変数に代入しています。

B_LineFeedLF

B_LineFeedLF の変数は改行を値に持つ変数です。

TRRのスクリプトでは、
`nなどのエスケープを使った文字を使っても、
`n の文字などは、 `n の文字としか扱えません。
つまり改行として扱えません。

補足

限られた場合のみ `n の文字をそのまま改行として扱います。

参考はこちらのページです。
文字が" "で囲まれているときのルール

よって、 TRR のスクリプトで改行を使いたいときは、
B_LineFeedLF の変数を使う事になります。

今回の SplitPath の内容は、 A_GuiEvent の値を改行で区切った値を取得したいので %B_LineFeedLF% を指定しています。

SplitPathに指定する変数

TRR では、グローバル変数でなければ変数として使えません。
SplitPath に使う変数もグローバル宣言をしておく必要があります。

グローバル宣言をしている start1_globalGui52_1.trr の中の、
global exp52_files0 =
と書かれている部分がこの変数を宣言している個所です。

SplitPath に使うグローバル変数の名前は 今回の様に、 exp52_files という名前で指定する場合は、
それに 0 を加えた exp52_files0 といった名前の変数をグローバル宣言する事になるようです。

そうすれば、 SplitPathexp52_files を指定し、
exp52_files1 の変数に、一つめのファイルパスが格納されることが可能になるようです。

myClickGui52_getIconAddGui52

次の事ですが、 画像に使うファイルパスは、
ソフトの実行ファイルをドロップした場合は、そのドロップしたファイル自体を使用します。

ですが、それ以外のファイルなら別の画像を使用します。

exp52_tmpIconPath の変数に画像のファイルパスを代入します。
まず、最初にドロップしたファイル自体のファイルパスを代入します。

次に myClickGui52_getIconAddGui52アイテムを使用しています。
これは、ファイルの拡張子によって、何の画像かを決めるアイテムです。

これには、 exp52_tmpIconPath の変数に、代えのファイルパスを代入したり、
exp52_tmpIconOption の変数にアイコンの番号を代入するスクリプトが書かれています。

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

myClickGui52_getIconAddGui52.trr
; exp52_tmpIconPath の拡張子が、txt、画像ファイル、lnk なら、
; exp52_tmpIconPath に SHELL32.dll のファイルを。exp52_tmpIconOption に アイコン番号を代入する
exp52_tmpFileType := FileExist( exp52_tmpIconPath )
if( exp52_tmpFileType == "" ) {
    F_errorOutput( "このファイルパスのアイコンのが判別できない。`n" . exp52_tmpIconPath )
    return
}
IfInString, exp52_tmpFileType, D
{
    exp52_tmpIconPath = %exp52_SHELL32DLL%
    exp52_tmpIconOption := exp52_folderIconNumber
    return
}
; 拡張子がほしいので、SplitPath を使う
SplitPath, exp52_tmpIconPath , exp52_OutFileName, exp52_OutDir, exp52_tmpSuffix
StringLower, exp52_tmpSuffix, exp52_tmpSuffix

; exp52_tmpSuffix が画像ファイルの拡張子なら、exp52_tmpImgFlag に True を代入するアイテム
myClickGui52_suffixIsImgGui52

if( exp52_tmpImgFlag ){
    exp52_tmpIconPath = %exp52_SHELL32DLL%
    exp52_tmpIconOption := exp52_imgIconNumber
    return
}
if( exp52_tmpSuffix == "exe" ) {
    ; 何もしない
} else if( exp52_tmpSuffix == "txt" ) {
    exp52_tmpIconPath = %exp52_SHELL32DLL%
    exp52_tmpIconOption := exp52_txtIconNumber
} else if( exp52_tmpSuffix == "lnk" ) {
    ; ショートカットの場合でも、特に工夫はせず
    exp52_tmpIconPath = %exp52_SHELL32DLL%
    exp52_tmpIconOption := exp52_lnkIconNumber
} else {
    exp52_tmpIconPath = %exp52_SHELL32DLL%
    exp52_tmpIconOption := exp52_otherIconNumber
}

このスクリプトを簡単に説明すると、
ほとんどの場合に、画像のファイルパスは
exp52_SHELL32DLL の値を指定しています。
グローバル宣言のファイルに、以下の宣言をしている個所の変数です。

global exp52_SHELL32DLL := SystemRoot . "\system32\SHELL32.dll"

exe 以外のファイルには全てこのファイルパスを指定しています。

同時に、 exp52_tmpIconOption の変数にアイコンの番号を指定している文字を代入しています。

フォルダなら、フォルダのアイコンになる番号。
拡張子が txt なら、テキストファイルに使えそうな画像のアイコンの番号を。
lnk なら、ショートカットに使えそうなアイコンの番号を。
それ以外なら星マークの番号を指定しています。

補足

ショートカットの場合、リンク元のファイルを参考にできそうですが、 複雑になるのを避けるためにここでは止めて、単純な構造にしておきます。

リンク先は、 F_getShortcutPath( shortcutFile )
FileGetShortcut を使って取得は出来ます。

細かい事を指定する意味は別に無いのですが、
画像のファイルだった場合もそれ用のアイコンになるようにしています。

myClickGui52_suffixIsImgGui52アイテムを使って、画像のファイルかどうかを確認するようにしています。

これは、 exp52_tmpSuffix の変数が
jpgjpeggifpng かどうかを確認するだけのアイテムです。

myClickGui52_suffixIsImgGui52.trr
if( exp52_tmpSuffix == "jpg" ) {
    exp52_tmpImgFlag := True
} else if( exp52_tmpSuffix == "jpeg" ) {
    exp52_tmpImgFlag := True
} else if( exp52_tmpSuffix == "gif" ) {
    exp52_tmpImgFlag := True
} else if( exp52_tmpSuffix == "png" ) {
    exp52_tmpImgFlag := True
} else {
    exp52_tmpImgFlag := False
}

こんなものを用意していますが、別に画像のファイルかどうかを判別する意味は別にありません。
これらの部分は無くてもよいため、いらないと思う方は
myClickGui52_getIconAddGui52.trr のファイルの
myClickGui52_suffixIsImgGui52
の部分は削除かコメントアウトしてください。

52GuiDropFilesの残りの部分

myClickGui52_getIconAddGui52.trr の事で説明する事は以上なので、 52GuiDropFiles.trr の説明に戻ります。

残りのスクリプトの部分は
addPictureGui52_type2.trr の内容とほとんど同じだと思います。

ファイルをGuiにドロップして登録した場合は、
登録の種類は 3 にします。

; ドロップ登録はタイプ3
%exp52_tmpControlVar%_type = 3
%exp52_tmpControlVar%_text = 画像がない
%exp52_tmpControlVar%_img = %exp52_files1%

違いは以上の部分と、
あと画像のコントロールに設定するオプションの部分に「アイコンの番号の指定」を代入した変数 を加えている違いがあります。

exp52_tmpOption = %exp52_tmpIconOption% X%exp52_tmpPosX% Y%exp52_tmpPosY% w%exp52_width% h%exp52_height% v%exp52_tmpControlVar% gG_subroutine52

あとは、大した事ではないのですが、 今まで使っていた、
F_GuiAddPictureNoExtFile( ) の関数ではなく、
F_GuiAddPictureFileExist( ) の関数を使っています。

これの違いは、 F_GuiAddPictureNoExtFile( ) の方は、拡張子が無いファイルを指定しても、
それに jpgjpeggifpng が付いているファイルがないかどうかを確認してそれを使うのに対して、
今回使う、 F_GuiAddPictureFileExist( ) は、そんなことはせず、拡張子を抜きにして指定する事はできません。

今まで使ってきた F_GuiAddPictureNoExtFile( ) の方を使っても、指定したファイルパスがあればそれを使える様になっているため、どちらを選んでも問題ありません。

ファイルのドロップで登録する場合は、拡張子を省いたファイルパスで指定される事はないため、
F_GuiAddPictureFileExist( ) の方を使っています。

52GuiDropFiles.trr と、ファイルをGuiにドロップして登録する方法の説明は以上です。

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