Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отображение информации в MDI и консольном прилож.. кодировка приложений и раскладка клавиат 
V
    Опции темы
NewLine
Дата 17.10.2006, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



Добрый день.
Скажите пожалуйста.
У меня есть два приложения MDI с окном редактирования с классом унаследованным от CEditView
class WinMess : public CEditView
{
}
В этом приложении я отлавливаю нажатые клавиши.

И второе приложение - консольное. В которое я передаю и пытасюь отображать эти символы.
Так вот проблема. В MDI приложении все отображается нормально и на русском и на латинском, а вот в консольном приложении все отображается не правильно или какие-то ероглифы, или только на английском и только в большом регистре.
Кто знает посоветуйте что-нить. А я что-то не могу разобраться с кодировками.
Спасибо.


  
--------------------
Компания NewLineStudio - Разработка программного обеспеченияOn-CRM.ru - интернет CRM система
PM MAIL   Вверх
_hunter
Дата 17.10.2006, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 5
Всего: 98



тему можно было бы и по-осмысленнее назвать: какое отношение имеет MDI к проблеме вывода русских символов в консоль?
и поиском можно было бы воспользоваться -- таких тем уже понаподнимали...
http://forum.vingrad.ru/index.php?showtopic=94354
http://forum.vingrad.ru/index.php?showtopic=82380
http://forum.vingrad.ru/index.php?showtopic=22987


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
NewLine
Дата 17.10.2006, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



Ну еще проблемма в том, что в консольное приложение передаются исключительно латинские буквы(A,B,C) и в добавок в большом регистре.
Как нужно передавать русские? Или их как-то нужно преобразовывать из латинских?
--------------------
Компания NewLineStudio - Разработка программного обеспеченияOn-CRM.ru - интернет CRM система
PM MAIL   Вверх
_hunter
Дата 17.10.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 5
Всего: 98



тут без кода что-то сложно сказать...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
NewLine
Дата 17.10.2006, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



Вот код отправляющий нажатые символы.
UINT s - коды нажатых символов.
UINT s ловлю с помощью OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
Код

void CMainFrame::OnSend(UINT s)
{
    if(array.GetSize()==0) return;
    UpdateData(TRUE);    
    for(int j = 0; j <array_ob.GetSize(); j++)
{
    m_ptrComSocket = reinterpret_cast<CCommandSocket*>(array_ob[j]);
    if(!m_ptrComSocket->Send((CString)m_msg, sizeof(m_msg)))
        {AfxMessageBox(MSG_SOCKET_SEND_FAIL);
    }


}


Вот код принимающей стороны.
Код

    AcceptSocket = accept(ListenSocket, NULL, NULL);
    char* Buf;
    Buf = new char [];
    bytesRecv=recv(ListenSocket, Buf,strlen(Buf),0);
                char buffer [100];
    CharToOem(Buf,buffer);
    printf(buffer);

В любом случае отображаются латинские буквы в большем регистре.
А русские что-то не отображаются.
--------------------
Компания NewLineStudio - Разработка программного обеспеченияOn-CRM.ru - интернет CRM система
PM MAIL   Вверх
_hunter
Дата 17.10.2006, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 5
Всего: 98



что такое m_msg? что такое m_ptrComSocket?
что отладчик показывает при приеме?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
NewLine
Дата 17.10.2006, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



CString m_msg 
m_ptrComSocket дескриптор сокета
Отладчик показывает латинские буквы.
И m_msg всегда показывает латинские буквы. 
AfxMessageBox(m_msg);
--------------------
Компания NewLineStudio - Разработка программного обеспеченияOn-CRM.ru - интернет CRM система
PM MAIL   Вверх
_hunter
Дата 17.10.2006, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 5
Всего: 98



в таком случае в чем смысл этого:
(CString)m_msg
и этого:
sizeof(m_msg)
оно вообще работать не должно... или ты сообщения короче 4-х символов передаеш?
Цитата(NewLine @  17.10.2006,  12:51 Найти цитируемый пост)
m_ptrComSocket дескриптор сокета

какого сокета? у CSocket' а нет метода Send...
Цитата(NewLine @  17.10.2006,  12:51 Найти цитируемый пост)
Отладчик показывает латинские буквы

ты не буквы смотри а их коды 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
NewLine
Дата 17.10.2006, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



Еслиб я еще знал что с этим кодом делать.
Странно почему он в : public CEditView отображается нормально - по русски, а в 
AfxMessageBox(m_msg) - показывает латинскими.
Цитата

в таком случае в чем смысл этого:
(CString)m_msg

Ну конечно может это преобоазование и не важно.
Цитата

оно вообще работать не должно... или ты сообщения короче 4-х символов передаеш?

Я вообще пытаюсь передавать по одному символу.
Цитата

какого сокета? у CSocket' а нет метода Send...

Ну не знаю от так успешно все передает.
А какой тогда нужно использовать?
 smile 


Я вообще пытаюсь передавать в консольное приложение коды клавишь и там их уже отображать.
Но что-то пока ничего не получается.
1. В консольном приложении отображаются исключительно латинские буквы
2. Не оображаются управляющие клавиши типа Enter, BackSpace, ...

Это сообщение отредактировал(а) NewLine - 17.10.2006, 14:00
--------------------
Компания NewLineStudio - Разработка программного обеспеченияOn-CRM.ru - интернет CRM система
PM MAIL   Вверх
Damarus
Дата 17.10.2006, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Цитата(_hunter @  17.10.2006,  14:24 Найти цитируемый пост)
у CSocket' а нет метода Send...

 smile Как нет smile А CAsyncSocket::Send smile 
PM MAIL ICQ Jabber   Вверх
_hunter
Дата 17.10.2006, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 5
Всего: 98



Цитата(NewLine @  17.10.2006,  13:55 Найти цитируемый пост)
Еслиб я еще знал что с этим кодом делать.

я имел а виду смотри в отладчике не на chr (символ) или на всю строку целиком а на (int)chr

Цитата(NewLine @  17.10.2006,  13:55 Найти цитируемый пост)
Странно почему он в : public CEditView отображается нормально - по русски, а в AfxMessageBox(m_msg) - показывает латинскими.

этого вообще быть не может. у тебя значит уже на передающей стороне косяк.
Цитата(NewLine @  17.10.2006,  13:55 Найти цитируемый пост)
Я вообще пытаюсь передавать по одному символу.

а зачем говориш что хочеш передать 4?
Цитата(NewLine @  17.10.2006,  13:55 Найти цитируемый пост)
Я вообще пытаюсь передавать в консольное приложение коды клавишь и там их уже отображать.Но что-то пока ничего не получается.

потому как ты за слишком сложную задачу взялся. ты, для начала, строку константную передай...
и, кстати, что ты таки посылаеш? -- коды клавиш (два байта) или символы (байт)

Цитата(Damarus @  17.10.2006,  14:03 Найти цитируемый пост)
Как нет smile А CAsyncSocket

поэтому я и спрашивал. а CAsyncSocket это, кажись, не CSocket...

Добавлено @ 14:20 
strlen(Buf) от такого:
char* Buf = new char [];
буффера вернет все что угодно кроме того, что тебе нужно (еденицы)


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Damarus
Дата 17.10.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Цитата(_hunter @  17.10.2006,  15:18 Найти цитируемый пост)
 CAsyncSocket это, кажись, не CSocket...

CSocket наследуется от CAsyncSocket.
PM MAIL ICQ Jabber   Вверх
NewLine
Дата 17.10.2006, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



Цитата

этого вообще быть не может. у тебя значит уже на передающей стороне косяк.

Ну вот я здесь отлавливаю событие. И он в 
class WinMess : public CEditView
{}
Отображается нормально, а в AfxMessageBox(ch) уже латинскими.
Код

void WinMess::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
UpdateData(TRUE);
CString ch=(CString)nChar;
AfxMessageBox(ch);
}


Цитата

потому как ты за слишком сложную задачу взялся. ты, для начала, строку константную передай...
и, кстати, что ты таки посылаеш? -- коды клавиш (два байта) или символы (байт)

Задача поставлена такая. А константную строку я передавл(только в диалоговое окно и она передавалась.)
Было бы не плохо передавать коды клавишь, но проблемма у меня остановилась на том, что функция 

int recv(SOCKET s,  char* buf,  int len,  int flags);

Принимает char* и не принимает int так как не видит конца строки.
И что там потом делать с кодом клавиши я тоже не совсем понял. 

Цитата

я имел а виду смотри в отладчике не на chr (символ) или на всю строку целиком а на (int)chr

И вообще что с кодом делать как его преобразовывать простым переопределением типа
reinterpret_cast, dinamic_cast.  smile  
--------------------
Компания NewLineStudio - Разработка программного обеспеченияOn-CRM.ru - интернет CRM система
PM MAIL   Вверх
_hunter
Дата 17.10.2006, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 5
Всего: 98



если раньше я отдельные моменты не понимал то теперь я не понимаю вообще ничего...

Цитата(NewLine @  17.10.2006,  14:48 Найти цитируемый пост)
Ну вот я здесь отлавливаю событие. И он в class WinMess : public CEditView{}Отображается нормально

"он" это кто? в OnKeyDown (nChar) приходит virtual key code of the given key. он на русском (если именно это понимается под "Отображается нормально") быть никак не может. 
+ это:
Цитата(NewLine @  17.10.2006,  14:48 Найти цитируемый пост)
CString ch=(CString)nChar;

что за прикол? ты некое число (которое к буквам имеет только косвенное отношение) приводиш к строке. что ты этим хочеш сказать -- непонятно...
Цитата(NewLine @  17.10.2006,  14:48 Найти цитируемый пост)
А константную строку я передавл(только в диалоговое окно и она передавалась.)

ну так теперь через сокет передавай...
Цитата(NewLine @  17.10.2006,  14:48 Найти цитируемый пост)
но проблемма у меня остановилась на том, что функция int recv(SOCKET s,  char* buf,  int len,  int flags);Принимает char* и не принимает int

эта проблема решается банальным приведением типов. а именно:
int code = 0;
recv(s,  (char*)&code,  sizeof(code),  flags);


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
NewLine
Дата 17.10.2006, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



Цитата

"он" это кто? в OnKeyDown (nChar) приходит virtual key code of the given key.

Я так полагал что nChar это код нажатой клавиши и его соответственно можно как-то преобразовать и отобразить ввиде символа. И именно после такого преобразования
CString ch=(CString)nChar;
AfxMessageBox(ch);
Он у меня и отображался.
Как-то же можно преобразовать это виртуальный код и отобразить его?
Цитата

А константную строку я передавл(только в диалоговое окно и она передавалась.) 
ну так теперь через сокет передавай...

Так передаются почему-то только латинские буквы.
Конечно если я задам
CString m_msg="п";
m_ptrComSocket->Send(m_msg, sizeof(m_msg));
Так оно успешно передаться  и отобразится.

А как от этого OnKeyDown (nChar) - virtual key code of the given key. получить русскую букву и передать ее я ума не приложу.
Или как передать nChar с помощью Send(nChar) и уже в консольном приложении отобразить это символ.
--------------------
Компания NewLineStudio - Разработка программного обеспеченияOn-CRM.ru - интернет CRM система
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0596 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.