英数字をキーボードから入力でき、カーソルも表示、deleteキーでテキストも削除できる。float_wnd_set_ondrawなのだが、日本語が使えない。コピー&ペーストができない。
多分フォント指定で「Helvetica_12」を使っているから。日本語はフォントを指定したらだめ。
function PoloInput_get() でキーボードからの入力を取得。function gPoloInput_ondraw で入力ボックスを作成表示している。
function PoloInput_onclick()はクリックするために必要。103行目のfalseはその上で設定した範囲内をクリックした場合、赤色カーソルがボックスに出現。
trueにするとウインドウのどこでもクリックすると赤色のカーソルがボックスに出現する。
複数のボックスを作成する場合はfalseにしないと全部のボックスにカーソルが出現することになる。
-- ユーザー入力行の初期設定
local inputLine = { value = "", data = "", state = false, pos = 0, latlon = false, len = 0 } --配列で初期設定している。
local PoloTest_wnd = nil -- ウインドウのハンドル、最初は空
local dWidth, dHeight = 0, 0 -- ウインドウの端と高さの起点
----------------------------------------------------------------------------
-- 入力行からユーザー入力データを取得する関数
function PoloInput_get()
-- inputLine.state とは上の宣言文、inputLineのstateを使うということになる。つまり inputLine.state = false となる。
if (inputLine.state and KEY_ACTION == "pressed") then -- falseの状態でキーを押した時のアクション
RESUME_KEY = true
-- 27 = escape(このキーを使うとボックスそのものが消えてしまう)使ってはダメ
if (VKEY == 27) then
keyboard_focus_reset()
RESUME_KEY = false
return
end
-- 8 = delete(このキーを使って入力した文字を削除することができる)8=BackSpaceキー(Windows)
if (VKEY == 8) then
if (inputLine.data ~= "") then --空文字でない場合
--string.subは入力されたinputLine.dataの1つ目を選択、文字の長さを取得して、カーソルは1つ後なので -1で1字戻って最後の文字までを選択することになる
--簡単に言うとこれが入力された文字を全て選択した状態になる。
inputLine.data = string.sub(inputLine.data, 1, string.len(inputLine.data) - 1)
else
inputLine.data = ""
end
inputLine.value = inputLine.data
return
end
-- enter(このキーを使って入力した文字を消すことができる)13=←キー
if (VKEY == 13) then
inputLine.data = "" --空文字にする
inputLine.state = false --エンターキーでボックスを入力不可にする(ボックスクリックで可能になる)
return
end
-- 他に何か
--inputLine.data = string.upper(inputLine.data) .. string.upper(CKEY)--string.upperは大文字に変換
--inputLine.data = string.lower(inputLine.data) .. string.lower(CKEY)--string.lowerは大文字に変換
inputLine.data = tostring(inputLine.data) .. tostring(CKEY) --キーで選択した大文字、小文字通りを表示する
inputLine.value = inputLine.data
-- ドル記号($)はラトロン(緯度経度)を示します
if (string.find(inputLine.value, "%$") ~= nil) then inputLine.latlon = true end
end
end
--ウインドウ内の描画関数-------------------------------------------------------------------------------
-- float_wnd_set_ondraw()の関数
-- xとyはウィンドウの原点、つまり左下です。xは右に増加し、yは上に増加します。
function gPoloInput_ondraw(PoloTest_wnd, x, y)
-- returns window size
dWidth, dHeight = float_wnd_get_dimensions(PoloTest_wnd)
-- draw box around window
XPLMSetGraphicsState(0, 0, 0, 1, 1, 0, 0)
--重要 テキストボックス作成----------------------------------------------------------------
-- データ入力領域を描画します
glColor4f(1, 1, 1, 0.25) -- gray background
glRectf(x + 28, y + dHeight - 24, x + 165, y + dHeight - 9) --dHeightによって上が基準、これが無いと下が基準になる
glColor4f(1, 1, 1, 1) -- white text
-- inputLine.dataのグラフィカルな長さに基づいて文字数を制限する
if (measure_string(inputLine.data, "Helvetica_12") < 139) then --measure=測定、inputLine.data=入力された文字列を数え、139より小さくする
inputLine.len = string.len(inputLine.data)
end
--ボックス内のテキスト書体
--string.subには入力された文字烈が入る
draw_string_Helvetica_12(x + 30, y + dHeight - 21, string.sub(inputLine.data, 1, inputLine.len))
glColor4f(1, 0, 0, 1) -- 左端のマゼンタカーソル色
glBegin_LINES() --ラインを描画
if (inputLine.state) then --入力ラインをクリックされたら
local cursize = measure_string(inputLine.data, "Helvetica_12") --measure=測定、inputLine.data=入力された文字列
--cursizeは文字列をバイト数(英語は1文字 1バイト)
if (cursize > 137) then
cursize = 137 --文字数の制限
end
inputLine.pos = x + 30 + cursize --カーソル入力ラインの表示位置、最後のcursizeは文字数が増えるのでカーソル位置が移動する
glVertex2f(inputLine.pos, y + dHeight - 9) --縦長カーソルの上の位置
glVertex2f(inputLine.pos, y + dHeight - 24) --縦長カーソルの下の位置
end
glEnd() --OpenGL Graphicsの最後に入れる
draw_string(x + 30, y + 10, inputLine.value, 0, 1, 0) --入力された文字列をウインドウのどこかに表示
end -- function gPoloInput_ondraw
-----------------------------------------------------------------------------------------------------
--クリック動作-----------------------------------------------------------------------------------------
--float_wnd_set_onclick()の関数
--xとyは、ウィンドウの原点、つまり左下からの相対値です。state:1 =マウスを下にクリック、2 =マウスをドラッグ、3 =マウスを上に
function PoloInput_onclick(PoloTest_wnd, x, y, state)
-- state=1 はボタンダウンのクリックイベント
if (state == 1) then
if (x >= 28 and x <= 165 and y >= dHeight - 24 and y <= dHeight - 9) then --カーソル表示のクリック範囲(ウインドウ内)
inputLine.state = true --入力ができる状態
else
inputLine.state = true --false、上の範囲以外をクリックした場合入力できない。trueにするとウインドウのどこかをクリックすると入力できる。
end
end
end -- function PoloInput_onclick
--クリック動作-----------------------END---------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-- window close
function PoloInput_onclose(PoloTest_wnd)
float_wnd_destroy(PoloTest_wnd) --ウインドウを閉じる(destroy=無くす)
end
-- ウィンドウとサポートメソッドを作成する
PoloTest_wnd = float_wnd_create(200, 100, 1, true)
float_wnd_set_title(PoloTest_wnd, "Input Box")
float_wnd_set_position(PoloTest_wnd, 180, 150)
float_wnd_set_ondraw(PoloTest_wnd, "gPoloInput_ondraw")
float_wnd_set_onclick(PoloTest_wnd, "PoloInput_onclick")
float_wnd_set_onclose(PoloTest_wnd, "PoloInput_onclose")
-- ユーザー入力データを取得するためのもの(必須)
do_on_keystroke("PoloInput_get()")
リターンキーで入力したテキストを表示
上と違って、テキスト入力後、リターン(Mac?)キーで下に文字を(表示出力)する。
入力時は下にテキストは表示されない。表示されたときがリターンキーを押した時になる。
34行目の「VKEY == 13」と90行目の設定が上と違っている。これによりリターンキーを押すと入力された文字が下に表示されることになる。どこか別のところに出力するのに役に立つかも。
-- ユーザー入力行の初期設定
local inputLine = { value = "", data = "", state = false, pos = 0, latlon = false, len = 0 } --配列で初期設定している。
local PoloTest_wnd = nil -- ウインドウのハンドル、最初は空
local dWidth, dHeight = 0, 0 -- ウインドウの端と高さの起点
----------------------------------------------------------------------------
-- 入力行からユーザー入力データを取得する関数
function PoloInput_get()
-- inputLine.state とは上の宣言文、inputLineのstateを使うということになる。つまり inputLine.state = false となる。
if (inputLine.state and KEY_ACTION == "pressed") then -- falseの状態でキーを押した時のアクション
RESUME_KEY = true
-- 27 = escape(このキーを使うとボックスそのものが消えてしまう)使ってはダメ
if (VKEY == 27) then
keyboard_focus_reset()
RESUME_KEY = false
return
end
-- 8 = delete(このキーを使って入力した文字を削除することができる)8=BackSpaceキー(Windows)
if (VKEY == 8) then
if (inputLine.data ~= "") then --空文字でない場合
--string.subは入力されたinputLine.dataの1つ目を選択、文字の長さを取得して、カーソルは1つ後なので -1で1字戻って最後の文字までを選択することになる
--簡単に言うとこれが入力された文字を全て選択した状態になる。
inputLine.data = string.sub(inputLine.data, 1, string.len(inputLine.data) - 1)
else
inputLine.data = ""
end
inputLine.value = inputLine.data
return
end
-- enter(このキーを使って入力した文字を消すことができる)13=←キー
if (VKEY == 13) then
--inputLine.data = "" --空文字にする
inputLine.data = inputLine.data --これでもいい?テキストを残す
return
end
-- 他に何か
--inputLine.data = string.upper(inputLine.data) .. string.upper(CKEY)--string.upperは大文字に変換
--inputLine.data = string.lower(inputLine.data) .. string.lower(CKEY)--string.lowerは大文字に変換
inputLine.data = tostring(inputLine.data) .. tostring(CKEY) --キーで選択した大文字、小文字通りを表示する
inputLine.value = inputLine.data
-- ドル記号($)はラトロン(緯度経度)を示します
if (string.find(inputLine.value, "%$") ~= nil) then inputLine.latlon = true end
end
end
--ウインドウ内の描画関数-------------------------------------------------------------------------------
-- float_wnd_set_ondraw()の関数
-- xとyはウィンドウの原点、つまり左下です。xは右に増加し、yは上に増加します。
function gPoloInput_ondraw(PoloTest_wnd, x, y)
-- returns window size
dWidth, dHeight = float_wnd_get_dimensions(PoloTest_wnd)
-- draw box around window
XPLMSetGraphicsState(0, 0, 0, 1, 1, 0, 0)
--重要 テキストボックス作成----------------------------------------------------------------
-- データ入力領域を描画します
glColor4f(1, 1, 1, 0.25) -- gray background
glRectf(x + 28, y + dHeight - 24, x + 165, y + dHeight - 9) --dHeightによって上が基準、これが無いと下が基準になる
glColor4f(1, 1, 1, 1) -- white text
-- inputLine.dataのグラフィカルな長さに基づいて文字数を制限する
if (measure_string(inputLine.data, "Helvetica_12") < 139) then --measure=測定、inputLine.data=入力された文字列を数え、139より小さくする
inputLine.len = string.len(inputLine.data)
end
--ボックス内のテキスト書体
--string.subには入力された文字烈が入る
draw_string_Helvetica_12(x + 30, y + dHeight - 21, string.sub(inputLine.data, 1, inputLine.len))
glColor4f(1, 0, 0, 1) -- 左端のマゼンタカーソル色
glBegin_LINES() --ラインを描画
if (inputLine.state) then --入力ラインをクリックされたら
local cursize = measure_string(inputLine.data, "Helvetica_12") --measure=測定、inputLine.data=入力された文字列
--cursizeは文字列をバイト数(英語は1文字 1バイト)
if (cursize > 137) then
cursize = 137 --文字数の制限
end
inputLine.pos = x + 30 + cursize --カーソル入力ラインの表示位置、最後のcursizeは文字数が増えるのでカーソル位置が移動する
glVertex2f(inputLine.pos, y + dHeight - 9) --縦長カーソルの上の位置
glVertex2f(inputLine.pos, y + dHeight - 24) --縦長カーソルの下の位置
end
glEnd() --OpenGL Graphicsの最後に入れる
--入力されたテキストをボックスの外に表示(但しリターンキーを押した時に表示)
if (VKEY == 13) then --13はリターンキー(Mac?)
draw_string(x + 30, y + 10, inputLine.value, 0, 1, 0) --入力された文字列をウインドウのどこかに表示
end
end -- function gPoloInput_ondraw
-----------------------------------------------------------------------------------------------------
--クリック動作-----------------------------------------------------------------------------------------
--float_wnd_set_onclick()の関数
--xとyは、ウィンドウの原点、つまり左下からの相対値です。state:1 =マウスを下にクリック、2 =マウスをドラッグ、3 =マウスを上に
function PoloInput_onclick(PoloTest_wnd, x, y, state)
-- state=1 はボタンダウンのクリックイベント
if (state == 1) then
if (x >= 28 and x <= 165 and y >= dHeight - 24 and y <= dHeight - 9) then --カーソル表示のクリック範囲(ウインドウ内)
inputLine.state = true --入力ができる状態
else
inputLine.state = false --false、上の範囲以外をクリックした場合入力できない。trueにするとウインドウのどこかをクリックすると入力できる。
end
end
end -- function PoloInput_onclick
--クリック動作-----------------------END---------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-- window close
function PoloInput_onclose(PoloTest_wnd)
float_wnd_destroy(PoloTest_wnd) --ウインドウを閉じる(destroy=無くす)
end
-- ウィンドウとサポートメソッドを作成する
PoloTest_wnd = float_wnd_create(200, 100, 1, true)
float_wnd_set_title(PoloTest_wnd, "Input Box")
float_wnd_set_position(PoloTest_wnd, 180, 150)
float_wnd_set_ondraw(PoloTest_wnd, "gPoloInput_ondraw")
float_wnd_set_onclick(PoloTest_wnd, "PoloInput_onclick")
float_wnd_set_onclose(PoloTest_wnd, "PoloInput_onclose")
-- ユーザー入力データを取得するためのもの(必須)
do_on_keystroke("PoloInput_get()")
残念ながら、日本語が使えない、リターンキーで改行しての入力ができない。というより方法がわからないのかも。