フローティングウインドウ – FlyWithLua

2023年3月25日

フローティングウインドウを使うときの位置を決める関数
dWidth, dHeight = float_wnd_get_dimensions(gps2w_wnd)
winLeft, winTop, winRight, winBottom = float_wnd_get_geometry(gps2w_wnd)

float_wnd_set_onclose()を使ったウインドウ

test_wnd = float_wnd_create(200, 200, 1, false)

test_wnd = float_wnd_create(200, 200, 1, false)
float_wnd_set_title(test_wnd, "gps2w_xp11")
float_wnd_set_position(test_wnd, 180, 150)
float_wnd_set_ondraw(test_wnd, "test_ondraw")
float_wnd_set_onclick(test_wnd, "gps2w_onclick")
float_wnd_set_onclose(test_wnd, "gps2w_onclose")

function test_ondraw(test_wnd, x, y)

end

-- window close
function gps2w_onclose(test_wnd)
    float_wnd_destroy(test_wnd)
end

test_wnd = float_wnd_create(200, 100, 1, true)、縁が入る。

float_wnd_set_imgui_builder()を使ったウインドウ

注意! test_wnd = float_wnd_create(200, 100, 1, false)、にするとエラーになる。

test_wnd = float_wnd_create(200, 100, 1, true)、縁が入る。

float_wnd_set_ondraw()で常に左上にテキストを表示

float_wnd_set_ondraw()は基本左下が起点となるので、上からテキストを並べるのが面倒になる。
必ず、xyは入れる必要がある。これが無いと右上のボタンを押した時にテキストや四角の描画等が消えてしまうので、それとxの方はデフォルトで左から起点になるのでwinLeftは要らない、高さが逆になる必要があるのでyの後に「dHeight」を必ず必要。これで左上から配置でき、右上のボタンをクリックしてもテキストが消えることはない。位置もピッタリ揃う。
※しかし、このやり方は時々、修正したりしてFlyWithLuaを再読み込みしたりするときにクラッシュすることがある。単に使うだけなら問題ないようだ。

ウインドウにテキストを表示する場合xyで位置を取得して表示するのだが、これは左下が起点になるので、テキストは左下に表示され、ウインドウの変化に従事して常に左下に表示される。
それでは左上に表示する場合はどうするか。

dWidth, dHeight = float_wnd_get_dimensions(test_wnd) を使う

ウインドウの大きさを変えても赤文字の位置が変化しない。表示されている数値「181」と「304」は下の13行目、「dHeight」の数値を表示している。つまり現在のウインドウの高さである。ウインドウを広げるとリアルタイムに数値が変化する。

yの位置は下になるので、「dHeight」の高さをプラスすると上の位置がテキスト表示位置になる。ウインドウを変化させても常に高さを取得しているので上から同じ位置にテキストを表示できる。

local test_wnd = nil                                                         -- window handle
local winLeft, winTop, winRight, winBottom = 0, 0, 0, 0                      -- float_wnd_get_geometry
local dWidth, dHeight = 0, 0                                                 -- float_wnd_get_dimensions

-- functions ------------------------------------------------------------------
function gps2w_ondraw(test_wnd, x, y)
    dWidth, dHeight = float_wnd_get_dimensions(test_wnd)
    winLeft, winTop, winRight, winBottom = float_wnd_get_geometry(test_wnd)

    -- draw box around window
    XPLMSetGraphicsState(0, 0, 0, 1, 1, 0, 0)
    --graphics.set_color(1, 1, 1, 0.3)
    draw_string(x + 0, y + dHeight, dHeight, "red")
end -- function gps2w_ondraw

-- window close
function gps2w_onclose(test_wnd)
    float_wnd_destroy(test_wnd)
end

test_wnd = float_wnd_create(171, 362, 1, true)
float_wnd_set_title(test_wnd, "gps2w_xp11")
float_wnd_set_position(test_wnd, 180, 150)
float_wnd_set_ondraw(test_wnd, "gps2w_ondraw")
float_wnd_set_onclose(test_wnd, "gps2w_onclose")

ウインドウの右端にテキストを追従させてたい場合は、xに「dWidth」を追加すると良い。

四角とテキストを描画

クリックの範囲で「y」のマイナスが大きい程、小さい値になることに注意が必要。これを逆にするといくらクリックしても動作しない。

-- functions ------------------------------------------------------------------
function test_ondraw(test_wnd, x, y)
    dWidth, dHeight = float_wnd_get_dimensions(test_wnd)
    winLeft, winTop, winRight, winBottom = float_wnd_get_geometry(test_wnd)

    -- draw box around window
    XPLMSetGraphicsState(0, 0, 0, 1, 1, 0, 0)

    graphics.set_color(1, 1, 1, 0.3)
    graphics.draw_rectangle(x + 0, y + dHeight - 0, x + 80, y + dHeight - 30) --長方形を描く
    draw_string(x + 0, y + dHeight - 20, "日本語が使える", "red")
end -- function test_ondraw

function test_onclick(test_wnd, x, y, state)
    -- ボタンダウンアクション
    if (state == 1) then
        --ここでyはマイナスの値が大きい方小さいことに注意!。逆になるとクリックが機能しない。
        if (x >= 0 and x <= 80 and y >= dHeight - 30 and y <= dHeight - 0) then
            command_once("sim/flight_controls/brakes_toggle_max")
        end
    end -- if state
end  -- function test_onclick

-- window close
function test_onclose(test_wnd)
    float_wnd_destroy(test_wnd)
end

test_wnd = float_wnd_create(200, 100, 1, false)
float_wnd_set_title(test_wnd, "gps2w_xp11")
float_wnd_set_position(test_wnd, 180, 150)
float_wnd_set_ondraw(test_wnd, "test_ondraw")
float_wnd_set_onclick(test_wnd, "test_onclick")
float_wnd_set_onclose(test_wnd, "test_onclose")