PDA

Просмотр полной версии : Кириллица имгуи


delanov
06.04.2024, 17:13
Именно когда я хочу вывести вектор микрофонов в имгуи комбо я встречаю типо такого - ???? Realtek(R) Audio

chromiusj
06.04.2024, 17:28
[IMGUI] Русские символы (https://www.blast.hk/threads/39611/)

Здравствуйте форумчане. У меня есть вопрос, как можно сделать поддержку русских символов в Imgui меню. Разрабатываю я его на c++ для игры варфейс. Спасибо за ранее :)

www.blast.hk

delanov
06.04.2024, 17:45
[IMGUI] Русские символы (https://www.blast.hk/threads/39611/)

Здравствуйте форумчане. У меня есть вопрос, как можно сделать поддержку русских символов в Imgui меню. Разрабатываю я его на c++ для игры варфейс. Спасибо за ранее :)

www.blast.hk



Дядя я сказал в С++. Вектор для тебя это прикол?



Дядя я сказал в С++. Вектор для тебя это прикол?


+ вариант выше с вектором не проходит, только если объявлять в самом файле переменную

Dark_Knight
09.04.2024, 22:35
Арик, тебе дали для плюсов. Какие вопросы? Если что функция возращает указатель на созданный шрифт.

delanov
09.04.2024, 23:13
Арик, тебе дали для плюсов. Какие вопросы? Если что функция возращает указатель на созданный шрифт.


Отредактировано было. А еще шрифт не помогает.

Dark_Knight
09.04.2024, 23:18
Отредактировано было. А еще шрифт не помогает.


Не факт, что шрифт имеет такой набор символов или же указан неправильный диапазон

delanov
09.04.2024, 23:38
C++:






HRESULT
getMicrofones
(
)
{
HRESULT hr
;
IMMDeviceEnumerator
*
pEnumerator
=
NULL
;
IMMDeviceCollection
*
pDevices
=
NULL
;
IMMDevice
*
pDevice
=
NULL
;
LPWSTR pwszID
=
NULL
;
IPropertyStore
*
pProps
=
NULL
;
PROPVARIANT varName
;
hr
=
CoInitialize
(
NULL
)
;
if
(
FAILED
(
hr
)
)
{
return
hr
;
}
hr
=
CoCreateInstance
(
__uuidof
(
MMDeviceEnumerator
)
,
NULL
,
CLSCTX_ALL
,
__uuidof
(
IMMDeviceEnumerator
)
,
(
void
*
*
)
&
pEnumerator
)
;
if
(
FAILED
(
hr
)
)
{
CoUninitialize
(
)
;
return
hr
;
}
hr
=
pEnumerator
->
EnumAudioEndpoints
(
eCapture
,
DEVICE_STATE_ACTIVE
,
&
pDevices
)
;
if
(
FAILED
(
hr
)
)
{
pEnumerator
->
Release
(
)
;
CoUninitialize
(
)
;
return
hr
;
}
UINT count
;
hr
=
pDevices
->
GetCount
(
&
count
)
;
if
(
FAILED
(
hr
)
)
{
pDevices
->
Release
(
)
;
pEnumerator
->
Release
(
)
;
CoUninitialize
(
)
;
return
hr
;
}
for
(
UINT i
=
0
;
i

Item
(
i
,
&
pDevice
)
;
if
(
FAILED
(
hr
)
)
{
continue
;
}
hr
=
pDevice
->
GetId
(
&
pwszID
)
;
if
(
FAILED
(
hr
)
)
{
pDevice
->
Release
(
)
;
continue
;
}
hr
=
pDevice
->
OpenPropertyStore
(
STGM_READ
,
&
pProps
)
;
if
(
FAILED
(
hr
)
)
{
CoTaskMemFree
(
pwszID
)
;
pDevice
->
Release
(
)
;
continue
;
}
PropVariantInit
(
&
varName
)
;
hr
=
pProps
->
GetValue
(
PKEY_Device_FriendlyName
,
&
varName
)
;
if
(
FAILED
(
hr
)
)
{
pProps
->
Release
(
)
;
CoTaskMemFree
(
pwszID
)
;
pDevice
->
Release
(
)
;
continue
;
}
size_t size
=
wcslen
(
varName
.
pwszVal
)
+
1
;
char
*
buffer
=
new
char
[
size
]
;
wcstombs
(
buffer
,
varName
.
pwszVal
,
size
)
;
microphones
.
push_back
(
buffer
)
;
PropVariantClear
(
&
varName
)
;
pProps
->
Release
(
)
;
CoTaskMemFree
(
pwszID
)
;
pDevice
->
Release
(
)
;
}
pDevices
->
Release
(
)
;
pEnumerator
->
Release
(
)
;
CoUninitialize
(
)
;
return
S_OK
;
}
std
::
optional

D3D9Present
(
const
decltype
(
PresentHook
)
&
hook
,
IDirect3DDevice9
*
pDevice
,
CONST RECT
*
pSrcRect
,
CONST RECT
*
pDestRect
,
HWND hDestWindow
,
CONST RGNDATA
*
pDirtyRegion
)
{
static
bool
ImGuiInit
{
}
;
if
(
!
ImGuiInit
)
{
ImGui
::
CreateContext
(
)
;
ImGui_ImplWin32_Init
(
*
*
reinterpret_cast

(
0xC17054
)
)
;
ImGui_ImplDX9_Init
(
pDevice
)
;
ImGui
::
GetIO
(
)
.
IniFilename
=
nullptr
;
#pragma warning(push)
#pragma warning(disable: 4996)
std
::
string font
{
getenv
(
"WINDIR"
)
}
;
font
+=
"\\Fonts\\Arialbd.TTF"
;
#pragma warning(pop)
ImGui
::
GetIO
(
)
.
Fonts
->
AddFontFromFileTTF
(
"C:\\Windows\\Fonts\\Arial.ttf"
,
16.5f
,
NULL
,
ImGui
::
GetIO
(
)
.
Fonts
->
GetGlyphRangesCyrillic
(
)
)
;
fontVoice
=
ImGui
::
GetIO
(
)
.
Fonts
->
AddFontFromMemoryTTF
(
monserratbold
,
sizeof
(
monserratbold
)
,
22.0f
,
NULL
,
ImGui
::
GetIO
(
)
.
Fonts
->
GetGlyphRangesCyrillic
(
)
)
;
style
(
)
;
auto
latest_wndproc_ptr
=
GetWindowLongPtrW
(
*
*
reinterpret_cast

(
0xC17054
)
,
GWLP_WNDPROC
)
;
WndProcHook
.
set_dest
(
latest_wndproc_ptr
)
;
WndProcHook
.
set_cb
(
&
WndProc
)
;
WndProcHook
.
install
(
)
;
ImGuiInit
=
{
true
}
;
}
ImGui_ImplDX9_NewFrame
(
)
;
ImGui_ImplWin32_NewFrame
(
)
;
ImGui
::
NewFrame
(
)
;
ImGui
::
Combo
(
u8
"ShowMic"
,
&
selectedMic
,
microphones
.
data
(
)
,
microphones
.
size
(
)
)
;
}
void
main
(
)
{
static
bool
inited
=
false
;
setlocale
(
LC_ALL
,
"rus"
)
;
if
(
!
inited
&&
samp
::
RefChat
(
)
!=
nullptr
)
{
getMicrofones
(
)
;
inited
=
true
;
}
}




где моя ошибка?



Не факт, что шрифт имеет такой набор символов или же указан неправильный диапазон


выше код написал

Dark_Knight
09.04.2024, 23:57
Банально я удивлен как оно у тебя вообще работает хотя не должно, а ну да. В дебаге рендеришь. Короче. переделывай рендер. Насколько я помню, дебаг окно имгуи только стандартный шрифт имгуи юзает. и комбо уже давно устарелая функция.

delanov
09.04.2024, 23:58
Банально Я удивлен как оно у тебя вообще работает хотя не должно, а ну да. В дебаге рендеришь. Короче. переделывай рендер. Насколько я помню, дебаг окно имгуи только стандартный шрифт имгуи юзает. и комбо уже давно устарелая функция.


не дебаг окно, оно внутри имгуи::бегин, и что посоветуешь вместо комбо?

Dark_Knight
10.04.2024, 00:01
не дебаг окно, оно внутри имгуи::бегин, и что посоветуешь вместо комбо?


Документацию и тестовое приложение. У меня уже давно ВСки нет и хз че там. Точно помню, что комбо deprecated

И убери локаль.

delanov
10.04.2024, 00:31
Документацию и тестовое приложение. У меня уже давно ВСки нет и хз че там. Точно помню, что комбо deprecated

https://forum.antichat.xyz/attachments/28481514/
без локаля ситуация еще хуже

Dark_Knight
10.04.2024, 00:34
Я чет не пойму где ты что делаешь? Ты не забывай, что имгуи не windows-1251 текст отображает, а текст скорее всего у тебя получаеться именно в этой кодировке

delanov
10.04.2024, 00:43
Я чет не пойму где ты что делаешь? Ты не забывай, что имгуи не windows-1251 текст отображает, а текст скорее всего у тебя получаеться именно в этой кодировке


Если можешь - отпиши куда-нибудь, я вне форума объясню ситуацию. В профиле ссылки

forgit
20.04.2024, 18:12
параметр /utf-8 добавь

https://forum.antichat.xyz/attachments/28485886/

Vintik
23.04.2024, 17:55
Актуально?

Если да — то скину решение из моего проекта.

delanov
26.04.2024, 11:30
Актуально?
Если да — то скину решение из моего проекта.


Я решил это путем перебора символов кириллицы, но хочу увидеть все решения, буду благодарен)

Vintik
26.04.2024, 11:42
C++:






// в начало кода
#define utf8(a) ConvertStringToImGUI(a.c_str()).c_str()
std
::
string
ConvertStringToImGUI
(
const
char
*
str
)
{
int
wchars_num
=
MultiByteToWideChar
(
CP_ACP
,
0
,
str
,
-
1
,
NULL
,
0
)
;
std
::
wstring wide
;
wide
.
resize
(
wchars_num
)
;
MultiByteToWideChar
(
CP_ACP
,
0
,
str
,
-
1
,
&
wide
[
0
]
,
wchars_num
)
;
std
::
wstring_convert
>
myconv
;
return
myconv
.
to_bytes
(
wide
)
;
}
// вот использование
std
::
string s
=
"абвгд"
;
ImGui
::
Text
(
utf8
(
s
)
)
;




В настройках проекта включена многобайтовая кодировка (не уверен, что она нужна, но просто говорю).

forgit
26.04.2024, 19:12
C++:






// в начало кода
#define utf8(a) ConvertStringToImGUI(a.c_str()).c_str()
std
::
string
ConvertStringToImGUI
(
const
char
*
str
)
{
int
wchars_num
=
MultiByteToWideChar
(
CP_ACP
,
0
,
str
,
-
1
,
NULL
,
0
)
;
std
::
wstring wide
;
wide
.
resize
(
wchars_num
)
;
MultiByteToWideChar
(
CP_ACP
,
0
,
str
,
-
1
,
&
wide
[
0
]
,
wchars_num
)
;
std
::
wstring_convert
>
myconv
;
return
myconv
.
to_bytes
(
wide
)
;
}
// вот использование
std
::
string s
=
"абвгд"
;
ImGui
::
Text
(
utf8
(
s
)
)
;




В настройках проекта включена многобайтовая кодировка (не уверен, что она нужна, но просто говорю).


зачем этой еблей заниматься



параметр /utf-8 добавь