[решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
Вложений: 1
Доброго всем здоровья. Нужна ваша помощь. :) Возникла необходимость написать программку, чтобы она работала на Windows XP и Widnwows Vista (если будет работать на Windows 7, будет вообще здорово, но проверить негде... Нет знакомых с семёркой). На ХР работает как часики, а на Vista не совсем. Не отображаются правильно русские символы. Скриншот приложу.
Проверял на Windows Vista Home Premium (SP1). Версия русская. Получается следующее, интерфейс на русском, и некоторые записи (описания в GroupBox) не отображают правильно кирилицу, а некоторые, на кнопках и переключателях нормально отображают, что сделать - не знаю совсем. Прошу помощи. Английский интерфейс это не вариант потому что там ещё будет ComboBox (при выборе локализации "русская Windows") в котором будет выбор текста на русском, по другому нельзя. Архив проекта прикрепляю, там находится также и исполнимый файл. Программная среда в которой разрабатывается приложение: Цитата:
|
Drongo, Кое что могу подсказать. Я тоже как-то разрабатывл програмку (правда на Delphi)
и столкнулся с такой же проблемкой.Из под Виста-кракозябры, из под XP все гуд.Правда не все надписи.Оказалось надо было в свойствах шрифтов выставить CharSet: RUSSIAN_CHARSET.А те которые отображали кракозябры было (ANSI_CHARSET).Но это опять же Delphi, но думаю свойства шрифтов во всех языках одинаковы. P.S. Глянул вашу програмку из под семерки все гуд (все на русском)! :) |
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Цитата:
Протестировали на Vista, по вашему совету изменил в свойствах Font -> Charset - значение с DEFAULT_CHARSET на RUSSIAN_CHARSET и всё заработало правильно: Dmitrijan, Спасибо!!! :yahoo: :Beer: :up: :hi: Вопрос успешно решён. P.S. А всё-таки, почему при значении - DEFAULT_CHARSET на семёрке всё ок, а на висте кривовато? |
Цитата:
P.S. Очень рад, что у вас все получилось!!! :) |
Здравствуйте, это снова я, но уже с несколько другим вопросом. Вот с русской Windows всё в порядке, а если эту же программу с русским интерфейсом запустить на английской версии? Мне кажется вместо русских символов будут знаки вопроса "?????". Я так понял, что нужно русские шрифты загрузить в проект в ресурсы и использовать шрифт из внутренних ресурсов программы? Но я не знаю как это сделать. Покажите на примере кому не трудно.
Только я всё равно не пойму, как добавить, встроить? шрифт в программу. |
Drongo, Возможно при установке значения шрифта RUSSIAN_CHARSET, шрифт включится в проект автоматически при компиляции.
В Delphi шрифты включал, помню как, а вот СИ++ извеняйте не работал в нем, могу написать как в Delphi если надо :) |
Цитата:
|
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; Извените, но больше сегодня не смогу написать, конец рабочего дня |
Цитата:
Вчера вечером почти весь вечер делал и почти пол ночи искал инфу, на Delphi\Pascal есть, на C++ практически ничего внятного не нашёл или пропустил по незнанию. Консольный компилятор есть bcc32.exe. Создавал я файл MyFont.rc, но в MyFont.res такой командой ничего не скомпилилось. Код:
bcc32.exe MyFont.rc |
|
Цитата:
|
Drongo
Берёте текстовый файлик . Пишите туда "MY_FONT ANYOL1 "Bauhs93.ttf" " и сохраняете как 1.rc, например . Далее в Builder'e: Проект->Добавить к проекту->выбираете тип файла *.rc->находите файл 1.rc и компилите проект. Файл Bauhs93.ttf должен лежать вместе с 1.rc. Ну и пишите код приведённый Dmitrijan. |
Вложений: 1
ganselo, Вооот! Другое дело :yes: Что-то получается, только некоторые части не могу перевести с Delphi на C++.
Delphi Код:
procedure TForm1.FormCreate(Sender: TObject); Код:
// Для своего использования шрифта - Delphi |
Drongo
Я с Dephi тоже мало знаком... кажись должно быть так: Код:
TResourceStream *res = new TResourceStream(Application->Handle, "MY_FONT", "ANYOL1"); |
Немного не скомпилилось, ошибка в этой строке
Цитата:
Цитата:
Код:
... ganselo, Спасибо за помощь. :up: |
Проверил на английской Windows, к сожалению с таким кодом ничего не получилось
Код:
... |
В ходе личной переписки выяснили, версия ОС не причём.
Автору был дал совет использовать Юникод в программе. Однако как выяснилось, мой пример оказался не до конца Юникодным, по этому, его корректное отображение зависело от того, что указанно в Контрольной панели в Региональных настройках. Как оказалось, мало использовать wchar_t вместо char, нужно и саму функцию входа в программу использовать соответственную: вместо WinMain - wWinMain. К сожалению для консольных версий прог использование wmain вместо main не даёт независимость от того что установлено в Контрольной панели в Региональных настройках. Консоль не использует Юникод вывод. |
Admiral, Спасибо за помощь и проявленный интерес к проблеме.
Цитата:
Я добавил перед функцией WinMain - символ - wWinMain. Попробовал откомпилировать, ошибка компоновщика. Что WinMain ссылается на COW32.OBJ Код:
[Компоновщик Ошибка] Unresolved external 'WinMain' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\C0W32.OBJ Код:
//--------------------------------------------------------------------------- Цитата:
Цитата:
Код:
FileGetAttr(C:\\windows\\system32\\kernel32.dll) Ещё поискал в гугле, подумал, может нужно эту функцию использовать - GetFileAttributesW ? Хотя никогда использовать её не приходилось. |
Drongo погуглив (другим участникам напомню, в настоящие время не использую среду разработки от Борланда) вышел на то, что в Борланде возможно пройдёт такой код extern "C"int WINAPI wWinMain
В настройка проекта где-то должен быть пункт про использования Юникода. Так же в параметрах передачи линковщику, если есть присутствующий WinMain, должен быть заменён на wWinMain (что-то на подобии /ENTRY:wWinMain), кроме этого bcc должен быть передан параметр -WU. Borland WinMain patch (Англ.) Help please with UNICODE linking (Англ.) Борландская функция FileGetAttr как и Win32 APIшная GetFileAttributes определяет общие характеристики файла, как было замечено: Архивный, скрытый и т.д. Для определения CompanyName нужно использовать тандем сразу трёх функций GetFileVersionInfoSize, GetFileVersionInfo, VerQueryValue Неплохой пример лежит здесь GetFileVersion Вместо TEXT("\\") вероятно нужно использовать TEXT("\\CompanyName ") или что-то наподобие. Хочу ещё раз заметить, что патчи могут использовать более простой алгоритм определения языка системы (сильно не копал в этом направлении, может через System Metrics?). Ну, а вместо передачи абсолютного адреса лучше его определять для текущей системы. Пример здесь. Так как в ХР данная папка легко меняется (в файле ответов Winnt.sif секция [Unattended] параметр TargetPath), в Висте и выше с помощью файла ответов AutoUnattend.xml(секция <DiskConfiguration> пример) можно переназначит диск, ну а с папкой сейчас разбираются. A и W в конце имени функций стоит использовать в случаях, когда параметры могут передаваться только в одном виде, во всех остальных случаях их подстановку стоит регулировать определением (#define UNICODE| #define _UNICODE) или не определением Юникода. |
Цитата:
Цитата:
Код:
#include <vcl.h> В гугле ищу по этой ошибке, сообщений много, большая часть на английском, но все какие-то не понятные. Наверное придётся отложить до лучших времён этот вопрос, боюсь, что я его сам не осилю. |
Drongo, а что если к параметрам функции присмотреться
Цитата:
Когда только переводил с WinMain на wWinMain среда от Микрософт кажись ругнулся на него. На мысль подтолкнула эта тема Перенос проекта из 6 в 2009, WinMain -> wWinMain Ещё вариант: открыть пустой проект (в Борланде есть такой проект: не консольный и не GUI?) или попробовать компилить с консоли, быть может там найдётся подходящий параметр. |
Цитата:
Цитата:
|
В общем, вопрос с Кириллицей в WIN32 GUI приложениях отчасти решился переходом на C++ Builder 2009. :)
Помечаю вопрос как решённый, но если кто-то что-то откопает, милости прошу, отписывайтесь, буду признателен. :yes: |
Вложений: 1
Цитата:
1. Иногда при выполнении какой-либо операции в программе, нужно на метку (Label, GroupBox и т.д) вывести другой текст, не тот, который был изначально. 2. Сохранение русского текста содержащегося в Memo в файл, чтобы сохранился нормальный русский текст, а не знаки вопросов. Первый вопрос: 1-е решение: Добавляем параметр "L" Код:
... Немного сложнее, используем К проекту подключаем (Project -> Add to Project <Shift + 11>) - reconst.pas. Компилируем. :) Полный пример привожу в архиве. Среда разработки C++ Builder 2009 Второй вопрос: Чтобы сохранить русский текст из Memo в файл и чтобы содержимое файла отображалось правильно, а не знаками ?????, нужно добавить второй параметр к функции SaveToFile("MyFile.txt", TEncoding::Unicode) Код:
... Код:
TEncoding::Unicode Вопрос решён!!! :yahoo: |
Время: 18:21. |
Время: 18:21.
© OSzone.net 2001-