マウス操作のためのウインドウに追加する
追加するランチャー。その5
マウスのドロップで登録
ファイルをマウスのドロップを使って登録できるようにしていきます。
AHK は、 [指定した名前]DropFiles の名前のサブルーチンが Guiにマウスのドロップがかかった時に動作するサブルーチンです。
TRRでは、 52 のGuiの番号を使った時は、 52GuiDropFiles の アイテム がGuiにマウスのドロップがかかった時に動作するものになります。
以下にスクリプトを挙げます。
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%
StringSplit の AHKコマンド を指定して、 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
といった名前の変数をグローバル宣言する事になるようです。
そうすれば、
SplitPath
に
exp52_files
を指定し、
exp52_files1
の変数に、一つめのファイルパスが格納されることが可能になるようです。
myClickGui52_getIconAddGui52
次の事ですが、
画像に使うファイルパスは、
ソフトの実行ファイルをドロップした場合は、そのドロップしたファイル自体を使用します。
ですが、それ以外のファイルなら別の画像を使用します。
exp52_tmpIconPath
の変数に画像のファイルパスを代入します。
まず、最初にドロップしたファイル自体のファイルパスを代入します。
次に
myClickGui52_getIconAddGui52
のアイテムを使用しています。
これは、ファイルの拡張子によって、何の画像かを決めるアイテムです。
これには、
exp52_tmpIconPath
の変数に、代えのファイルパスを代入したり、
exp52_tmpIconOption
の変数にアイコンの番号を代入するスクリプトが書かれています。
下にスクリプトを挙げます。
; 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
の値を指定しています。
グローバル宣言のファイルに、以下の宣言をしている個所の変数です。
exe 以外のファイルには全てこのファイルパスを指定しています。
同時に、 exp52_tmpIconOption の変数にアイコンの番号を指定している文字を代入しています。
フォルダなら、フォルダのアイコンになる番号。
拡張子が
txt
なら、テキストファイルに使えそうな画像のアイコンの番号を。
lnk
なら、ショートカットに使えそうなアイコンの番号を。
それ以外なら星マークの番号を指定しています。
ショートカットの場合、リンク元のファイルを参考にできそうですが、 複雑になるのを避けるためにここでは止めて、単純な構造にしておきます。
リンク先は、
F_getShortcutPath( shortcutFile )
か
FileGetShortcut
を使って取得は出来ます。
細かい事を指定する意味は別に無いのですが、
画像のファイルだった場合もそれ用のアイコンになるようにしています。
myClickGui52_suffixIsImgGui52 のアイテムを使って、画像のファイルかどうかを確認するようにしています。
これは、
exp52_tmpSuffix
の変数が
jpg
、
jpeg
、
gif
、
png
かどうかを確認するだけのアイテムです。
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( )
の方は、拡張子が無いファイルを指定しても、
それに
jpg
、
jpeg
、
gif
、
png
が付いているファイルがないかどうかを確認してそれを使うのに対して、
今回使う、
F_GuiAddPictureFileExist( )
は、そんなことはせず、拡張子を抜きにして指定する事はできません。
今まで使ってきた
F_GuiAddPictureNoExtFile( )
の方を使っても、指定したファイルパスがあればそれを使える様になっているため、どちらを選んでも問題ありません。
ファイルのドロップで登録する場合は、拡張子を省いたファイルパスで指定される事はないため、
F_GuiAddPictureFileExist( )
の方を使っています。
52GuiDropFiles.trr と、ファイルをGuiにドロップして登録する方法の説明は以上です。