|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели |
|
|
C/C++ - [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
|
Будем жить, Маэстро... Сообщения: 6694 |
Профиль | Сайт | Отправить PM | Цитировать
Доброго всем здоровья. Нужна ваша помощь. Возникла необходимость написать программку, чтобы она работала на Windows XP и Widnwows Vista (если будет работать на Windows 7, будет вообще здорово, но проверить негде... Нет знакомых с семёркой). На ХР работает как часики, а на Vista не совсем. Не отображаются правильно русские символы. Скриншот приложу.
Проверял на Windows Vista Home Premium (SP1). Версия русская. Получается следующее, интерфейс на русском, и некоторые записи (описания в GroupBox) не отображают правильно кирилицу, а некоторые, на кнопках и переключателях нормально отображают, что сделать - не знаю совсем. Прошу помощи. Английский интерфейс это не вариант потому что там ещё будет ComboBox (при выборе локализации "русская Windows") в котором будет выбор текста на русском, по другому нельзя. Архив проекта прикрепляю, там находится также и исполнимый файл. Программная среда в которой разрабатывается приложение: Цитата из своего профиля:
|
||
------- Отправлено: 12:46, 14-07-2009 |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать 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) или не определением Юникода. |
Последний раз редактировалось Admiral, 02-10-2009 в 14:20. Отправлено: 14:03, 02-10-2009 | #21 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Admiral:
Цитата Admiral:
#include <vcl.h> #pragma hdrstop #include <windows.h> #ifndef UNICODE #define UNICODE #endif #ifndef _UNICODE #define _UNICODE #endif #if !(defined(_UNICODE) | defined(UNICODE)) #error no Unicode! #endif //--------------------------------------------------------------------------- USEFORM("Test1.cpp", Form1); //--------------------------------------------------------------------------- extern "C" int 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; } //--------------------------------------------------------------------------- В гугле ищу по этой ошибке, сообщений много, большая часть на английском, но все какие-то не понятные. Наверное придётся отложить до лучших времён этот вопрос, боюсь, что я его сам не осилю. |
||
------- Отправлено: 15:22, 02-10-2009 | #22 |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать Drongo, а что если к параметрам функции присмотреться
Цитата:
Когда только переводил с WinMain на wWinMain среда от Микрософт кажись ругнулся на него. На мысль подтолкнула эта тема Перенос проекта из 6 в 2009, WinMain -> wWinMain Ещё вариант: открыть пустой проект (в Борланде есть такой проект: не консольный и не GUI?) или попробовать компилить с консоли, быть может там найдётся подходящий параметр. |
|
Последний раз редактировалось Admiral, 02-10-2009 в 23:41. Отправлено: 23:20, 02-10-2009 | #23 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Admiral:
Цитата Admiral:
|
||
------- Отправлено: 12:08, 03-10-2009 | #24 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать В общем, вопрос с Кириллицей в WIN32 GUI приложениях отчасти решился переходом на C++ Builder 2009.
Помечаю вопрос как решённый, но если кто-то что-то откопает, милости прошу, отписывайтесь, буду признателен. |
------- Отправлено: 13:24, 07-10-2009 | #25 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Drongo:
1. Иногда при выполнении какой-либо операции в программе, нужно на метку (Label, GroupBox и т.д) вывести другой текст, не тот, который был изначально. 2. Сохранение русского текста содержащегося в Memo в файл, чтобы сохранился нормальный русский текст, а не знаки вопросов. Первый вопрос: 1-е решение: Добавляем параметр "L" 2-е решение: Немного сложнее, используем К проекту подключаем (Project -> Add to Project <Shift + 11>) - reconst.pas. Компилируем. Полный пример привожу в архиве. Среда разработки C++ Builder 2009 Второй вопрос: Чтобы сохранить русский текст из Memo в файл и чтобы содержимое файла отображалось правильно, а не знаками ?????, нужно добавить второй параметр к функции SaveToFile("MyFile.txt", TEncoding::Unicode) Как мне сказали, нужно указывать вторым параметром соответствующую кодировку: Вопрос решён!!! |
|
------- Последний раз редактировалось Drongo, 14-10-2009 в 14:39. Причина: Исправил... Отправлено: 14:25, 14-10-2009 | #26 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Конкурс - [решено] 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 |
|