|
@@ -457,15 +457,25 @@
|
|
|
|
|
|
Q: How can I display and input non-Latin characters such as Chinese, Japanese, Korean, Cyrillic?
|
|
|
A: When loading a font, pass custom Unicode ranges to specify the glyphs to load.
|
|
|
- All your strings needs to use UTF-8 encoding. Specifying literal in your source code using a local code page (such as CP-923 for Japanese or CP-1251 for Cyrillic) will not work.
|
|
|
- In C++11 you can encode a string literal in UTF-8 by using the u8"hello" syntax. Otherwise you can convert yourself to UTF-8 or load text data from file already saved as UTF-8.
|
|
|
- You can also try to remap your local codepage characters to their Unicode codepoint using font->AddRemapChar(), but international users may have problems reading/editing your source code.
|
|
|
|
|
|
- io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels, NULL, io.Fonts->GetGlyphRangesJapanese()); // Load Japanese characters
|
|
|
- io.Fonts->GetTexDataAsRGBA32() or GetTexDataAsAlpha8()
|
|
|
- io.ImeWindowHandle = MY_HWND; // To input using Microsoft IME, give ImGui the hwnd of your application
|
|
|
-
|
|
|
- As for text input, depends on you passing the right character code to io.AddInputCharacter(). The example applications do that.
|
|
|
+ // Add default Japanese ranges
|
|
|
+ io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels, NULL, io.Fonts->GetGlyphRangesJapanese());
|
|
|
+
|
|
|
+ // Or create your own custom ranges (e.g. for a game you can feed your entire game script and only build the characters the game need)
|
|
|
+ ImVector<ImWchar> ranges;
|
|
|
+ ImFontAtlas::GlyphRangesBuilder builder;
|
|
|
+ builder.AddText("Hello world"); // Add a string (here "Hello world" contains 7 unique characters)
|
|
|
+ builder.AddChar(0x7262); // Add a specific character
|
|
|
+ builder.AddRanges(io.Fonts->GetGlyphRangesJapanese()); // Add one of the default ranges
|
|
|
+ builder.BuildRanges(&ranges); // Build the final result (ordered ranges with all the unique characters submitted)
|
|
|
+ io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels, NULL, ranges.Data);
|
|
|
+
|
|
|
+ All your strings needs to use UTF-8 encoding. In C++11 you can encode a string literal in UTF-8 by using the u8"hello" syntax.
|
|
|
+ Specifying literal in your source code using a local code page (such as CP-923 for Japanese or CP-1251 for Cyrillic) will NOT work!
|
|
|
+ Otherwise you can convert yourself to UTF-8 or load text data from file already saved as UTF-8.
|
|
|
+
|
|
|
+ Text input: it is up to your application to pass the right character code to io.AddInputCharacter(). The applications in examples/ are doing that.
|
|
|
+ For languages using IME, on Windows you can copy the Hwnd of your application to io.ImeWindowHandle. The default implementation of io.ImeSetInputScreenPosFn() on Windows will set your IME position correctly.
|
|
|
|
|
|
Q: How can I preserve my ImGui context across reloading a DLL? (loss of the global/static variables)
|
|
|
A: Create your own context 'ctx = CreateContext()' + 'SetCurrentContext(ctx)' and your own font atlas 'ctx->GetIO().Fonts = new ImFontAtlas()' so you don't rely on the default globals.
|