C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
-
Drongo
C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
Доброго всем здоровья. Нужна ваша помощь. Возникла необходимость написать программку, чтобы она работала на Windows XP и Widnwows Vista (если будет работать на Windows 7, будет вообще здорово, но проверить негде... Нет знакомых с семёркой). На ХР работает как часики, а на Vista не совсем. Не отображаются правильно русские символы. Скриншот приложу.
Проверял на Windows Vista Home Premium (SP1). Версия русская.
Получается следующее, интерфейс на русском, и некоторые записи (описания в GroupBox) не отображают правильно кирилицу, а некоторые, на кнопках и переключателях нормально отображают, что сделать - не знаю совсем. Прошу помощи. Английский интерфейс это не вариант потому что там ещё будет ComboBox (при выборе локализации "русская Windows") в котором будет выбор текста на русском, по другому нельзя. Архив проекта прикрепляю, там находится также и исполнимый файл. Программная среда в которой разрабатывается приложение:
Цитата из своего профиля:
Borland C++ Builder 6.0 Enterprise Suite
Проверял на Windows Vista Home Premium (SP1). Версия русская.
Получается следующее, интерфейс на русском, и некоторые записи (описания в GroupBox) не отображают правильно кирилицу, а некоторые, на кнопках и переключателях нормально отображают, что сделать - не знаю совсем. Прошу помощи. Английский интерфейс это не вариант потому что там ещё будет ComboBox (при выборе локализации "русская Windows") в котором будет выбор текста на русском, по другому нельзя. Архив проекта прикрепляю, там находится также и исполнимый файл. Программная среда в которой разрабатывается приложение:
Цитата из своего профиля:
Borland C++ Builder 6.0 Enterprise Suite
- Вложения
-
- Registry.7z
- (222.06 КБ) 0 скачиваний
- Registry.7z
- (222.06 КБ) 0 скачиваний
-
Admiral
Re: C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
Drongo, Кое что могу подсказать. Я тоже как-то разрабатывл програмку (правда на Delphi)
и столкнулся с такой же проблемкой.Из под Виста-кракозябры, из под XP все гуд.Правда не все надписи.Оказалось надо было в свойствах шрифтов выставить CharSet: RUSSIAN_CHARSET.А те которые отображали кракозябры было (ANSI_CHARSET).Но это опять же Delphi, но думаю свойства шрифтов во всех языках одинаковы.
P.S. Глянул вашу програмку из под семерки все гуд (все на русском)!
и столкнулся с такой же проблемкой.Из под Виста-кракозябры, из под XP все гуд.Правда не все надписи.Оказалось надо было в свойствах шрифтов выставить CharSet: RUSSIAN_CHARSET.А те которые отображали кракозябры было (ANSI_CHARSET).Но это опять же Delphi, но думаю свойства шрифтов во всех языках одинаковы.
P.S. Глянул вашу програмку из под семерки все гуд (все на русском)!

-
Dmitrijan
Re: C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
Цитата Dmitrijan:
Оказалось надо было в свойствах шрифтов выставить CharSet: RUSSIAN_CHARSET.А те которые отображали кракозябры было (ANSI_CHARSET).
Сейчас проверим.
Да, действительно, настройка есть, изменил, сейчас попробуем на Vista, отпишусь. А эти настройки не будут влиять на отображение символов в семёрке?
Цитата Dmitrijan:
Глянул вашу програмку из под семерки все гуд (все на русском)!
А если не затруднит, посмотрите, в поле Edit появляется имя учётной записи?
Цитата Dmitrijan:
Но это опять же Delphi, но думаю свойства шрифтов во всех языках одинаковы.
Всё верно.
Оказалось надо было в свойствах шрифтов выставить CharSet: RUSSIAN_CHARSET.А те которые отображали кракозябры было (ANSI_CHARSET).
C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
Сейчас проверим.
Да, действительно, настройка есть, изменил, сейчас попробуем на Vista, отпишусь. А эти настройки не будут влиять на отображение символов в семёрке?Цитата Dmitrijan:
Глянул вашу програмку из под семерки все гуд (все на русском)!
C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
А если не затруднит, посмотрите, в поле Edit появляется имя учётной записи?
Цитата Dmitrijan:
Но это опять же Delphi, но думаю свойства шрифтов во всех языках одинаковы.
C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
Всё верно.

-
Dmitrijan
Re: C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
Цитата Drongo:
А эти настройки не будут влиять на отображение символов в семёрке?
Только что запустил семерку, проверил свою прогу все Ok
Значит и из под Vista и из под Seven настройка работает одинаково - положительно.
Цитата Drongo:
А если не затруднит, посмотрите, в поле Edit появляется имя учётной записи?
Все нормально, имя учетной записи есть (правда у меня учетная запись на англ. "Dmitrijan")
А эти настройки не будут влиять на отображение символов в семёрке?
C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
Только что запустил семерку, проверил свою прогу все Ok
Значит и из под Vista и из под Seven настройка работает одинаково - положительно.Цитата Drongo:
А если не затруднит, посмотрите, в поле Edit появляется имя учётной записи?
C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
Все нормально, имя учетной записи есть (правда у меня учетная запись на англ. "Dmitrijan")

-
Dmitrijan
Re: C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
Цитата Dmitrijan:
(правда у меня учетная запись на англ. "Dmitrijan")
Проверили - русская учётка работает, определяется.
Протестировали на Vista, по вашему совету изменил в свойствах Font -> Charset - значение с DEFAULT_CHARSET на RUSSIAN_CHARSET и всё заработало правильно:
Dmitrijan, Спасибо!!!
Вопрос успешно решён.
P.S. А всё-таки, почему при значении - DEFAULT_CHARSET на семёрке всё ок, а на висте кривовато?
(правда у меня учетная запись на англ. "Dmitrijan")
C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
Проверили - русская учётка работает, определяется.
Протестировали на Vista, по вашему совету изменил в свойствах Font -> Charset - значение с DEFAULT_CHARSET на RUSSIAN_CHARSET и всё заработало правильно:
Dmitrijan, Спасибо!!!
Вопрос успешно решён.P.S. А всё-таки, почему при значении - DEFAULT_CHARSET на семёрке всё ок, а на висте кривовато?
-
Dmitrijan
Re: C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
Цитата Drongo:
P.S. А всё-таки, почему при значении - DEFAULT_CHARSET на семёрке всё ок, а на висте кривовато?
В принципе я не знаю почему так происходит, но думаю в Viste по дефолту стоит другая кодировка, отличающаяся от дефолтной Seven. Но это только мое мнение.
P.S. Очень рад, что у вас все получилось!!!
P.S. А всё-таки, почему при значении - DEFAULT_CHARSET на семёрке всё ок, а на висте кривовато?
C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
В принципе я не знаю почему так происходит, но думаю в Viste по дефолту стоит другая кодировка, отличающаяся от дефолтной Seven. Но это только мое мнение.
P.S. Очень рад, что у вас все получилось!!!

-
Dmitrijan
Re: C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
Здравствуйте, это снова я, но уже с несколько другим вопросом. Вот с русской Windows всё в порядке, а если эту же программу с русским интерфейсом запустить на английской версии? Мне кажется вместо русских символов будут знаки вопроса "?????". Я так понял, что нужно русские шрифты загрузить в проект в ресурсы и использовать шрифт из внутренних ресурсов программы? Но я не знаю как это сделать. Покажите на примере кому не трудно.
AddFontResource
int AddFontResource(LPCTSTR lpszFilename);
Возвращаемое значение
В случае успешного завершения функции возвращается количество добавленных шрифтов, в противном случае возвращается нулевое значение. В Windows NT более подробную информацию об ошибке можно получить, вызвав функцию GetLastError.
Аргументы
lpszFilename - указатель на заканчивающуюся нулем текстовую строку, содержащую корректное имя файла шрифта. Имя файла шрифта имеет расширение .fon для файлов ресурса шрифта, расширение .fnt для файлов шрифта, содержащих битовые образы символов, расширение ttf для файлов шрифтов TrueType и расширение .fot для файлов ресурсов шрифтов TrueType.
Описание Функция AddFontResource позволяет добавить ресурсы шрифта из указанного файла в системную таблицу шрифтов. После этого данный шрифт может быть использован для вывода текста любым приложением Win32. Любые приложения, добавляющие или удаляющие шрифты из системной таблицы шрифтов, извещают об этом другие приложения посылкой сообщения WM_FONTCHANGE всем окнам верхнего уровня в операционной системе. Для посылки этого сообщения приложение должно использовать функцию SendMessage, в аргументе hWnd которой должно стоять значение HWND_BROADCAST. Как только приложение перестает использовать ресурс шрифта, загруженный функцией AddFontResource, оно должно удалить его функцией RemoveFontResource.
Только я всё равно не пойму, как добавить, встроить? шрифт в программу.
читать дальше »
AddFontResource
int AddFontResource(LPCTSTR lpszFilename);
Возвращаемое значение
В случае успешного завершения функции возвращается количество добавленных шрифтов, в противном случае возвращается нулевое значение. В Windows NT более подробную информацию об ошибке можно получить, вызвав функцию GetLastError.
Аргументы
lpszFilename - указатель на заканчивающуюся нулем текстовую строку, содержащую корректное имя файла шрифта. Имя файла шрифта имеет расширение .fon для файлов ресурса шрифта, расширение .fnt для файлов шрифта, содержащих битовые образы символов, расширение ttf для файлов шрифтов TrueType и расширение .fot для файлов ресурсов шрифтов TrueType.
В гугле кое-что нашёл
Описание Функция AddFontResource позволяет добавить ресурсы шрифта из указанного файла в системную таблицу шрифтов. После этого данный шрифт может быть использован для вывода текста любым приложением Win32. Любые приложения, добавляющие или удаляющие шрифты из системной таблицы шрифтов, извещают об этом другие приложения посылкой сообщения WM_FONTCHANGE всем окнам верхнего уровня в операционной системе. Для посылки этого сообщения приложение должно использовать функцию SendMessage, в аргументе hWnd которой должно стоять значение HWND_BROADCAST. Как только приложение перестает использовать ресурс шрифта, загруженный функцией AddFontResource, оно должно удалить его функцией RemoveFontResource.
Только я всё равно не пойму, как добавить, встроить? шрифт в программу.
-
Drongo
Re: C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
Здравствуйте, это снова я, но уже с несколько другим вопросом. Вот с русской Windows всё в порядке, а если эту же программу с русским интерфейсом запустить на английской версии? Мне кажется вместо русских символов будут знаки вопроса "?????". Я так понял, что нужно русские шрифты загрузить в проект в ресурсы и использовать шрифт из внутренних ресурсов программы? Но я не знаю как это сделать. Покажите на примере кому не трудно.
AddFontResource
int AddFontResource(LPCTSTR lpszFilename);
Возвращаемое значение
В случае успешного завершения функции возвращается количество добавленных шрифтов, в противном случае возвращается нулевое значение. В Windows NT более подробную информацию об ошибке можно получить, вызвав функцию GetLastError.
Аргументы
lpszFilename - указатель на заканчивающуюся нулем текстовую строку, содержащую корректное имя файла шрифта. Имя файла шрифта имеет расширение .fon для файлов ресурса шрифта, расширение .fnt для файлов шрифта, содержащих битовые образы символов, расширение ttf для файлов шрифтов TrueType и расширение .fot для файлов ресурсов шрифтов TrueType.
Описание Функция AddFontResource позволяет добавить ресурсы шрифта из указанного файла в системную таблицу шрифтов. После этого данный шрифт может быть использован для вывода текста любым приложением Win32. Любые приложения, добавляющие или удаляющие шрифты из системной таблицы шрифтов, извещают об этом другие приложения посылкой сообщения WM_FONTCHANGE всем окнам верхнего уровня в операционной системе. Для посылки этого сообщения приложение должно использовать функцию SendMessage, в аргументе hWnd которой должно стоять значение HWND_BROADCAST. Как только приложение перестает использовать ресурс шрифта, загруженный функцией AddFontResource, оно должно удалить его функцией RemoveFontResource.
Только я всё равно не пойму, как добавить, встроить? шрифт в программу.
читать дальше »
AddFontResource
int AddFontResource(LPCTSTR lpszFilename);
Возвращаемое значение
В случае успешного завершения функции возвращается количество добавленных шрифтов, в противном случае возвращается нулевое значение. В Windows NT более подробную информацию об ошибке можно получить, вызвав функцию GetLastError.
Аргументы
lpszFilename - указатель на заканчивающуюся нулем текстовую строку, содержащую корректное имя файла шрифта. Имя файла шрифта имеет расширение .fon для файлов ресурса шрифта, расширение .fnt для файлов шрифта, содержащих битовые образы символов, расширение ttf для файлов шрифтов TrueType и расширение .fot для файлов ресурсов шрифтов TrueType.
В гугле кое-что нашёл
Описание Функция AddFontResource позволяет добавить ресурсы шрифта из указанного файла в системную таблицу шрифтов. После этого данный шрифт может быть использован для вывода текста любым приложением Win32. Любые приложения, добавляющие или удаляющие шрифты из системной таблицы шрифтов, извещают об этом другие приложения посылкой сообщения WM_FONTCHANGE всем окнам верхнего уровня в операционной системе. Для посылки этого сообщения приложение должно использовать функцию SendMessage, в аргументе hWnd которой должно стоять значение HWND_BROADCAST. Как только приложение перестает использовать ресурс шрифта, загруженный функцией AddFontResource, оно должно удалить его функцией RemoveFontResource.
Только я всё равно не пойму, как добавить, встроить? шрифт в программу.
-
Dmitrijan
Re: C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
Цитата Dmitrijan:
В Delphi шрифты включал, помню как, а вот СИ++ извеняйте не работал в нем, могу написать как в Delphi если надо
Конечно надо.
Во всяком случае можно будет хоть попробовать понять. Если можно с комментариями.
В Delphi шрифты включал, помню как, а вот СИ++ извеняйте не работал в нем, могу написать как в Delphi если надо
C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
Конечно надо.
Во всяком случае можно будет хоть попробовать понять. Если можно с комментариями.-
Dmitrijan
Re: C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
Drongo, Вот я включал шрифт по такой инструкции:
Включение шрифта в ваш EXE:
Создайте в текстовом редакторе файл с расширением *.rc , описывающий шрифт:
MY_FONT ANYOL1 "Bauhs93.ttf"
Первые два параметра могут быть любыми. Они будут использоваться в программе
позже.
Затем для создания *.res файла используйте компилятор командной строки BRCC32.EXE, поставляемый с Delphi. Если ваш файл на этапе 1 был назван MyFont.rc, командная строка в сеансе DOS должна выглядеть так:
BRCC32 MyFont
Программа добавит в компилируемый файл созданный ресурс .rc и создаст файл с тем же именем, за исключением расширения, которое будет .res: MyFont.res
В вашей программе добавьте директиву компилятора, чтобы включить вновь созданный файл:
{$R MyFont.res}
Правильным будет разместить его в секции реализации после строчки {$R *.DFM}.
Добавьте процедуру создания файла из ресурса, делающим шрифт доступным для использования. Пример:
procedure TForm1.FormCreate(Sender: TObject);
var
Res : TResourceStream;
begin
Res := TResourceStream.Create(hInstance, 'MY_FONT', Pchar('ANYOL1'));
Res.SavetoFile('Bauhs93.ttf');
Res.Free;
AddFontResource(PChar('Bauhs93.ttf'));
SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
end;
программное удаление шрифта:
procedure TForm1.FormDestroy(Sender: TObject);
begin
RemoveFontResource(PChar("Bauhs93.ttf"))
SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
end;
Извените, но больше сегодня не смогу написать, конец рабочего дня
Включение шрифта в ваш EXE:
Создайте в текстовом редакторе файл с расширением *.rc , описывающий шрифт:
MY_FONT ANYOL1 "Bauhs93.ttf"
Первые два параметра могут быть любыми. Они будут использоваться в программе
позже.
Затем для создания *.res файла используйте компилятор командной строки BRCC32.EXE, поставляемый с Delphi. Если ваш файл на этапе 1 был назван MyFont.rc, командная строка в сеансе DOS должна выглядеть так:
BRCC32 MyFont
Программа добавит в компилируемый файл созданный ресурс .rc и создаст файл с тем же именем, за исключением расширения, которое будет .res: MyFont.res
В вашей программе добавьте директиву компилятора, чтобы включить вновь созданный файл:
{$R MyFont.res}
Правильным будет разместить его в секции реализации после строчки {$R *.DFM}.
Добавьте процедуру создания файла из ресурса, делающим шрифт доступным для использования. Пример:
procedure TForm1.FormCreate(Sender: TObject);
var
Res : TResourceStream;
begin
Res := TResourceStream.Create(hInstance, 'MY_FONT', Pchar('ANYOL1'));
Res.SavetoFile('Bauhs93.ttf');
Res.Free;
AddFontResource(PChar('Bauhs93.ttf'));
SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
end;
программное удаление шрифта:
procedure TForm1.FormDestroy(Sender: TObject);
begin
RemoveFontResource(PChar("Bauhs93.ttf"))
SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
end;
Извените, но больше сегодня не смогу написать, конец рабочего дня