Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели

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

Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393


Конфигурация

Профиль | Сайт | Отправить PM | Цитировать


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



Проверял на Windows Vista Home Premium (SP1). Версия русская.

Получается следующее, интерфейс на русском, и некоторые записи (описания в GroupBox) не отображают правильно кирилицу, а некоторые, на кнопках и переключателях нормально отображают, что сделать - не знаю совсем. Прошу помощи. Английский интерфейс это не вариант потому что там ещё будет ComboBox (при выборе локализации "русская Windows") в котором будет выбор текста на русском, по другому нельзя. Архив проекта прикрепляю, там находится также и исполнимый файл. Программная среда в которой разрабатывается приложение:
Цитата из своего профиля:
Borland C++ Builder 6.0 Enterprise Suite

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 12:46, 14-07-2009

 

Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата Dmitrijan:
Вот я включал шрифт по такой инструкции: »
К сожалению, неполучилось... Хотя за попытку помочь, благодарю.
Вчера вечером почти весь вечер делал и почти пол ночи искал инфу, на Delphi\Pascal есть, на C++ практически ничего внятного не нашёл или пропустил по незнанию.
Консольный компилятор есть bcc32.exe. Создавал я файл MyFont.rc, но в MyFont.res такой командой ничего не скомпилилось.
Код: Выделить весь код
bcc32.exe MyFont.rc
Возможно программисты на Cи помогут? Хотелось бы...

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 16:52, 18-07-2009 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


Цитата Drongo:
Drongo »
Я так понял, что у вас не получилось добавить шрифт в *.res файл? Если так, то:
берёте какой нибуть редактор ресурсов и с помощью его добавляете ваш шрифт в *.res файл программы и дальше пишите код приведённый
Цитата Dmitrijan:
Dmitrijan »
.

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".


Отправлено: 13:58, 19-07-2009 | #12


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата ganselo:
берёте какой нибуть редактор ресурсов и с помощью его добавляете ваш шрифт в *.res файл программы »
Хорошо, у меня Restorator открыл в этой программе файл Project1.res. Создал ресурс "Шрифт", что выбирать дальше и как собственно добавлять сам шрифт? Хотелось бы подробное описание, а не общий совет...

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 14:47, 20-07-2009 | #13


Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


Drongo
Берёте текстовый файлик . Пишите туда "MY_FONT ANYOL1 "Bauhs93.ttf" " и сохраняете как 1.rc, например . Далее в Builder'e: Проект->Добавить к проекту->выбираете тип файла *.rc->находите файл 1.rc и компилите проект. Файл Bauhs93.ttf должен лежать вместе с 1.rc. Ну и пишите код приведённый Dmitrijan.

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:55, 20-07-2009 | #14


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Вложения
Тип файла: 7z Registry.7z
(379.5 Kb, 5 просмотров)

ganselo, Вооот! Другое дело Что-то получается, только некоторые части не могу перевести с Delphi на C++.

Delphi
Код: Выделить весь код
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;
C++ как и что у меня получилось (потом, когда и если всё получится, детально опишу последовательность действий). Не могу эту часть правильно перевести. Переменная TResourceStream Res; вроде бы создаю, а потом присвоить ей что-то я не пойму как? По ходу нужно использовать оператор new, но на простых типах умею, а вот на таких не приходилось. Думаю с кодом после begin разобрался бы, мне только правильно перевести эту строку - Res : TResourceStream;
Код: Выделить весь код
// Для своего использования шрифта - Delphi
//   Res : TResourceStream; // Объявляем переменную
//   begin
//   Res := TResourceStream.Create(hInstance, 'MY_FONT', Pchar('ANYOL1'));
//   Res.SavetoFile('Bauhs93.ttf');
//   Res.Free; // освобождение ресурсов - деструктор.
   // Работает только эта часть-----------------------------
   AddFontResourceA("verdana.ttf");
   SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
Проект с включенным в него ресурсом для шрифта скомпилился, только без тех строк, что закоментированы. В FormCreate

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 18:11, 20-07-2009 | #15


Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


Drongo
Я с Dephi тоже мало знаком... кажись должно быть так:
Код: Выделить весь код
TResourceStream *res = new TResourceStream(Application->Handle, "MY_FONT", "ANYOL1");
res->SaveToFile("Bauhs93.ttf");

AddFontResourceA("Bauhs93.ttf");
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
Но я не тестил...

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:22, 23-07-2009 | #16


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Немного не скомпилилось, ошибка в этой строке
Цитата ganselo:
Код: Выделить весь код
TResourceStream *res = new TResourceStream(Application->Handle, "MY_FONT", "ANYOL1");
»
Цитата:
[C++ Ошибка] Unit1.cpp(40): E2285 Could not find a match for 'TResourceStream::TResourceStream(void *,char *,char *)'
Но я тут поискал в гугле правильный синтаксис TResourceStream(void *,char *,char *). Нашёл в первых строках гугла ссылку 1 и ссылку 2. Изменил на такой вариант:

Код: Выделить весь код
...
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   TResourceStream *res = new TResourceStream((int)HInstance, "MY_FONT", "ANYOL1");
   res->SaveToFile("verdana.ttf");

   AddFontResourceA("verdana.ttf");
   SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
}...
Скомпилилось без проблем. Теперь нужно проверить на английской версии Windows. Как проверю, сразу же отпишусь, у меня правда знакомых нет с английской Windows, придётся диск у друга брать. Так что некоторое время займёт.

ganselo, Спасибо за помощь.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Последний раз редактировалось Drongo, 23-07-2009 в 17:14. Причина: Добавил ещё одну ссылку.


Отправлено: 16:46, 23-07-2009 | #17


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Проверил на английской Windows, к сожалению с таким кодом ничего не получилось
Код: Выделить весь код
...
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   TResourceStream *res = new TResourceStream((int)HInstance, "MY_FONT", "ANYOL1");
   res->SaveToFile("verdana.ttf");

   AddFontResourceA("verdana.ttf");
   SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
}
...
всё равно русские символы выводит вопросительными знаками. Как же всё-таки включить русский шрифт в программу? Что я не так делаю или пропускаю?

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 17:35, 28-07-2009 | #18


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


В ходе личной переписки выяснили, версия ОС не причём.
Автору был дал совет использовать Юникод в программе. Однако как выяснилось, мой пример оказался не до конца Юникодным, по этому, его корректное отображение зависело от того, что указанно в Контрольной панели в Региональных настройках. Как оказалось, мало использовать wchar_t вместо char, нужно и саму функцию входа в программу использовать соответственную: вместо WinMain - wWinMain.
К сожалению для консольных версий прог использование wmain вместо main не даёт независимость от того что установлено в Контрольной панели в Региональных настройках. Консоль не использует Юникод вывод.

P.S. Хотелось бы дать рекомендацию по самой программе.

Вместо того что б предлагать выбор по определению языковой версии, лучше её определять. Например считывая атрибуты файла kernel32.dll проверять что там написано: Корпорация Мискрософт или Microsoft Corporation.
Не исключаю, что патчи, которые сообщают что они "не предназначены для данной языковой версии", проверяют это как-то по-другому, в этом случаи APIMonitor поможет определить как именно.

Отправлено: 22:02, 01-10-2009 | #19


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Admiral, Спасибо за помощь и проявленный интерес к проблеме.
Цитата Admiral:
нужно и саму функцию входа в программу использовать соответственную: вместо WinMain - wWinMain. »
Я сравнивал ваш исходник для MultiBoot Configurator'a, но как использовать эту функцию в своей, не имею представления, там ведь проект .bpr. Функции WinMain вроде как только в файле - Project1.cpp - коммент 15.

Я добавил перед функцией WinMain - символ - wWinMain. Попробовал откомпилировать, ошибка компоновщика. Что WinMain ссылается на COW32.OBJ
Код: Выделить весь код
[Компоновщик Ошибка] Unresolved external 'WinMain' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\C0W32.OBJ
Код: Выделить весь код
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI wWinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                 Application->Initialize();
                 Application->CreateForm(__classid(TForm1), &Form1);
                 Application->Run();
        }
        catch (Exception &exception)
        {
                 Application->ShowException(&exception);
        }
        catch (...)
        {
                 try
                 {
                         throw Exception("");
                 }
                 catch (Exception &exception)
                 {
                         Application->ShowException(&exception);
                 }
        }
        return 0;
}
//---------------------------------------------------------------------------
По wWinMain нашёл статью - Точка входа в программу, но мне ничего это не дало.


Цитата Admiral:
Вместо того что б предлагать выбор по определению языковой версии, лучше её определять. »
Я тоже об этом думал.
Цитата Admiral:
Например считывая атрибуты файла kernel32.dll проверять что там написано: Корпорация Мискрософт или Microsoft Corporation. »
Так?
Код: Выделить весь код
FileGetAttr(C:\\windows\\system32\\kernel32.dll)
Установить атрибуты могу: Архивный, сктрытый и т.д.

Ещё поискал в гугле, подумал, может нужно эту функцию использовать - GetFileAttributesW ? Хотя никогда использовать её не приходилось.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Последний раз редактировалось Drongo, 02-10-2009 в 15:26. Причина: Убрал ссылку на закрытый форум...


Отправлено: 12:49, 02-10-2009 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Конкурс - [решено] 270 настроек панели управления в одной папке Smarty Microsoft Windows 7 28 13-02-2012 08:38
Не работает GUI после выхода другова GUI sashadeg AutoIt 3 15-05-2009 22:03
[решено] проверка контрольной суммы nix_lamer Общий по Linux 1 17-01-2007 08:40




 
Переход