WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Clipboard и Unicode

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Clipboard и Unicode
kourov опубликован 21-12-2001 11:01 MSK   Click Here to See the Profile for kourov   Click Here to Email kourov  
Короче, надо достать CF_TEXT из клипборда. В NT постоянно пишет, что доступно как в UNICODE, так и в ANSI, но если от ANSI окон достать UNICODE текст, он нормально в ANSI не переводиться через WideCharToMultyByte, фигня какая-то.
Подскажите, как работает!!!
Flex Ferrum опубликован 21-12-2001 11:03 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Не может быть. Поиграйся с кодовыми страницами - должно работать.
SUnteXx опубликован 21-12-2001 12:44 MSK     Click Here to See the Profile for SUnteXx  Click Here to Email SUnteXx     
Я тут работаю в ХР и создаю свой Clipboard Viewer, так я установил, что эти Микросаксы сделали так, что при засылке обычного текста в память он сразу же переводит в юникод, причем переводит так: берет текст, добовляет после каждого символа символ "\0" и вынь думает, что это юникод! приходится самому делать перевод! Придурки они! А когда засылаешь юникод, то переводится в текст (как ни странно, то в нормальный текст)! Это я заметил тогда, когда работал с NotePad'ом, он полностью на юникоде (т.е. засылка в память и получение из памяти данных все в юникоде!). Я копировал текст из нотепада и пытался с этим текстом сделать пасту. Итог, ставились символы "?" вместо всей строки! Я теперь делаю так: беру текст в юникоде и перевожу в текст (WideCharToMultyByte), если челу не нравится результат, то чел должен убрать в настройках поддержку юникода! Чел закрывает окно, а потом при открытии окна (раз юникод не проверять) достается обычный текст! Как ни странно, но работает! Попробуйте также сделать!
Flex Ferrum опубликован 21-12-2001 13:22 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Не в этом дело. К сожалению, нет сейчас под рукой исходников, но я эту задачу решал и успешно. WideCharToMultiByte должна работать корректно.
kourov опубликован 21-12-2001 15:07 MSK     Click Here to See the Profile for kourov  Click Here to Email kourov     
Хрен знает, ничего не выходит. Вот к примеру, в блокноте и Бате нормально, а в VC++ получаются кракозябры. Вот текущий код, мутил с кодовыми страницами. Суть в том, чтобы клипборд изменить по определёоонму алгоритму.

void CLCDlg::ConvertClipboard()
{
HGLOBAL hglb;
LPSTR szData;
CString strData;

BOOL bUnicodeAvailable = ::IsClipboardFormatAvailable(CF_UNICODETEXT);

if ((!::IsClipboardFormatAvailable(CF_TEXT)) && (!bUnicodeAvailable)) return;
if (!OpenClipboard()) return;

if(bUnicodeAvailable)
hglb = GetClipboardData(CF_UNICODETEXT);
else
hglb = GetClipboardData(CF_TEXT);

if (hglb != NULL)
{
szData = (LPSTR) GlobalLock(hglb);

if (szData != NULL)
{
// UNICODE
if(bUnicodeAvailable)
{
LPWSTR lpwData = (LPWSTR) szData;
LPSTR szDataFromUnicode = NULL;
int nUnicodeLength = lstrlenW(lpwData);
TRACE("Unicode! Äëèíà ñòðîêè = %d\n", nUnicodeLength);

szDataFromUnicode = new char[nUnicodeLength + 1];
VERIFY(WideCharToMultiByte(CP_THREAD_ACP, 0, lpwData, -1, szDataFromUnicode,
nUnicodeLength + 1, 0, 0));

strData = szDataFromUnicode;
TRACE("%s %s\n", strData, szData);
delete[] szDataFromUnicode;

} else strData = szData;

InverseWordLanguage(strData);
GlobalUnlock(hglb);
EmptyClipboard();

int nLength = strData.GetLength();

/////////////////////////////////////////////////////////

HGLOBAL hglbCopy = GlobalAlloc(GMEM_DDESHARE, nLength + 1);
LPTSTR lptstrCopy = (LPTSTR) GlobalLock(hglbCopy);

lstrcpy(lptstrCopy, strData);
GlobalUnlock(hglbCopy);

VERIFY(SetClipboardData(CF_TEXT, hglbCopy));

/////////////////////////////////////////////////////////
// UNICODE

hglbCopy = GlobalAlloc(GMEM_DDESHARE,
2 * nLength + 2); // äëÿ Unicode - ñèìâîëîâ
LPWSTR lpwstrCopy = (LPWSTR) GlobalLock(hglbCopy);
ZeroMemory(lpwstrCopy, 2 * nLength + 2);
MultiByteToWideChar(CP_THREAD_ACP, 0, (LPCSTR) strData, -1,
lpwstrCopy, nLength);

GlobalUnlock(hglbCopy);
VERIFY(SetClipboardData(CF_UNICODETEXT, hglbCopy));

///////////////////////////////////////////////////

CloseClipboard();
}
}
}

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.