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

Компьютерный форум 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

 

Ветеран


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

Профиль | Отправить 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



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

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


Аватара для Drongo

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


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

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


Цитата Admiral:
В настройка проекта где-то должен быть пункт про использования Юникода. »
Не поверите, не нашёл ничего в настройках по поводу Юникода.
Цитата Admiral:
вышел на то, что в Борланде возможно пройдёт такой код extern "C"int WINAPI wWinMain »
Да, спасибо, но это не решило проблему, возможно я не так делаю, вот код. Ошибка та же.
Код: Выделить весь код
#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;
}
//---------------------------------------------------------------------------
Параллельно заглянул в обучение, по статьям которым я начинал изучать C++Builder 6.0 - Шаг 90 - Исправление ошибок, связанных с настройками проектов. Так же не помогло.

В гугле ищу по этой ошибке, сообщений много, большая часть на английском, но все какие-то не понятные.

Наверное придётся отложить до лучших времён этот вопрос, боюсь, что я его сам не осилю.

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


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


Ветеран


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

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


Drongo, а что если к параметрам функции присмотреться
Цитата:
в обычной WinMain параметр LPSTR, а в wWinMain - LPTSTR >>
Может дело в этом?
Когда только переводил с WinMain на wWinMain среда от Микрософт кажись ругнулся на него.
На мысль подтолкнула эта тема Перенос проекта из 6 в 2009, WinMain -> wWinMain
Ещё вариант: открыть пустой проект (в Борланде есть такой проект: не консольный и не GUI?) или попробовать компилить с консоли, быть может там найдётся подходящий параметр.

Последний раз редактировалось Admiral, 02-10-2009 в 23:41.


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


Аватара для Drongo

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


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

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


Цитата Admiral:
Может дело в этом? »
Увы, в моём случае, нет. Изменения в параметрах не устранили ошибку.

Цитата Admiral:
Ещё вариант: открыть пустой проект (в Борланде есть такой проект: не консольный и не GUI?) »
Пустой проект это обычный cpp файл, который не компилируется? Если да, то такой есть, хотя формы куда размешать кнопки и др. компоненты, нету.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
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:08, 03-10-2009 | #24


Аватара для Drongo

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


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

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


В общем, вопрос с Кириллицей в WIN32 GUI приложениях отчасти решился переходом на C++ Builder 2009.

Помечаю вопрос как решённый, но если кто-то что-то откопает, милости прошу, отписывайтесь, буду признателен.

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


Отправлено: 13:24, 07-10-2009 | #25


Аватара для Drongo

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


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

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


Вложения
Тип файла: rar Test_Cirylic_GUI_Win32.rar
(278.8 Kb, 12 просмотров)

Цитата Drongo:
В общем, вопрос с Кириллицей в WIN32 GUI приложениях отчасти решился переходом на C++ Builder 2009. »
Итак, отчаявшись найти решение, задал вопрос ещё на нескольких форумах. Вопросов было два:

1. Иногда при выполнении какой-либо операции в программе, нужно на метку (Label, GroupBox и т.д) вывести другой текст, не тот, который был изначально.
2. Сохранение русского текста содержащегося в Memo в файл, чтобы сохранился нормальный русский текст, а не знаки вопросов.

Первый вопрос:
1-е решение:
Добавляем параметр "L"
Код: Выделить весь код
...
   GroupBox1->Caption = L"Выбрали "+ ComboBox1->Text;;
   Button1->Caption = L"Вернуть";
...
2-е решение:
Немного сложнее, используем
reconst.pas

Код: Выделить весь код
unit ReConst;

interface

uses Windows;

resourcestring
  TEXTGroupBox1 = 'Выбрали';
  TEXTButton1 = 'Вернуть';
  TitleError = 'Внимание: Ошибка!';
  TEXTError1 = 'Неправильное значение!'; 
  TEXTError2 = 'Выберите пункт меню.'; 
//--------------------------------------------------
implementation

end.

ReConst.hpp

Как мне сказали, редактировать ReConst.hpp без смысла, т.к. Borland его генерирует по reconst.pas, но его нужно подключать:
Код: Выделить весь код
...
#include "ReConst.hpp"
...
Код: Выделить весь код
// CodeGear C++Builder
// Copyright (c) 1995, 2008 by CodeGear
// All rights reserved

// (DO NOT EDIT: machine generated header) 'Reconst.pas' rev: 20.00

#ifndef ReconstHPP
#define ReconstHPP

#pragma delphiheader begin
#pragma option push
#pragma option -w-      // All warnings off
#pragma option -Vx      // Zero-length empty class member functions
#pragma pack(push,8)
#include <System.hpp>	// Pascal unit
#include <Sysinit.hpp>	// Pascal unit
#include <Windows.hpp>	// Pascal unit

//-- user supplied -----------------------------------------------------------

namespace Reconst
{
//-- type declarations -------------------------------------------------------
//-- var, const, procedure ---------------------------------------------------
extern PACKAGE System::ResourceString _TEXTGroupBox1;
#define Reconst_TEXTGroupBox1 System::LoadResourceString(&Reconst::_TEXTGroupBox1)
extern PACKAGE System::ResourceString _TEXTButton1;
#define Reconst_TEXTButton1 System::LoadResourceString(&Reconst::_TEXTButton1)
extern PACKAGE System::ResourceString _TitleError;
#define Reconst_TitleError System::LoadResourceString(&Reconst::_TitleError)
extern PACKAGE System::ResourceString _TEXTError1;
#define Reconst_TEXTError1 System::LoadResourceString(&Reconst::_TEXTError1)
extern PACKAGE System::ResourceString _TEXTError2;
#define Reconst_TEXTError2 System::LoadResourceString(&Reconst::_TEXTError2)
}	/* namespace Reconst */
using namespace Reconst;
#pragma pack(pop)
#pragma option pop

#pragma delphiheader end.
//-- end unit ----------------------------------------------------------------
#endif	// ReconstHPP
К проекту подключаем (Project -> Add to Project <Shift + 11>) - reconst.pas.

Файл .cpp

Код: Выделить весь код
...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   GroupBox1->Caption = (UnicodeString)Reconst_TEXTGroupBox1;
   Button1->Caption = Reconst_TEXTButton1;
   Button2->Caption = Reconst_TEXTButton2;
   Label1->Caption = Reconst_TEXTLabel1;
   UnicodeString TextError = Reconst_TEXTError1 + "\n" + Reconst_TEXTError2;
   Application->MessageBox(TextError.w_str(), Reconst_TitleError.w_str(), MB_YESNO+MB_ICONWARNING);
}
...


Компилируем. Полный пример привожу в архиве. Среда разработки C++ Builder 2009


Второй вопрос:
Чтобы сохранить русский текст из Memo в файл и чтобы содержимое файла отображалось правильно, а не знаками ?????, нужно добавить второй параметр к функции SaveToFile("MyFile.txt", TEncoding::Unicode)
Код: Выделить весь код
...
   Memo1->Lines->SaveToFile("SaveFile.txt", TEncoding::Unicode);
...
Как мне сказали, нужно указывать вторым параметром соответствующую кодировку:
Код: Выделить весь код
TEncoding::Unicode
TEncoding::UTF8
TEncoding::Default
TEncoding::ASCII


Вопрос решён!!!

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
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, 14-10-2009 в 14:39. Причина: Исправил...


Отправлено: 14:25, 14-10-2009 | #26



Компьютерный форум 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




 
Переход