directx11のアプリケーションにimguiというオープンソースのGUIフレームワークを導入したときのメモです
https://github.com/ocornut/imgui
とりあえず動かすには?
directx11のサンプルプロジェクトにあるimgui_impl_dx11.{h,cpp}
を自分のプロジェクトに取り込んで、初期化等すればとりあえず動く
初期化
ウィンドウハンドルとdirectx11のデバイス、デバイスコンテキストを渡せば初期化完了
ImGui_ImplDX11_Init(g_hWnd, g_pd3dDevice, g_pImmediateContext);
描画前準備
imguiのウィジェットを描画登録する前(ゲームループの初めとか)に↓を記述する
これがないとクラッシュする
ImGui_ImplDX11_NewFrame();
ウィンドウに文字列を表示する
Beginの第一引数がウィンドウを識別するIDになっており、Endされるまでは、Beginで指定したIDのウィンドウにウィジェットが追加される
ImGui::SetNextWindowSize(ImVec2(320, 100), ImGuiSetCond_Once);
ImGui::Begin("hoge", &show_another_window);
ImGui::Text("fugafuga");
ImGui::End();
描画
Presentが実行される前に↓
ImGui::Render();
後処理
解放は忘れずに
ImGui_ImplDX11_Shutdown();
以下は少しでも躓いた所
描画されるけどマウスで操作できない
ウィンドウプロシージャでImGui_ImplDX11_WndProcHandler
を呼び出す
サンプルでは↓のように使われていた
if (ImGui_ImplDX11_WndProcHandler(hWnd, msg, wParam, lParam))
return true;
SetNextWindowSizeでサイズを指定しているが変更されない
定義は↓のようになっており、第二引数でサイズを設定する条件を指定できるようだった
ImGui::SetNextWindowSize(const ImVec2& size, ImGuiSetCond cond)
全部で4種類の条件が設定できる
条件 | 説明 |
---|---|
ImGuiSetCond_Always | 常に設定する |
ImGuiSetCond_Once | アプリケーションを起動する度に一度だけ設定する |
ImGuiSetCond_FirstUseEver | 設定ファイルがない場合に設定する(一度設定すると設定ファイルが作成されるので、以降はファイルの内容が反映される) |
ImGuiSetCond_Appearing | 表示/非表示の切り替え時のみ設定する(イマイチ用途が不明) |
これらの条件の内ImGuiSetCond_FirstUseEver
を最初に使っていたので、アプリケーションを起動しなおしてもサイズが設定されなくなっていた
日本語フォントを読み込んでいるはずなのに表示されない
最初はこのように読み込んでいた
ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontDefault();
io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\meiryo.ttc", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
実装を追っていないが、AddFontDefault
を抜くと日本語フォントで表示された
ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\meiryo.ttc", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
半角文字はデフォルトのままにしたかった
上記の方法で読み込むと、半角英数までメイリオフォントになってしまい、少し見づらかった
↓のようにすると、日本語フォントのみを上書きしてくれる
ImGuiIO& io = ImGui::GetIO();
ImFontConfig config;
config.MergeMode = true;
io.Fonts->AddFontDefault();
io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\meiryo.ttc", 18.0f, &config, io.Fonts->GetGlyphRangesJapanese());
一部の日本語が?と表示される
以下のQiitaを参考に解消
http://qiita.com/benikabocha/items/a25571c1b059eaf952de