Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с записью в Clipboard русских символов 
V
    Опции темы
MAXIQ
Дата 24.5.2008, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте, беда в следующем: этот код работает нормально только если в переменнную cStrEdit записана строка на английском, иначе идут каракули еще те  ((
Имеется в виду то, что при вставке в другое приложение, например в тот же блокнот, нормально интерпретируются символы только английского алфавита, а если руский то получается:Îäíàæäû â ñòóäåíóþ çèìíþþ ïîðó ÿ èç ëåñó âûøåë
Может знает кто в чем дело?
Пробовал два варианта приведеных ниже, но эффект одинаковый.
Код

signed char cStrEdit[256]//переменная объявлена глобально перед WinMain
..................

case WM_COMMAND:
                {
                if((int)LOWORD(wParam)==ID_COPY)
                        {
                        /*HGLOBAL hglbTextPasteBuf;
                        LPSTR lpTextPaste;
                        hglbTextPasteBuf = GlobalAlloc(GHND, sizeof(cStrEdit));
                        lpTextPaste = (LPSTR)GlobalLock(hglbTextPasteBuf);
                        lstrcpy(lpTextPaste,&cStrEdit);
                        GlobalUnlock(hglbTextPasteBuf);
                        OpenClipboard(hEdit);
                        EmptyClipboard();
                        SetClipboardData(CF_TEXT, hglbTextPasteBuf);
                        CloseClipboard();
                        if(hglbTextPasteBuf != NULL)GlobalFree(hglbTextPasteBuf); */


                        char *p;
                        GLOBALHANDLE  hGlobal;
                        hGlobal=GlobalAlloc(GHND, sizeof(cStrEdit));
                        p=(char *)GlobalLock(hGlobal);
                        //--------------------------------
                        strcpy(p,&cStrEdit);
                        OpenClipboard(hEdit);
                        EmptyClipboard();
                        SetClipboardData(CF_TEXT,hGlobal);
                        CloseClipboard();
                        //--------------------------------
                        GlobalUnlock(hGlobal);
                        GlobalFree(hGlobal);
                        }
                };break;
..................

PM MAIL   Вверх
GremlinProg
Дата 24.5.2008, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



для русского текста есть смысл вместо формата CF_TEXT использовать CF_UNICODETEXT (в Windows NT/2000/XP) и, соответственно работать в юникоде. Если юникод не устраивает, можно готовить данные, используя CharToOem и формат CF_OEMTEXT.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
MAXIQ
Дата 25.5.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Мда, наверно только Юникод спасет, а то вылезло вот это:Äñ¡áªñδ ó ßΓπñÑ¡πε º¿¼¡εε »«απ ∩ прошу заметить, что строка одна и та же.
Код

char *p;
                        GLOBALHANDLE  hGlobal;
                        hGlobal=GlobalAlloc(GHND, sizeof(cStrEdit));
                        p=(char *)GlobalLock(hGlobal);
                        //--------------------------------
                        CharToOem(cStrEdit,p);
                        //strcpy(p,&cStrEdit);
                        OpenClipboard(hEdit);
                        EmptyClipboard();
                        SetClipboardData(/*CF_TEXT*/CF_OEMTEXT,hGlobal);
                        CloseClipboard();
                        //--------------------------------
                        GlobalUnlock(hGlobal);
                        GlobalFree(hGlobal);

Может еще какие идеи есть?
PM MAIL   Вверх
586
Дата 25.5.2008, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Цитата(MAXIQ @  25.5.2008,  15:11 Найти цитируемый пост)
Может еще какие идеи есть? 

Попробуй вручную сменить раскладку клавиатуры на русскую. Например, если копировать текст из билдера и вставить в блокнот, то вместо русского текста будет мусор. Если сменить раскладку на русскую, то всё нормально копируется. В Юникоде дело... Можно ещё попробовать локаль сменить (setlocale).
PM   Вверх
MAXIQ
Дата 26.5.2008, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Дела совсем плохи... Объявил Unicode, заюзал функцию, как советовал г-н Румянцев, эффект конечно впечатляет))
Перепробывал разные варианты, вот код
Код

#include <tchar.h>
#define UNICODE
#define _UNICODE //Румянцев посоветовал объявлять оба))                       

                        HGLOBAL hGlobal;
                        LPSTR lpText;
                        //LPSTR lpMyStr="Однажды, в студеную зимнюю пору";
                        LPSTR lpMyStr=L"Однажды, в студеную зимнюю пору";
                        hGlobal = GlobalAlloc(GHND,256);
                        lpText = (LPSTR)GlobalLock(hGlobal);
                        //lstrcpy(lpText,lpMyStr);
                        _tcscpy(lpText,lpMyStr);//Функция из файла tchar.h файл подключен в самом начале
                        GlobalUnlock(hGlobal);
                        OpenClipboard(hEdit);
                        EmptyClipboard();
                        SetClipboardData(CF_UNICODETEXT, hGlobal);
                        CloseClipboard();
                        if(hGlobal)GlobalFree(hGlobal);


Результат работы кода в блокноте: Однажды,
как только эта хрень встречает пробел или символ английской клавиатуры или цифру, строка обрезается.
 586, думаю дело не в раскладке клавы(( раз без изменений машина прохавала хотя бы одно слово((

PM MAIL   Вверх
ama_kid
Дата 26.5.2008, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

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



MAXIQ, При нижеследующих исправлениях у меня заработало:
Цитата
LPWSTR lpText;
Цитата
LPWSTR lpMyStr=L"Однажды, в студеную зимнюю пору";
Цитата
lpText = (LPWSTR)GlobalLock(hGlobal);
Цитата
wcscpy(lpText,lpMyStr);  //а лучше - wcscpy_s


Это сообщение отредактировал(а) ama_kid - 26.5.2008, 13:25


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
MAXIQ
Дата 27.5.2008, 03:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо! У меня то же )) Здорово помог, однако ж это получается что все свободное от безделия время надо сидеть и ковырять MSDN, авось на функцию нужную наткнешься? Мда... Может справочник кто посоветует, чтоб скачать и в net не лазить каждый раз? Киньте ссылку если не в лом))
PM MAIL   Вверх
0x00
Дата 27.5.2008, 05:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



мсдн локальный поставь =)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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