Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Работа с буфером обмена


Автор: kof 11.12.2005, 20:50
Люди, подскажите варианты ответов, вопрос упёрся ребром.
---
Дело такое:
пишу прогу, в которой собственно и беру текст из файла и вставляю в буфер обмена. Все вроде бы просто.

Сложность в том, что при вставки в буфер обмена русского(!!!) текста, то из буфера выходит только чушь. Пытаюсь получившееся вставить в 'Блокнот' и... белиберда! Такое же и с 'Вордом' Но в редакторе AkelPad нормально! И (если кто знает) в Total Commander`e (по старому - Windows Commander) внизу в коммандной строке тоже нормально воспринимает...

Программа под MFC.

Привожу код программы:
Код

CString str="Текст из файла"; //создание переменной str в которую загружаю текст из файла
// ...(загрузка текста в str)...
OpenClipboard(); //открываю буфер
EmptyClipboard(); //очищаю буфер

HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, str.GetLength()+1); //создаю переменную типа HGLOBAL и выделяю память под неё

strcpy((char *)GlobalLock(hGlobal), str); //копирую в hGlobal строку str
GlobalUnlock(hGlobal);

SetClipboardData(CF_TEXT,hGlobal); //помещаю в буфер текст содержащийся в hGlobal
CloseClipboard(); //закрываю буфер
exit(0); //выхожу


Буду рад любым советам, подсказкам и помощи.

Вот что в итоге оказывается в буфере:

Ýòî ïðîñòî ðóññêèé òåêñò.
Ñúåøü ýòèõ ïðåêðàñíûõ ÿáëîê, äà âûïåé æå ÷àþ.

Автор: Earnest 12.12.2005, 09:11
Программно с этим не сталкивалась, но сталкивалась на уровне UI, при копировании текста из одной программы в другую. При запоминании в буфер обмена в программе-источнике должен быть установлен русский язык...

Автор: SeregaLBN 13.12.2005, 20:03
Попробуй локаль в проекте изменить на русский

Автор: JoyEx 13.12.2005, 20:10
Цитата(kof @ 11.12.2005, 20:50)
Сложность в том, что при вставки в буфер обмена русского(!!!) текста, то из буфера выходит только чушь


Unicode спасёт
CF_UNICODETEXT

Автор: kof 17.12.2005, 16:46
Цитата
JoyEx
Unicode спасёт
CF_UNICODETEXT

Нет. Не спасает. Ты сам(а) попробуй.

Да и локализация проекта Русская.

Резонный вопрос по поводу ответа Earnest:
Как програмно изменить локализацию на машине на Русскую?
тоесть setlocale(LC_ALL,str); здесь не спасает... пробовал...

Автор: JoyEx 17.12.2005, 18:33
Цитата(kof @ 17.12.2005, 16:46)
Цитата
JoyEx
Unicode спасёт
CF_UNICODETEXT


Нет. Не спасает. Ты сам(а) попробуй.


Так ты сам отбиваешь охоту тебе помогать.
Если бы я не знал, что говорю, то тогда бы и не советовал.

Автор: kof 18.12.2005, 17:36
JoyEx, я пробовал CF_UNICODETEXT вставлять в буфер, вот что на выходе:
ⴭⴭⴭ਍⃮ïമ켊മⴊⴭⴭ


Если же использовать CF_TEXT то результат такой:
------
Ýòî ïðîñòî òåêñò.
Ïðîñòîé òåêñò.
------

Изначальный текст:
------
Это просто текст.
Простой текст.
------

Так, что мои ответы обоснованы.

Автор: JoyEx 18.12.2005, 20:30
Посмотри в Spy++, например, окно Блокнота и увидишь, что оно Unicode. Поэтому я и советую CF_UNICODETEXT.
$M не любит символы больше 0x80, в отладчиках и дизассемблерах эти символы обычно выводят точками smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)