Edited at

directx11のアプリケーションにimguiを導入した際のメモ

More than 1 year has passed since last update.

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