C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели

Аватара пользователя
Drongo

C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели

Сообщение Drongo »

Доброго всем здоровья. Нужна ваша помощь. Возникла необходимость написать программку, чтобы она работала на Windows XP и Widnwows Vista (если будет работать на Windows 7, будет вообще здорово, но проверить негде... Нет знакомых с семёркой). На ХР работает как часики, а на Vista не совсем. Не отображаются правильно русские символы. Скриншот приложу.







Проверял на 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 приложениях независимо от настроек в контрольной панели

Сообщение Admiral »

Drongo, Кое что могу подсказать. Я тоже как-то разрабатывл програмку (правда на Delphi)

и столкнулся с такой же проблемкой.Из под Виста-кракозябры, из под XP все гуд.Правда не все надписи.Оказалось надо было в свойствах шрифтов выставить CharSet: RUSSIAN_CHARSET.А те которые отображали кракозябры было (ANSI_CHARSET).Но это опять же Delphi, но думаю свойства шрифтов во всех языках одинаковы.

P.S. Глянул вашу програмку из под семерки все гуд (все на русском)! Изображение
Аватара пользователя
Dmitrijan

Re: C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели

Сообщение Dmitrijan »

Цитата Dmitrijan:



Оказалось надо было в свойствах шрифтов выставить 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 приложениях независимо от настроек в контрольной панели

Сообщение Dmitrijan »

Цитата Drongo:



А эти настройки не будут влиять на отображение символов в семёрке?
C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели




Только что запустил семерку, проверил свою прогу все Ok Изображение Значит и из под Vista и из под Seven настройка работает одинаково - положительно.


Цитата Drongo:



А если не затруднит, посмотрите, в поле Edit появляется имя учётной записи?
C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели




Все нормально, имя учетной записи есть (правда у меня учетная запись на англ. "Dmitrijan") Изображение
Аватара пользователя
Dmitrijan

Re: C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели

Сообщение Dmitrijan »

Цитата Dmitrijan:



(правда у меня учетная запись на англ. "Dmitrijan")
C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели




Проверили - русская учётка работает, определяется.

Протестировали на Vista, по вашему совету изменил в свойствах Font -> Charset - значение с DEFAULT_CHARSET на RUSSIAN_CHARSET и всё заработало правильно:







Dmitrijan, Спасибо!!! Изображение Изображение Изображение Изображение Вопрос успешно решён.



P.S. А всё-таки, почему при значении - DEFAULT_CHARSET на семёрке всё ок, а на висте кривовато?
Аватара пользователя
Dmitrijan

Re: C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели

Сообщение Dmitrijan »

Цитата Drongo:



P.S. А всё-таки, почему при значении - DEFAULT_CHARSET на семёрке всё ок, а на висте кривовато?
C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели




В принципе я не знаю почему так происходит, но думаю в Viste по дефолту стоит другая кодировка, отличающаяся от дефолтной Seven. Но это только мое мнение.

P.S. Очень рад, что у вас все получилось!!! Изображение
Аватара пользователя
Dmitrijan

Re: C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели

Сообщение Dmitrijan »

Здравствуйте, это снова я, но уже с несколько другим вопросом. Вот с русской 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.




Только я всё равно не пойму, как добавить, встроить? шрифт в программу.
Аватара пользователя
Drongo

Re: C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели

Сообщение Drongo »

Здравствуйте, это снова я, но уже с несколько другим вопросом. Вот с русской 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.




Только я всё равно не пойму, как добавить, встроить? шрифт в программу.
Аватара пользователя
Dmitrijan

Re: C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели

Сообщение Dmitrijan »

Цитата Dmitrijan:



В Delphi шрифты включал, помню как, а вот СИ++ извеняйте не работал в нем, могу написать как в Delphi если надо
C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели




Конечно надо. Изображение Во всяком случае можно будет хоть попробовать понять. Если можно с комментариями.
Аватара пользователя
Dmitrijan

Re: C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели

Сообщение Dmitrijan »

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;



Извените, но больше сегодня не смогу написать, конец рабочего дня
Ответить

Вернуться в «Программирование и базы данных»