# mod_layerbutton-keybd.hsp

common\ mod_layerbutton-keybd.hsp

    /* /////////////////////////////////////////////////////////////////////////////
    mod_layerbutton-keybd モジュール
    --------------------------------------------------------------------------------
    %dll ; モジュール名
    mod_layerbutton-keybd
    %ver ; バージョン
    1.1
    %date ; 更新日
    2026/1/7
    %author ; 著作者
    MIZUSHIKI
    %note
    layerbutton命令を利用してスクリーンキーボードを作成
    %type
    拡張命令
    %url
    https://suwa.pupu.jp/HSP/index.html
    %port ; 対応環境
    Win
    */ /////////////////////////////////////////////////////////////////////////////
    #if 0
    %index ;========================================================================
    ScKeyboard
    スクリーンキーボードコントローラを作成
    %group ;------------------------------------------------------------------------
    オブジェクト制御命令
    %prm   ;------------------------------------------------------------------------
    p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12
    p1,p2 : スクリーンキーボードのXYサイズ（ドット単位）
    p3=変数 : スクリーンキーボードの入力値が格納される変数を登録
    p4=1〜(256) : 最大入力文字数(256文字まで)
    p5=0〜(0) : グループID
    p6=0〜(0) : SHOW_IN フレーム数
    p7=0〜(0) : FOCUS_IN フレーム数
    p8=0〜(0) : PRESS_IN フレーム数
    p9=0〜(0) : SHOW_OUT フレーム数
    p10=0〜(0) : FOCUS_OUT フレーム数
    p11=0〜(0) : PRESS_OUT フレーム数
    p12=0〜(0) : ボタンの角の丸みサイズR (-1で自動計算)
    %inst  ;------------------------------------------------------------------------
    p1, p2 で指定した XY サイズに応じてスクリーンキーボードが表示されます。
    X が大きい場合は横長モード、Y が大きい場合は縦長モードになります。
    p3 で登録した変数には、スクリーンキーボードで入力中の文字列が代入されます。
    p4 は最大入力文字数を指定します。(byte単位ではありません)
    p5〜p11 の引数は layerbutton命令と同じ仕様です。
    p12 を指定すると、ボタンの角にR(アール)を付けられます。
    -1 を指定するとR(アール)サイズが自動計算されます。
    ※ ボタン数が多いため、R(アール)を付けると処理が重くなる可能性があります。

    また、スクリーンキーボードは、各種命令によって外観を変更したり、描画処理に割り込んだりすることができます。
    「OK」ボタンが押されてスクリーンキーボードが非表示になったことを検出するには、ScKeybd_onEvent で layerbtn_stat == LAYBTN_GROUP_DELETED を見ることで可能です。

    なお、スクリーンキーボードは同時に複数設置することはできません。
    %href  ;-----------------------------------------------------------------------
    ScKeybd_color
    ScKeybd_font
    ScKeybd_onEvent
    Sckeybd_cursor
    ScKeybd_HiraganaSymbol
    ScKeybd_KatakanaSymbol
    ScKeybd_AlphabetSymbol

    %index ;========================================================================
    ScKeybd_color
    スクリーンキーボードコントローラの色設定を変更
    %group ;------------------------------------------------------------------------
    オブジェクト制御命令
    %prm   ;------------------------------------------------------------------------
    col1,col2,col3,col4,col5,col6
    col1=$000000〜$FFffffff : 有効キー・通常表示（ARGB形式）
    col2=$000000〜$FFffffff : 有効キー・フォーカス時（ARGB形式）
    col3=$000000〜$FFffffff : 有効キー・押し込み時（ARGB形式）
    col4=$000000〜$FFffffff : 無効キー・通常表示（ARGB形式）
    col5=$000000〜$FFffffff : 無効キー・フォーカス時（ARGB形式）
    col6=$000000〜$FFffffff : 無効キー・押し込み時（ARGB形式）
    %inst  ;------------------------------------------------------------------------
    各引数を省略した場合、前回の設定値が引き継がれます。
    ScKeyboard 命令の前後いずれに記述しても動作します。
    %href  ;------------------------------------------------------------------------
    ScKeyboard
    ScKeybd_font
    ScKeybd_onEvent
    Sckeybd_cursor
    ScKeybd_HiraganaSymbol
    ScKeybd_KatakanaSymbol
    ScKeybd_AlphabetSymbol

    %index ;========================================================================
    ScKeybd_font
    スクリーンキーボードコントローラのフォント設定を変更
    %group ;------------------------------------------------------------------------
    オブジェクト制御命令
    %prm   ;------------------------------------------------------------------------
    "fontname",p1,p2,p3,p4,p5,p6
    "fontname" : フォント名
    p1=1〜 : フォントの大きさ
    p2=0〜 : フォントのスタイル
    p3=1〜 : フォント修飾の幅
    p4=$000000〜$ffffff : フォントカラー(RGB形式/colorに相当)
    p5=$000000〜$ffffff : 影付き/縁取りカラー(RGB形式/objcolorに相当）
    p6=0〜(0) : mesオプション[mes命令と同様]
    %inst  ;------------------------------------------------------------------------
    "fontname", p1〜p3 は font 命令と同じ指定方法です。
    p4 は color、p5 は objcolor に該当します。
    p6 は mes 命令の sw オプション引数と同じです。

    各引数を省略した場合、前回の設定値が引き継がれます。
    ScKeyboard 命令の前後いずれに記述しても動作します。
    %href  ;------------------------------------------------------------------------
    ScKeyboard
    ScKeybd_color
    ScKeybd_onEvent
    Sckeybd_cursor
    ScKeybd_HiraganaSymbol
    ScKeybd_KatakanaSymbol
    ScKeybd_AlphabetSymbol

    %index ;========================================================================
    ScKeybd_onEvent
    スクリーンキーボードコントローラの文字の描画に割り込みを設定
    %group ;------------------------------------------------------------------------
    オブジェクト制御命令
    %prm   ;------------------------------------------------------------------------
    *label
    *label : ラベル名
    %inst  ;------------------------------------------------------------------------
    スクリーンキーボードが「文字」を描画する際に処理を割り込ませることができます。
    描画対象の文字は refstr で取得して判別してください。(一応、statでも判別できます。)
    return の引数に -1 を指定すると、元の文字描画をキャンセルできます。
    これにより、デフォルトのキー表示を画像などに差し替えることが可能です。

    割り込み処理内では、laybtn_ezcel や laybtn_mes など layerbutton モジュールの各種命令を利用できます。
    また、layerbtn_stat や layerbtn_cnt の値を参照することで、フォーカス移動やキー入力も検出できます。
    さらに、スクリーンキーボードが「OK」ボタンで閉じられた場合は lparam = objlayer_cmdterm となり、
    最後のキーが削除されたときは layerbtn_stat == LAYBTN_GROUP_DELETED となるため、これらで状態を判定できます。

    ScKeyboard 命令の前後いずれに記述しても動作します。
    %href  ;------------------------------------------------------------------------
    ScKeyboard
    ScKeybd_color
    ScKeybd_font
    Sckeybd_cursor
    ScKeybd_HiraganaSymbol
    ScKeybd_KatakanaSymbol
    ScKeybd_AlphabetSymbol

    %index ;========================================================================
    Sckeybd_cursor
    スクリーンキーボードコントローラにカーソル移動キーを追加
    %group ;------------------------------------------------------------------------
    オブジェクト制御命令
    %prm   ;------------------------------------------------------------------------
    p1
    p1=0〜(-3) : カーソルの移動先指定やオプション値
    %inst  ;------------------------------------------------------------------------
    引数 p1 を省略(または-3指定)すると、スクリーンキーボードにカーソル移動キーが追加されます。
    p1 に 0 以上の数値を指定した場合は、その位置へカーソルが移動し、-1 を指定すると右端へ移動します。
    p1に -2 を指定した場合は、現在のカーソル位置が stat に代入されます。
    なお、一度追加したカーソル移動キーは、p1 に -4 を指定することで削除できます。
    %href  ;------------------------------------------------------------------------
    ScKeyboard
    ScKeybd_color
    ScKeybd_font
    ScKeybd_onEvent
    ScKeybd_HiraganaSymbol
    ScKeybd_KatakanaSymbol
    ScKeybd_AlphabetSymbol

    %index ;========================================================================
    ScKeybd_HiraganaSymbol
    スクリーンキーボードコントローラの記号キーを上書き(「ひらがな」ページ)
    %group ;------------------------------------------------------------------------
    オブジェクト制御命令
    %prm   ;------------------------------------------------------------------------
    p1,p2,...,pN
    pN=文字 : 追加する文字
    %inst  ;------------------------------------------------------------------------
    この命令は、スクリーンキーボードの「ひらがな」ページで使用する記号キーを指定します。
    引数には、追加したい文字を順に指定してください。
    文字の配置は以下のようになります。
    ・「あ」〜「ん」を表示し終わった次の行の先頭から順に、空いているキーへ追加されます。
    ・キーボードの最後まで埋まると再び先頭から数え直し、「ひらがな」以外の空いているキーに追加文字が割り当てられます。
    初期状態ではいくつかの記号が登録されていますが、この命令を実行すると指定内容で上書きされます。
    %href  ;------------------------------------------------------------------------
    ScKeyboard
    ScKeybd_color
    ScKeybd_font
    ScKeybd_onEvent
    Sckeybd_cursor
    ScKeybd_KatakanaSymbol
    ScKeybd_AlphabetSymbol

    %index ;========================================================================
    ScKeybd_KatakanaSymbol
    スクリーンキーボードコントローラの記号キーを上書き(「カタカナ」ページ)
    %group ;------------------------------------------------------------------------
    オブジェクト制御命令
    %prm   ;------------------------------------------------------------------------
    p1,p2,...,pN
    pN=文字 : 追加する文字
    %inst  ;------------------------------------------------------------------------
    この命令は、スクリーンキーボードの「カタカナ」ページで使用する記号キーを指定します。
    引数には、追加したい文字を順に指定してください。
    文字の配置は以下のようになります。
    ・「ア」〜「ン」を表示し終わった次の行の先頭から順に、空いているキーへ追加されます。
    ・キーボードの最後まで埋まると再び先頭から数え直し、「カタカナ」以外の空いているキーに追加文字が割り当てられます。
    初期状態ではいくつかの記号が登録されていますが、この命令を実行すると指定内容で上書きされます。
    %href  ;------------------------------------------------------------------------
    ScKeyboard
    ScKeybd_color
    ScKeybd_font
    ScKeybd_onEvent
    Sckeybd_cursor
    ScKeybd_HiraganaSymbol
    ScKeybd_AlphabetSymbol

    %index ;========================================================================
    ScKeybd_AlphabetSymbol
    スクリーンキーボードコントローラの記号キーを上書き(「アルファベット」ページ)
    %group ;------------------------------------------------------------------------
    オブジェクト制御命令
    %prm   ;------------------------------------------------------------------------
    p1,p2,...,pN
    pN=文字 : 追加する文字
    %inst  ;------------------------------------------------------------------------
    この命令は、スクリーンキーボードの「アルファベット」ページで使用する記号キーを指定します。
    引数には、追加したい文字を順に指定してください。
    文字の配置は以下のようになります。
    ・「アルファベットと数字」を表示し終わった次の行の先頭から順に、空いているキーへ追加されます。
    ・キーボードの最後まで埋まると再び先頭から数え直し、「アルファベットと数字」以外の空いているキーに追加文字が割り当てられます。
    初期状態ではいくつかの記号が登録されていますが、この命令を実行すると指定内容で上書きされます。
    %href  ;------------------------------------------------------------------------
    ScKeyboard
    ScKeybd_color
    ScKeybd_font
    ScKeybd_onEvent
    Sckeybd_cursor
    ScKeybd_HiraganaSymbol
    ScKeybd_KatakanaSymbol
    % ;=============================================================================
    #endif

    #include "mod_layerbutton.hsp"

    #ifndef ScKeyboard

    #module modlaybtn_keybd
    inited=0:hiragana_kuranIndexs_num=0:katakana_kuranIndexs_num=0:alphabet_tate_kuranIndexs_num=0:alphabet_yoko_kuranIndexs_num=0:splitChars=0:_oneventlabel_=0:backsp=0:mae_backsp=0:id_cursorLeft=0:id_cursorRight=0:_lbl=0
    *init
    	if inited : return
    	inited = 1  ; 初期化済みフラグ
    	// ひらがな
    	sdim hiragana,32,55,3
    	hiragana(0,0) = "あ","い","う","え","お","か","き","く","け","こ","さ","し","す","せ","そ","た","ち","つ","て","と","な","に","ぬ","ね","の","は","ひ","ふ","へ","ほ","ま","み","む","め","も","や",  "","ゆ",  "","よ","ら","り","る","れ","ろ","わ","を","ん"
    	hiragana(0,1) = "ぁ","ぃ","ぅ","ぇ","ぉ","が","ぎ","ぐ","げ","ご","ざ","じ","ず","ぜ","ぞ","だ","ぢ","っ","で","ど",  "",  "",  "",  "",  "","ば","び","ぶ","べ","ぼ",  "",  "",  "",  "",  "","ゃ",  "","ゅ",  "","ょ",  "",  "",  "",  "",  "",  "",  "",  ""
    	hiragana(0,2) =   "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "","づ",  "",  "",  "",  "",  "",  "",  "","ぱ","ぴ","ぷ","ぺ","ぽ",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  ""
    	repeat 55, 50
    		if hiragana(cnt\55) == "" : hiragana_kuranIndexs(hiragana_kuranIndexs_num) = (cnt\55) : hiragana_kuranIndexs_num++
    	loop
    	sdim hiragana_add,32,hiragana_kuranIndexs_num
    	hiragana_add = "！","？","","","","","","","ー"
    	// カタカナ
    	sdim katakana,32,55,3
    	katakana(0,0) = "ア","イ","ウ","エ","オ","カ","キ","ク","ケ","コ","サ","シ","ス","セ","ソ","タ","チ","ツ","テ","ト","ナ","ニ","ヌ","ネ","ノ","ハ","ヒ","フ","ヘ","ホ","マ","ミ","ム","メ","モ","ヤ",  "","ユ",  "","ヨ","ラ","リ","ル","レ","ロ","ワ","ヲ","ン"
    	katakana(0,1) = "ァ","ィ","ゥ","ェ","ォ","ガ","ギ","グ","ゲ","ゴ","ザ","ジ","ズ","ゼ","ゾ","ダ","ヂ","ッ","デ","ド",  "",  "",  "",  "",  "","バ","ビ","ブ","ベ","ボ",  "",  "",  "",  "",  "","ャ",  "","ュ",  "","ョ",  "",  "",  "",  "",  "",  "",  "",  ""
    	katakana(0,2) =   "",  "","ヴ",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "","ヅ",  "",  "",  "",  "",  "",  "",  "","パ","ピ","プ","ペ","ポ",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  "",  ""
    	repeat 55, 50
    		if katakana(cnt\55) == "" : katakana_kuranIndexs(katakana_kuranIndexs_num) = (cnt\55) : katakana_kuranIndexs_num++
    	loop
    	sdim katakana_add,32,katakana_kuranIndexs_num
    	katakana_add = "！","？","","","","","","","ー"
    	// アルファベット
    	sdim alphabet_tate,32,55,2
    	sdim alphabet_yoko,32,55,2
    	alphabet_tate(0,0) = "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","","","","","1","2","3","4","5","6","7","8","9","0"
    	alphabet_tate(0,1) = "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","","","","","1","2","3","4","5","6","7","8","9","0"
    	alphabet_yoko(0,0) = "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","","","","","","","","1","2","3","4","5","6","7","8","9","0",""
    	alphabet_yoko(0,1) = "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","","","","","","","","1","2","3","4","5","6","7","8","9","0",""
    	repeat 55, 40
    		if alphabet_tate(cnt\55) == "" : alphabet_tate_kuranIndexs(alphabet_tate_kuranIndexs_num) = (cnt\55) : alphabet_tate_kuranIndexs_num++
    	loop
    	repeat 55, 44
    		if alphabet_yoko(cnt\55) == "" : alphabet_yoko_kuranIndexs(alphabet_yoko_kuranIndexs_num) = (cnt\55) : alphabet_yoko_kuranIndexs_num++
    	loop
    	sdim alphabet_add,32,limit(alphabet_tate_kuranIndexs_num,alphabet_yoko_kuranIndexs_num)
    	alphabet_add = "-","!","?","_","&","(",")","+","/","."
    	// 各種初期設定
    	_group_ = -1
    	_col1_ = $AADCDCDC
    	_col2_ = $EEB8D7F1
    	_col3_ = $EE3288FF
    	_col4_ = $AAAAAAAA
    	_col5_ = $AA777777
    	_col6_ = $AA777777
    	_fontName_ = msgothic
    	#ifdef _HSP3DISH
    		info_os = sysinfo(0)
    		if instr(info_os,0,"Emscripten")>=0 : _fontName_ = "sans-serif"
    	#endif
    	_fontSize_ = 16
    	_fontStyle_ = 1
    	_fontDecoSize_ = 1
    	_fontColor_ = $111111
    	_decoColor_ = $EEEEEE
    	_mesStyle_ = 0
    	useOnEvent = 0
    	useCursor = 0
    	return
    // スクリーンキーボードコントローラ作成
    #deffunc ScKeyboard int sx, int sy, var out_input, int input_max, int group, int show_in, int focus_in, int press_in, int show_out, int focus_out, int press_out, int r1
    	gosub *init
    	if _group_ >= 0 : if laybtn_length(_group_) : return
    	_out_input_ = ""
    	if vartype(out_input) == 2 : _out_input_ = out_input
    	_input_max_ = limit(input_max,0,256) : if _input_max_ == 0 : _input_max_ = 256
    	// 入力項目
    	sdim out_input,1024 : keybd_inputs="" : keybd_inputs_num=0 : keybd_kanaType=0 : keybd_posCursor=0
    	if _out_input_ != "" {
    		split_char@modlaybtn_keybd _out_input_, splitChars
    		repeat limit(stat,0,_input_max_)
    			keybd_inputs(cnt) = splitChars(cnt) : keybd_inputs_num++ : keybd_posCursor++
    		loop
    		out_input = "" : repeat limit(keybd_inputs_num,,256) : out_input += keybd_inputs(cnt) : loop
    	}

    	_sx_ = sx
    	_sy_ = sy
    	_group_   = group  ; キーボードは1つだけ
    	gcx = ginfo_cx : gcy = ginfo_cy
    	_pOutVar_ = varptr(out_input)
    	_show_in_ = show_in
    	_focus_in_ = focus_in
    	_press_in_ = press_in
    	_show_out_ = show_out
    	_focus_out_ = focus_out
    	_press_out_ = press_out
    	_komoji_fontSize_ = 0
    	_backspace_fontsize_ = 0

    	if sx < sy {
    		sxKey = sx/5 : syKey = (sy-10)/13
    		_r1_ = r1 : if r1 == -1 : _r1_ = (sxKey + syKey)/40
    		gosub *create_aiueo_tate
    		pxyHira = sxKey*0 +gcx, syKey*11+10 +gcy  :  sxyHira = sxKey, syKey
    		pxyKata = sxKey*1 +gcx, syKey*11+10 +gcy  :  sxyKata = sxKey, syKey
    		pxySyoA = sxKey*0 +gcx, syKey*12+10 +gcy  :  sxySyoA = sxKey, syKey
    		pxyDaiA = sxKey*1 +gcx, syKey*12+10 +gcy  :  sxyDaiA = sxKey, syKey
    		pxyKomj = sxKey*2 +gcx, syKey*11+10 +gcy  :  sxyKomj = sxKey, syKey
    		pxyLeft = sxKey*2 +gcx, syKey*12+10 +gcy  :  sxyLeft = sxKey/2, syKey
    		pxyRigh = sxKey*2+sxKey/2 +gcx, syKey*12+10 +gcy  :  sxyRigh = sxKey/2, syKey
    		pxyKuha = sxKey*3 +gcx, syKey*11+10 +gcy  :  sxyKuha = sxKey, syKey
    		pxySkjo = sxKey*4 +gcx, syKey*11+10 +gcy  :  sxySkjo = sxKey, syKey
    		pxyOkok = sxKey*3 +gcx, syKey*12+10 +gcy  :  sxyOkok = sxKey*2, syKey

    	}else {
    		sxKey = (sx-14)/14 : syKey = sy/5
    		_r1_ = r1 : if r1 == -1 : _r1_ = (sxKey + syKey)/40
    		gosub *create_aiueo_yoko
    		pxyHira = int(1.5*sxKey/2)*0 +gcx, syKey*0 +gcy  :  sxyHira = int(1.5*sxKey/2), syKey
    		pxyKata = int(1.5*sxKey/2)*1 +gcx, syKey*0 +gcy  :  sxyKata = int(1.5*sxKey/2), syKey
    		pxySyoA = int(1.5*sxKey/2)*0 +gcx, syKey*1 +gcy  :  sxySyoA = int(1.5*sxKey/2), syKey
    		pxyDaiA = int(1.5*sxKey/2)*1 +gcx, syKey*1 +gcy  :  sxyDaiA = int(1.5*sxKey/2), syKey
    		pxyKomj = int(1.5*sxKey/2)*0 +gcx, syKey*2 +gcy  :  sxyKomj = int(1.5*sxKey), syKey
    		pxyLeft = int(1.5*sxKey/2)*0 +gcx, syKey*4 +gcy  :  sxyLeft = int(1.5*sxKey/2), syKey
    		pxyRigh = int(1.5*sxKey/2)*1 +gcx, syKey*4 +gcy  :  sxyRigh = int(1.5*sxKey/2), syKey
    		pxyKuha = int(1.5*sxKey)+7+sxKey*11+7 +gcx, syKey*1 +gcy  :  sxyKuha = int(1.5*sxKey), syKey
    		pxySkjo = int(1.5*sxKey)+7+sxKey*11+7 +gcx, syKey*0 +gcy  :  sxySkjo = int(1.5*sxKey), syKey
    		pxyOkok = int(1.5*sxKey)+7+sxKey*11+7 +gcx, syKey*3 +gcy  :  sxyOkok = int(1.5*sxKey), syKey*2
    	}
    	gosub *create_function
    	if useCursor : gosub *create_cursorkey
    	return

    *create_aiueo_tate
    i=0
    repeat 11 : cnt2 = cnt
    	repeat 5
    		pos sxKey*cnt +gcx, syKey*cnt2 +gcy
    		layerbutton sxKey,syKey, i, group, show_in,focus_in,press_in, show_out,focus_out,press_out {
    			laybtn_settings 64,,1
    			if lparam == objlayer_cmddraw {
    				// 文字
    				switch keybd_kanaType
    				case 0 : wd = hiragana(objlayer_option,0) : if wd=="" {repeat hiragana_kuranIndexs_num:if hiragana_kuranIndexs(cnt)==objlayer_option{wd=hiragana_add(cnt):break}loop} : swbreak
    				case 1 : wd = katakana(objlayer_option,0) : if wd=="" {repeat katakana_kuranIndexs_num:if katakana_kuranIndexs(cnt)==objlayer_option{wd=katakana_add(cnt):break}loop} : swbreak
    				case 2 : wd = alphabet_tate(objlayer_option,0) : if wd=="" {repeat alphabet_tate_kuranIndexs_num:if alphabet_tate_kuranIndexs(cnt)==objlayer_option{wd=alphabet_add(cnt):break}loop} : swbreak
    				case 3 : wd = alphabet_tate(objlayer_option,1) : if wd=="" {repeat alphabet_tate_kuranIndexs_num:if alphabet_tate_kuranIndexs(cnt)==objlayer_option{wd=alphabet_add(cnt):break}loop} : swbreak
    				swend
    				// Push
    				if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED && wd!="" && _input_max_ > keybd_inputs_num {
    					ADD_keybd_inputs keybd_posCursor, wd : keybd_inputs_num++ : keybd_posCursor++
    					dupptr _out_input, _pOutVar_, 1024, 2
    					_out_input = "" : repeat limit(keybd_inputs_num,,256) : _out_input += keybd_inputs(cnt) : loop
    				}
    				// 描画
    				if wd != "" {
    					laybtn_ezbox _col1_,_col2_,_col3_,,,,,,,_r1_, 0,0,-2,-2
    				}else {
    					laybtn_ezbox _col4_,_col5_,_col6_,,,,,,,_r1_, 0,0,-2,-2
    				}
    				// 文字表示
    				font _fontName_,_fontSize_,_fontStyle_,_fontDecoSize_
    				rgbcolor _fontColor_ : objcolor _decoColor_>>16&$FF,_decoColor_>>8&$FF,_decoColor_&$FF
    				if useOnEvent :SetStat objlayer_option+(keybd_kanaType*100):SetRefstr wd: gosub _onEventLabel_
    				if useOnEvent == 0 || stat != -1 {
    					laybtn_ezbox $01000000,$01000000,$01000000,wd,_mesStyle_
    				}
    				return
    			}
    			if lparam == objlayer_cmdterm : if layerbtn_stat == LAYBTN_GROUP_DELETED : if useOnEvent :SetStat -1:SetRefstr "": gosub _onEventLabel_
    			return
    		}
    		i++
    	loop
    loop
    return

    *create_aiueo_yoko
    i=0
    repeat 5 : cnt2 = cnt
    	repeat 11
    		pos int(1.5*sxKey)+7+sxKey*cnt +gcx, syKey*cnt2 +gcy
    		layerbutton sxKey,syKey, i, group, show_in,focus_in,press_in, show_out,focus_out,press_out {
    			laybtn_settings 64,,1
    			if lparam == objlayer_cmddraw {
    				// 文字
    				if keybd_kanaType <= 1 {  ; 位置変換
    					_i = (10-(objlayer_option\11))*5 + (objlayer_option/11)
    				}else {
    					_i = objlayer_option
    				}
    				switch keybd_kanaType
    				case 0 : wd = hiragana(_i,0) : if wd=="" {repeat hiragana_kuranIndexs_num:if hiragana_kuranIndexs(cnt)==_i{wd=hiragana_add(cnt):break}loop} : swbreak
    				case 1 : wd = katakana(_i,0) : if wd=="" {repeat katakana_kuranIndexs_num:if katakana_kuranIndexs(cnt)==_i{wd=katakana_add(cnt):break}loop} : swbreak
    				case 2 : wd = alphabet_yoko(_i,0) : if wd=="" {repeat alphabet_yoko_kuranIndexs_num:if alphabet_yoko_kuranIndexs(cnt)==_i{wd=alphabet_add(cnt):break}loop} : swbreak
    				case 3 : wd = alphabet_yoko(_i,1) : if wd=="" {repeat alphabet_yoko_kuranIndexs_num:if alphabet_yoko_kuranIndexs(cnt)==_i{wd=alphabet_add(cnt):break}loop} : swbreak
    				swend
    				// Push
    				if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED && wd!="" && _input_max_ > keybd_inputs_num  {
    					ADD_keybd_inputs keybd_posCursor, wd : keybd_inputs_num++ : keybd_posCursor++
    					dupptr _out_input, _pOutVar_, 1024, 2
    					_out_input = "" : repeat limit(keybd_inputs_num,,256) : _out_input += keybd_inputs(cnt) : loop
    				}
    				// 描画
    				if wd != "" {
    					laybtn_ezbox _col1_,_col2_,_col3_,,,,,,,_r1_, 0,0,-2,-2
    				}else {
    					laybtn_ezbox _col4_,_col5_,_col6_,,,,,,,_r1_, 0,0,-2,-2
    				}
    				// 文字表示
    				font _fontName_,_fontSize_,_fontStyle_,_fontDecoSize_
    				rgbcolor _fontColor_ : objcolor _decoColor_>>16&$FF,_decoColor_>>8&$FF,_decoColor_&$FF
    				if useOnEvent :SetStat _i+(keybd_kanaType*100):SetRefstr wd: gosub _onEventLabel_
    				if useOnEvent == 0 || stat != -1 {
    					laybtn_ezbox $01000000,$01000000,$01000000,wd,_mesStyle_
    				}
    				return
    			}
    			if lparam == objlayer_cmdterm : if layerbtn_stat == LAYBTN_GROUP_DELETED : if useOnEvent :SetStat -1:SetRefstr "": gosub _onEventLabel_
    			return
    		}
    		i++
    	loop
    loop
    return

    *create_function
    // あアaA枠
    pos pxyHira(0), pxyHira(1)
    layerbutton sxyHira(0)*2, sxyHira(1)*2, 1000, group, show_in,focus_in,press_in, show_out,focus_out,press_out {
    	laybtn_settings 1,1,1
    	if lparam == objlayer_cmddraw {
    		// 全体枠
    		laybtn_ezbox _col1_,_col1_,_col1_,,,,,,,_r1_, 0,0,-2,-2
    		return
    	}
    	if lparam == objlayer_cmdterm : if layerbtn_stat == LAYBTN_GROUP_DELETED : if useOnEvent :SetStat -1:SetRefstr "": gosub _onEventLabel_
    	return
    }
    // ひらがな
    pos pxyHira(0), pxyHira(1)
    layerbutton sxyHira(0), sxyHira(1), 1001, group, show_in,focus_in,press_in, show_out,focus_out,press_out {
    	laybtn_settings 64,,1
    	if lparam == objlayer_cmddraw {
    		wd = "あ"
    		// Push
    		if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED {
    			if keybd_kanaType != 0 : keybd_kanaType = 0
    		}
    		// フォーカス
    		laybtn_ezbox $01FFFFFF, (((_col2_>>24&$FF)/2)<<24)|(_col2_&$FFFFFF), (((_col3_>>24&$FF)/2)<<24)|(_col3_&$FFFFFF),,,,,,,-1*(_r1_==0)+_r1_,2,2,-2,-2
    		if keybd_kanaType == 0 && (layerbtn_stat & (LAYBTN_SHOW_OUT|LAYBTN_COMPLETE))==0 {
    			// 選択中表示
    			rgbcolor _col3_ : gmode 3,,,(_col2_>>24&$FF)
    			laybtn_boxfb objlayer_axis_x+objlayer_size_x/4+2, objlayer_axis_y2-12+2, objlayer_axis_x2-objlayer_size_x/4+2, objlayer_axis_y2-8+2, 2
    		}
    		// 文字表示
    		font _fontName_,_fontSize_,_fontStyle_,_fontDecoSize_
    		rgbcolor _fontColor_ : objcolor _decoColor_>>16&$FF,_decoColor_>>8&$FF,_decoColor_&$FF
    		if useOnEvent :SetStat objlayer_option:SetRefstr wd: gosub _onEventLabel_
    		if useOnEvent == 0 || stat != -1 {
    			laybtn_ezbox $01000000,$01000000,$01000000,wd,_mesStyle_,,,,,,2,2
    		}
    		return
    	}
    	if lparam == objlayer_cmdterm : if layerbtn_stat == LAYBTN_GROUP_DELETED : if useOnEvent :SetStat -1:SetRefstr "": gosub _onEventLabel_
    	return
    }

    // カタカナ
    pos pxyKata(0), pxyKata(1)
    layerbutton sxyKata(0), sxyKata(1), 1002, group, show_in,focus_in,press_in, show_out,focus_out,press_out {
    	laybtn_settings 64,,1
    	if lparam == objlayer_cmddraw {
    		wd = "ア"
    		// Push
    		if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED {
    			if keybd_kanaType != 1 : keybd_kanaType = 1
    		}
    		// フォーカス
    		laybtn_ezbox $01FFFFFF, (((_col2_>>24&$FF)/2)<<24)|(_col2_&$FFFFFF), (((_col3_>>24&$FF)/2)<<24)|(_col3_&$FFFFFF),,,,,,,-1*(_r1_==0)+_r1_,-2,2,-2,-2
    		if keybd_kanaType == 1 && (layerbtn_stat & (LAYBTN_SHOW_OUT|LAYBTN_COMPLETE))==0 {
    			// 選択中表示
    			rgbcolor _col3_ : gmode 3,,,(_col2_>>24&$FF)
    			laybtn_boxfb objlayer_axis_x+objlayer_size_x/4-2, objlayer_axis_y2-12+2, objlayer_axis_x2-objlayer_size_x/4-2, objlayer_axis_y2-8+2, 2  ; 選択中表示
    		}
    		// 文字表示
    		font _fontName_,_fontSize_,_fontStyle_,_fontDecoSize_
    		rgbcolor _fontColor_ : objcolor _decoColor_>>16&$FF,_decoColor_>>8&$FF,_decoColor_&$FF
    		if useOnEvent :SetStat objlayer_option:SetRefstr wd: gosub _onEventLabel_
    		if useOnEvent == 0 || stat != -1 {
    			laybtn_ezbox $01000000,$01000000,$01000000,wd,_mesStyle_,,,,,,-2,2
    		}
    		return
    	}
    	if lparam == objlayer_cmdterm : if layerbtn_stat == LAYBTN_GROUP_DELETED : if useOnEvent :SetStat -1:SetRefstr "": gosub _onEventLabel_
    	return
    }
    // a
    pos pxySyoA(0), pxySyoA(1)
    layerbutton sxySyoA(0), sxySyoA(1), 1003, group, show_in,focus_in,press_in, show_out,focus_out,press_out {
    	laybtn_settings 64,,1
    	if lparam == objlayer_cmddraw {
    		wd = "a"
    		// Push
    		if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED {
    			if keybd_kanaType != 2 : keybd_kanaType = 2
    		}
    		// フォーカス
    		laybtn_ezbox $01FFFFFF, (((_col2_>>24&$FF)/2)<<24)|(_col2_&$FFFFFF), (((_col3_>>24&$FF)/2)<<24)|(_col3_&$FFFFFF),,,,,,,-1*(_r1_==0)+_r1_,2,-2,-2,-2
    		if keybd_kanaType == 2 && (layerbtn_stat & (LAYBTN_SHOW_OUT|LAYBTN_COMPLETE))==0 {
    			// 選択中表示
    			rgbcolor _col3_ : gmode 3,,,(_col2_>>24&$FF)
    			laybtn_boxfb objlayer_axis_x+objlayer_size_x/4+2, objlayer_axis_y2-12-2, objlayer_axis_x2-objlayer_size_x/4+2, objlayer_axis_y2-8-2, 2  ; 選択中表示
    		}
    		// 文字表示
    		font _fontName_,_fontSize_,_fontStyle_,_fontDecoSize_
    		rgbcolor _fontColor_ : objcolor _decoColor_>>16&$FF,_decoColor_>>8&$FF,_decoColor_&$FF
    		if useOnEvent :SetStat objlayer_option:SetRefstr wd: gosub _onEventLabel_
    		if useOnEvent == 0 || stat != -1 {
    			laybtn_ezbox $01000000,$01000000,$01000000,wd,_mesStyle_,,,,,,2,-2
    		}
    		return
    	}
    	if lparam == objlayer_cmdterm : if layerbtn_stat == LAYBTN_GROUP_DELETED : if useOnEvent :SetStat -1:SetRefstr "": gosub _onEventLabel_
    	return
    }
    // A
    pos pxyDaiA(0), pxyDaiA(1)
    layerbutton sxyDaiA(0), sxyDaiA(1), 1004, group, show_in,focus_in,press_in, show_out,focus_out,press_out {
    	laybtn_settings 64,,1
    	if lparam == objlayer_cmddraw {
    		wd = "A"
    		// Push
    		if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED {
    			if keybd_kanaType != 3 : keybd_kanaType = 3
    		}
    		// フォーカス
    		laybtn_ezbox $01FFFFFF, (((_col2_>>24&$FF)/2)<<24)|(_col2_&$FFFFFF), (((_col3_>>24&$FF)/2)<<24)|(_col3_&$FFFFFF),,,,,,,-1*(_r1_==0)+_r1_,-2,-2,-2,-2
    		if keybd_kanaType == 3 && (layerbtn_stat & (LAYBTN_SHOW_OUT|LAYBTN_COMPLETE))==0 {
    			// 選択中表示
    			rgbcolor _col3_ : gmode 3,,,(_col2_>>24&$FF)
    			laybtn_boxfb objlayer_axis_x+objlayer_size_x/4-2, objlayer_axis_y2-12-2, objlayer_axis_x2-objlayer_size_x/4-2, objlayer_axis_y2-8-2, 2  ; 選択中表示
    		}
    		// 文字表示
    		font _fontName_,_fontSize_,_fontStyle_,_fontDecoSize_
    		rgbcolor _fontColor_ : objcolor _decoColor_>>16&$FF,_decoColor_>>8&$FF,_decoColor_&$FF
    		if useOnEvent :SetStat objlayer_option:SetRefstr wd: gosub _onEventLabel_
    		if useOnEvent == 0 || stat != -1 {
    			laybtn_ezbox $01000000,$01000000,$01000000,wd,_mesStyle_,,,,,,-2,-2
    		}
    		return
    	}
    	if lparam == objlayer_cmdterm : if layerbtn_stat == LAYBTN_GROUP_DELETED : if useOnEvent :SetStat -1:SetRefstr "": gosub _onEventLabel_
    	return
    }

    // OK
    pos pxyOkok(0), pxyOkok(1)
    layerbutton sxyOkok(0), sxyOkok(1), 1005, group, show_in,focus_in,press_in, show_out,focus_out,press_out {
    	laybtn_settings 64,,0
    	if lparam == objlayer_cmddraw {
    		wd = "OK"
    		// 描画
    		laybtn_ezbox _col1_,_col2_,_col3_,,,,,,,_r1_,0,0,-2,-2
    		// 文字表示
    		font _fontName_,_fontSize_,_fontStyle_,_fontDecoSize_
    		rgbcolor _fontColor_ : objcolor _decoColor_>>16&$FF,_decoColor_>>8&$FF,_decoColor_&$FF
    		if useOnEvent :SetStat objlayer_option:SetRefstr wd: gosub _onEventLabel_
    		if useOnEvent == 0 || stat != -1 {
    			laybtn_ezbox $01000000,$01000000,$01000000,wd,_mesStyle_
    		}
    		return
    	}
    	if lparam == objlayer_cmdterm : if layerbtn_stat == LAYBTN_GROUP_DELETED : if useOnEvent :SetStat -1:SetRefstr "": gosub _onEventLabel_
    	return
    }

    // 空白
    pos pxyKuha(0), pxyKuha(1)
    layerbutton sxyKuha(0), sxyKuha(1), 1006, group, show_in,focus_in,press_in, show_out,focus_out,press_out {
    	laybtn_settings 64,,1
    	if lparam == objlayer_cmddraw {
    		wd = "空白"
    		// Push
    		if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED && _input_max_ > keybd_inputs_num {
    			if keybd_kanaType <= 1 : wd="　" : else : wd=" "
    			ADD_keybd_inputs keybd_posCursor, wd : keybd_inputs_num++ : keybd_posCursor++
    			dupptr _out_input, _pOutVar_, 1024, 2
    			_out_input = "" : repeat limit(keybd_inputs_num,,256) : _out_input += keybd_inputs(cnt) : loop
    		}
    		// 描画
    		laybtn_ezbox _col1_,_col2_,_col3_,,,,,,,_r1_,0,0,-2,-2
    		// 文字表示
    		font _fontName_,_fontSize_,_fontStyle_,_fontDecoSize_
    		rgbcolor _fontColor_ : objcolor _decoColor_>>16&$FF,_decoColor_>>8&$FF,_decoColor_&$FF
    		if useOnEvent :SetStat objlayer_option:SetRefstr wd: gosub _onEventLabel_
    		if useOnEvent == 0 || stat != -1 {
    			laybtn_ezbox $01000000,$01000000,$01000000,wd,_mesStyle_
    		}
    		return
    	}
    	if lparam == objlayer_cmdterm : if layerbtn_stat == LAYBTN_GROUP_DELETED : if useOnEvent :SetStat -1:SetRefstr "": gosub _onEventLabel_
    	return
    }

    // 一文字消す
    pos pxySkjo(0), pxySkjo(1)
    layerbutton sxySkjo(0), sxySkjo(1), 1007, group, show_in,focus_in,press_in, show_out,focus_out,press_out {
    	laybtn_settings 64,,1
    	if lparam == objlayer_cmddraw {
    		wd = "一字削"
    		// BackSpaceキーを押したときにボタンを押したことにする。(押しっぱなしで連続になるようにする)
    		getkey backsp, 8
    		if mae_backsp != backsp : mae_backsp = backsp : if backsp : backsp_ipa = iparam  ; 押した瞬間のiparamを記憶
    		if backsp && iparam > backsp_ipa {
    			if (iparam - backsp_ipa) < (LAYERBTN_KEY_REPEAT_FRAME@modlaybtn & $FFFF) {
    				backsp = 0
    			}else {
    				if (LAYERBTN_KEY_REPEAT_FRAME@modlaybtn>>16 & $FFFF) == 0 {
    					if (iparam - backsp_ipa)\(LAYERBTN_KEY_REPEAT_FRAME@modlaybtn/2) : backsp = 0
    				}else {
    					if (iparam - backsp_ipa)\(LAYERBTN_KEY_REPEAT_FRAME@modlaybtn>>16 & $FFFF) : backsp = 0
    				}
    			}
    		}
    		// Push (+ BackSpace:SHOW_OUT以降は受け付けないようにする)
    		if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED || (backsp & layerbtn_stat < LAYBTN_SHOW_OUT) {
    			DEL_keybd_inputs keybd_posCursor
    			if keybd_posCursor > 0 : keybd_posCursor-- : keybd_inputs_num--
    			dupptr _out_input, _pOutVar_, 1024, 2
    			_out_input = "" : repeat limit(keybd_inputs_num,,256) : _out_input += keybd_inputs(cnt) : loop
    		}
    		// 描画
    		laybtn_ezbox _col1_,_col2_,_col3_,,,,,,,_r1_,0,0,-2,-2
    		// 文字表示
    		font _fontName_,_fontSize_,_fontStyle_,_fontDecoSize_
    		rgbcolor _fontColor_ : objcolor _decoColor_>>16&$FF,_decoColor_>>8&$FF,_decoColor_&$FF
    		if useOnEvent :SetStat objlayer_option:SetRefstr wd: gosub _onEventLabel_
    		if useOnEvent == 0 || stat != -1 {
    			if _backspace_fontsize_ == 0 {
    				// 文字がはみ出しがちなので、適正サイズを調査
    				_backspace_fontsize_ = 1
    				repeat
    					if _fontSize_-cnt <= 1 : break
    					pos -ginfo_sx, -ginfo_sy
    					font _fontName_,_fontSize_-cnt,_fontStyle_
    					mes wd, _mesStyle_
    					if ginfo_mesx < (0.9*sxySkjo(0)) : _backspace_fontsize_ = _fontSize_-cnt : break
    				loop
    			}
    			font _fontName_,_backspace_fontsize_,_fontStyle_,_fontDecoSize_
    			laybtn_ezbox $01000000,$01000000,$01000000,wd,_mesStyle_
    		}
    		return
    	}
    	if lparam == objlayer_cmdterm : if layerbtn_stat == LAYBTN_GROUP_DELETED : if useOnEvent :SetStat -1:SetRefstr "": gosub _onEventLabel_
    	return
    }

    // 小字゛゜
    pos pxyKomj(0), pxyKomj(1)
    layerbutton sxyKomj(0), sxyKomj(1), 1008, group, show_in,focus_in,press_in, show_out,focus_out,press_out {
    	laybtn_settings 64,,1
    	if lparam == objlayer_cmddraw {
    		wd = "小字 ゛゜"
    		// Push
    		if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED {
    			if keybd_posCursor >= 1 {
    				mae_moji = keybd_inputs(keybd_posCursor-1)
    				repeat 50
    					UpdateDecoCase hiragana, cnt, keybd_inputs(keybd_posCursor-1) : if stat : break
    					UpdateDecoCase katakana, cnt, keybd_inputs(keybd_posCursor-1) : if stat : break
    					if _sx_ < _sy_ {
    						UpdateDecoCase alphabet_tate, cnt, keybd_inputs(keybd_posCursor-1) : if stat : break
    					}else {
    						UpdateDecoCase alphabet_yoko, cnt, keybd_inputs(keybd_posCursor-1) : if stat : break
    					}
    				loop
    				if mae_moji != keybd_inputs(keybd_posCursor-1) {
    					dupptr _out_input, _pOutVar_, 1024, 2
    					_out_input = "" : repeat limit(keybd_inputs_num,,256) : _out_input += keybd_inputs(cnt) : loop
    				}
    			}
    		}
    		// 描画
    		laybtn_ezbox _col1_,_col2_,_col3_,,,,,,,_r1_,0,0,-2,-2
    		// 文字表示
    		font _fontName_,_fontSize_,_fontStyle_,_fontDecoSize_
    		rgbcolor _fontColor_ : objcolor _decoColor_>>16&$FF,_decoColor_>>8&$FF,_decoColor_&$FF
    		if useOnEvent :SetStat objlayer_option:SetRefstr wd: gosub _onEventLabel_
    		if useOnEvent == 0 || stat != -1 {
    			if _komoji_fontSize_ == 0 {
    				// 文字がはみ出しがちなので、適正サイズを調査
    				_komoji_fontSize_ = 1
    				repeat
    					if _fontSize_-cnt <= 1 : break
    					pos -ginfo_sx, -ginfo_sy
    					font _fontName_,_fontSize_-cnt,_fontStyle_
    					mes wd, _mesStyle_
    					if ginfo_mesx < (0.9*sxyKomj(0)) : _komoji_fontSize_ = _fontSize_-cnt : break
    				loop
    			}
    			font _fontName_,_komoji_fontSize_,_fontStyle_,_fontDecoSize_
    			laybtn_ezbox $01000000,$01000000,$01000000,wd,_mesStyle_,,,,,0,(_komoji_fontSize_/3)*(wd=="小字 ゛゜"),0
    		}
    		return
    	}
    	if lparam == objlayer_cmdterm : if layerbtn_stat == LAYBTN_GROUP_DELETED : if useOnEvent :SetStat -1:SetRefstr "": gosub _onEventLabel_
    	return
    }
    return

    *create_cursorkey
    if id_cursorLeft == 0 {
    	// ←
    	pos pxyLeft(0), pxyLeft(1)
    	layerbutton sxyLeft(0), sxyLeft(1), 1009, _group_, _show_in_,_focus_in_,_press_in_, _show_out_,_focus_out_,_press_out_ {
    		laybtn_settings 64,,1
    		if lparam == objlayer_cmddraw {
    			wd = "←"
    			// Push
    			if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED {
    				keybd_posCursor = limit(keybd_posCursor-1, 0, keybd_inputs_num)
    			}
    			// 描画
    			laybtn_ezbox _col1_,_col2_,_col3_,,,,,,,_r1_,0,0,-2,-2
    			// 文字表示
    			font _fontName_,_fontSize_,_fontStyle_,_fontDecoSize_
    			rgbcolor _fontColor_ : objcolor _decoColor_>>16&$FF,_decoColor_>>8&$FF,_decoColor_&$FF
    			if useOnEvent :SetStat objlayer_option:SetRefstr wd: gosub _onEventLabel_
    			if useOnEvent == 0 || stat != -1 {
    				laybtn_ezbox $01000000,$01000000,$01000000,wd,_mesStyle_
    			}
    			return
    		}
    		if lparam == objlayer_cmdterm {
    			id_cursorLeft = 0
    			if layerbtn_stat == LAYBTN_GROUP_DELETED : if useOnEvent :SetStat -1:SetRefstr "": gosub _onEventLabel_
    		}
    		return
    	}
    	id_cursorLeft = stat
    }
    if id_cursorRight == 0 {
    	// →
    	pos pxyRigh(0), pxyRigh(1)
    	layerbutton sxyRigh(0), sxyRigh(1), 1010, _group_, _show_in_,_focus_in_,_press_in_, _show_out_,_focus_out_,_press_out_ {
    		laybtn_settings 64,,1
    		if lparam == objlayer_cmddraw {
    			wd = "→"
    			// Push
    			if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED {
    				keybd_posCursor = limit(keybd_posCursor+1, 0, keybd_inputs_num)
    			}
    			// 描画
    			laybtn_ezbox _col1_,_col2_,_col3_,,,,,,,_r1_,0,0,-2,-2
    			// 文字表示
    			font _fontName_,_fontSize_,_fontStyle_,_fontDecoSize_
    			rgbcolor _fontColor_ : objcolor _decoColor_>>16&$FF,_decoColor_>>8&$FF,_decoColor_&$FF
    			if useOnEvent :SetStat objlayer_option:SetRefstr wd: gosub _onEventLabel_
    			if useOnEvent == 0 || stat != -1 {
    				laybtn_ezbox $01000000,$01000000,$01000000,wd,_mesStyle_
    			}
    			return
    		}
    		if lparam == objlayer_cmdterm {
    			id_cursorRight = 0
    			if layerbtn_stat == LAYBTN_GROUP_DELETED : if useOnEvent :SetStat -1:SetRefstr "": gosub _onEventLabel_
    		}
    		return
    	}
    	id_cursorRight = stat
    }
    return

    // 設定系命令
    #define global ScKeybd_color(%1=$01674523,%2=$01674523,%3=$01674523,%4=$01674523,%5=$01674523,%6=$01674523) ScKeybd_color@modlaybtn_keybd %1,%2,%3,%4,%5,%6
    #deffunc ScKeybd_color@modlaybtn_keybd int col1, int col2, int col3, int col4, int col5, int col6
    	gosub *init
    	if col1 != $01674523 : _col1_ = col1 : if (col1>>24&$FF) == 0 : _col1_ |= $FF000000
    	if col2 != $01674523 : _col2_ = col2 : if (col2>>24&$FF) == 0 : _col2_ |= $FF000000
    	if col3 != $01674523 : _col3_ = col3 : if (col3>>24&$FF) == 0 : _col3_ |= $FF000000
    	if col4 != $01674523 : _col4_ = col4 : if (col4>>24&$FF) == 0 : _col4_ |= $FF000000
    	if col5 != $01674523 : _col5_ = col5 : if (col5>>24&$FF) == 0 : _col5_ |= $FF000000
    	if col6 != $01674523 : _col6_ = col6 : if (col6>>24&$FF) == 0 : _col6_ |= $FF000000
    	return
    #define global ScKeybd_font(%1="___null",%2=-1,%3=-1,%4=-1,%5=-1,%6=-1,%7=-1) ScKeybd_font@modlaybtn_keybd %1,%2,%3,%4,%5,%6,%7
    #deffunc ScKeybd_font@modlaybtn_keybd str fontName, int fontSize, int fontStyle, int fontDecoSize, int fontColor, int decoColor, int mesStyle
    	gosub *init
    	if fontName != "___null" : _fontName_ = fontName
    	if fontSize != -1 : _fontSize_ = fontSize
    	if fontStyle != -1 : _fontStyle_ = fontStyle
    	if fontDecoSize != -1 : _fontDecoSize_ = fontDecoSize
    	if fontColor != -1 : _fontColor_ = fontColor
    	if decoColor != -1 : _decoColor_ = decoColor
    	if mesStyle != -1 : _mesStyle_ = mesStyle
    	return
    #define global ScKeybd_onEvent(%1=-1) _lbl@modlaybtn_keybd=%1 : ScKeybd_onEvent@modlaybtn_keybd
    #deffunc ScKeybd_onEvent@modlaybtn_keybd
    	gosub *init
    	if vartype(_lbl) == 1 {
    		useOnEvent = 1
    		_onEventLabel_ = _lbl
    	}else {
    		useOnEvent = 0
    	}
    	return
    #define global ScKeybd_HiraganaSymbol(%1="",%2="",%3="",%4="",%5="",%6="",%7="",%8="",%9="",%10="",%11="",%12="",%13="",%14="",%15="",%16="",%17="",%18="",%19="",%20="") ScKeybd_HiraganaSymbol@modlaybtn_keybd %1,%2,%3,%4,%5,%6,%7,%8,%9,%10,%11,%12,%13,%14,%15,%16,%17,%18,%19,%20
    #deffunc ScKeybd_HiraganaSymbol@modlaybtn_keybd str w1, str w2, str w3, str w4, str w5, str w6, str w7, str w8, str w9, str w10, str w11, str w12, str w13, str w14, str w15, str w16, str w17, str w18, str w19, str w20
    	gosub *init
    	hiragana_add = w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11,w12,w13,w14,w15,w16,w17,w18,w19,w20
    	return
    #define global ScKeybd_KatakanaSymbol(%1="",%2="",%3="",%4="",%5="",%6="",%7="",%8="",%9="",%10="",%11="",%12="",%13="",%14="",%15="",%16="",%17="",%18="",%19="",%20="") ScKeybd_KatakanaSymbol@modlaybtn_keybd %1,%2,%3,%4,%5,%6,%7,%8,%9,%10,%11,%12,%13,%14,%15,%16,%17,%18,%19,%20
    #deffunc ScKeybd_KatakanaSymbol@modlaybtn_keybd str w1, str w2, str w3, str w4, str w5, str w6, str w7, str w8, str w9, str w10, str w11, str w12, str w13, str w14, str w15, str w16, str w17, str w18, str w19, str w20
    	gosub *init
    	katakana_add = w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11,w12,w13,w14,w15,w16,w17,w18,w19,w20
    	return
    #define global ScKeybd_AlphabetSymbol(%1="",%2="",%3="",%4="",%5="",%6="",%7="",%8="",%9="",%10="",%11="",%12="",%13="",%14="",%15="",%16="",%17="",%18="",%19="",%20="") ScKeybd_AlphabetSymbol@modlaybtn_keybd %1,%2,%3,%4,%5,%6,%7,%8,%9,%10,%11,%12,%13,%14,%15,%16,%17,%18,%19,%20
    #deffunc ScKeybd_AlphabetSymbol@modlaybtn_keybd str w1, str w2, str w3, str w4, str w5, str w6, str w7, str w8, str w9, str w10, str w11, str w12, str w13, str w14, str w15, str w16, str w17, str w18, str w19, str w20
    	gosub *init
    	alphabet_add = w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11,w12,w13,w14,w15,w16,w17,w18,w19,w20
    	return
    #define global Sckeybd_cursor(%1=-3) Sckeybd_cursor@modlaybtn_keybd %1
    #deffunc Sckeybd_cursor@modlaybtn_keybd int p1
    	gosub *init
    	if p1 == -2 {  ; get
    		if _group_ == -1 : return -1
    		if _group_ >= 0 : if laybtn_length(_group_) == 0 : return -1
    		return keybd_posCursor
    	}
    	if p1 == -3 {  ; create (default)
    		useCursor = 1
    		if _group_ == -1 : return
    		if _group_ >= 0 : if laybtn_length(_group_) == 0 : return
    		gosub *create_cursorkey
    		return
    	}
    	if p1 == -4 {  ; clear
    		useCursor = 0
    		if _group_ == -1 : return
    		if _group_ >= 0 : if laybtn_length(_group_) == 0 : return
    		if id_cursorLeft : clrobj id_cursorLeft, id_cursorLeft : id_cursorLeft = 0
    		if id_cursorRight : clrobj id_cursorRight, id_cursorRight : id_cursorRight = 0
    		return
    	}
    	if p1 == -1 {  ; 右端
    		keybd_posCursor = keybd_inputs_num
    		return
    	}else {  ; 指定位置
    		keybd_posCursor = limit(p1, 0, keybd_inputs_num)
    		return
    	}
    	return

    // local命令
    #deffunc local ADD_keybd_inputs int posCursor, str word
    	repeat keybd_inputs_num-posCursor
    		keybd_inputs(keybd_inputs_num-cnt) = keybd_inputs(keybd_inputs_num-1-cnt)
    	loop
    	keybd_inputs(posCursor) = word
    	return
    #deffunc local DEL_keybd_inputs int posCursor
    	if posCursor <= 0 : return
    	repeat keybd_inputs_num-posCursor
    		keybd_inputs(posCursor-1+cnt) = keybd_inputs(posCursor+cnt)
    	loop
    	return
    #deffunc local UpdateDecoCase array _arr, int _cnt2, var word_
    	breaker = 0
    	repeat length2(_arr)
    		if _arr(_cnt2,cnt) == word_ {
    			cnt1 = cnt
    			repeat length2(_arr)-1,1
    				if _arr(_cnt2, (cnt1+cnt)\length2(_arr)) == "" : continue
    				word_ = _arr(_cnt2, (cnt1+cnt)\length2(_arr)) : break
    			loop
    			breaker = 1 : break
    		}
    	loop
    	return breaker
    #deffunc local SetRefstr str word_
    	return word_
    #deffunc local SetStat int p1
    	return p1

    #deffunc split_char@modlaybtn_keybd str __str, array dst
    	if hspstat & $20000 {
    		split_utf8 __str, dst
    	}else {
    		split_sjis __str, dst
    	}
    	return
    #deffunc local split_utf8 str __str, array dst
    	_str = __str
        sdim dst, 32
    	dst_num = 0
        len = strlen(_str)
        i = 0 : count = 0
        repeat
            if i >= len : break
            c = peek(_str, i)
            if c < $80 {
                bytes = 1
            }else : if c < $E0 {
                bytes = 2
            }else : if c < $F0 {
                bytes = 3
            }else : if c < $F8 {
                bytes = 4
            }else : if c < $FC {
                bytes = 5
            }else {
                bytes = 6
    		}
            s = strmid(_str, i, bytes)
            dst(dst_num) = s : dst_num++
            i += bytes : count++
        loop
    	return count
    #deffunc local split_sjis str __str, array dst
    	_str = __str
        sdim dst, 32
    	dst_num = 0
        len = strlen(_str)
        i = 0 : count = 0
        repeat
            if i >= len : break
            c = peek(_str, i)
            if (c >= $81 && c <= $9F) || (c >= $E0 && c <= $FC) {
                bytes = 2
            } else {
                bytes = 1
            }
            s = strmid(_str, i, bytes)
            dst(dst_num) = s : dst_num++
            i += bytes : count++
        loop
    	return count
    #global
    #endif