blechmusikの日記

キー・カスタマイズ・ソフトウェア "DvorakJ" の覚え書きをはじめとして様々なことを書いています。

AutoHotkey_L でメニューに項目を追加する関数を作成した

関数を使用することで、メニューの項目を作成する作業を楽にできた。入れ子にも対応している。使い方は以下のとおりだ。第一引数にはメニュー上に表示したい文字列を記述する。第二引数には、そのメニューが選択されたときに実行する処理のラベル名を記述する。引数を一つも取らないよう記述する、つまり AddMenuItem()と書けば、そこに境界線を引く。

AddMenuItem( "English")
    AddMenuItem( "Dvorak" )
        AddMenuItem( "Dvorak Simplified Keyboard - Wikipedia", "url_Dvorak_wikipedia_dsk" )
        AddMenuItem( "Dvorak配列 - Wikipedia", "url_Dvorak_wikipedia" )
        AddMenuItem( "Programmer Dvorak Keyboard Layout", "url_programmer_Dvorak" )
        AddMenuItem( "片手用 Dvorak 配列", "url_one-handed_Dvorak" )
        AddMenuItem()
        AddMenuItem( "Dvorak 配列(blechmusik 版)の図", "about_Dvorak_Layout_blechmusik_image")
        AddMenuItem( "Dvorak 配列(記号特化版)の図", "about_Dvorak_Layout_for_programmers_image")
    AddMenuItem( "English", "Dvorak 配列", "Dvorak" )

    AddMenuItem()

    AddMenuItem( "Colemak 配列", "url_Colemak" )
AddMenuItem( "MyMenuBar", "英語配列", "English")

関数のソースを以下に示そう。

AddMenuItem( MenuItemName="", Label="", SubMenu="") {
    static static_MenuName
    static static_obj

    If !IsObject(static_obj)
    {
        static_obj := Object("count", 0) 
    }

    ;; AddMenuItem()
    if ( !( MenuItemName ) )
    {
        Menu, %static_MenuName%, Add
    }
    else
    if ( !( Label ) ) ; AddMenuItem( MenuItemName )
    {
        static_obj.count := static_obj.count + 1
        static_obj[static_obj.count] := MenuItemName
        static_MenuName := static_obj[static_obj.count]
    }
    else
    if ( Submenu ) ; AddMenuItem( MenuItemName, , Label, SubMenu)
    {
        ;; サブメニューを展開するとき
        Menu, %MenuItemName%, Add
            , %Label%
            , :%static_MenuName%

        static_obj.count := static_obj.count - 1
        static_MenuName := static_obj[static_obj.count]
    }
    else
    {
        Menu, %static_MenuName%, Add
            , %MenuItemName%
            , %Label%
    }

    return
}