Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
1

из EM_STREAMOUT в EM_STREAMIN, или зацикленные похождения капитана CALLBACK

01.11.2013, 16:22. Показов 1001. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет,
есть желание скопировать часть текста одного окна richedit в другой. Не мудрствуя лукаво, составлены два коллбека и структура
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
struct aus // Посылка
    {
    HWND to;
    char * wv;
    LONG wn;
    };
 
DWORD CALLBACK ToFrontCallback (DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
    {
    aus * a = (aus*)dwCookie;
    strncpy((char*)pbBuff, a->wv, a->wn); // копируем содержимое посылки
    *pcb=a->wn;                                    // Расписываемся
    return 0;                                          // Закрывам дверь
    }
 
DWORD CALLBACK FromBackCallback (DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
    {
    aus * a = (aus*)dwCookie;
    LONG p = 0;
    EDITSTREAM es;
    es.dwCookie = (DWORD_PTR)a;
    es.dwError = 0;
    es.pfnCallback = ToFrontCallback;// Следующий почтовый пункт
    a->wv=pbBuff;                         // Текст посылки
    a->wn=cb;                              // Длина посылки
    CHARRANGE cr;
    cr.cpMax = -1;
    cr.cpMin = -1;
    SendMessage(a->to, EM_EXSETSEL, 0, (LPARAM)&cr); // Выбираем место у получателя
    SendMessage(a->to, EM_STREAMIN, SF_RTF|SCF_SELECTION, (LPARAM)&es); // Пересылаем посылку
    *pcb=cb;
    return 0;
    }
 
// копируем текст между пометками. 
void ConsoleWindow::End()
    {
    CHARRANGE cp,cr;
    SendMessage(fronthwnd, EM_EXGETSEL, 0, (LPARAM)&cp); // сохраняем выделение получателя
    cr.cpMax = -1;
    cr.cpMin = -1;
    SendMessage(backhwnd, EM_EXSETSEL, 0, (LPARAM)&cr); // в конец текста отправителя
    SendMessage(backhwnd, EM_EXGETSEL, 0, (LPARAM)&cr); // получаем номер последнего символа
    indexes.push_back(cr.cpMax);                                       // Сохрняем
    cr.cpMin = indexes[indexes.size()-2];                              // От предпоследнего до последнего
    cr.cpMax = indexes[indexes.size()-1];
    SendMessage(backhwnd, EM_EXSETSEL, 0, (LPARAM)&cr); // Выбираем текст в отправителе
    aus a;
    a.to = fronthwnd;
    EDITSTREAM es;
    es.dwCookie = (DWORD_PTR)&a;
    es.dwError = 1;
    es.pfnCallback = FromBackCallback;
    SendMessage(backhwnd, EM_STREAMOUT, SF_RTF|SCF_SELECTION, (LPARAM)&es); // Отправляем выделеный текст в формате
    SendMessage(fronthwnd, EM_EXSETSEL, 0, (LPARAM)&cp); // Восстанавливаем выделение получателя
    }

И это не работает. Если получатель пуст, он получает сообщение 2 раза, что отрицательно воздействует на его пищеварение. Да и в противном случае ничего не происходит. Что я делаю не так?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.11.2013, 16:22
Ответы с готовыми решениями:

Задача про капитана
Администрация морского порта издала следующие распоряжения: 1. Если капитан получает специальное...

RichEdit->RTF->EM_STREAMOUT
Здравствуйте. Второй день пытаюсь получить форматированный текст из стороннего RichEdit'а. Узнал...

Зацикленные Ханойские башни
def hanoi(n, x, y): if n > 0: if x % 3 + 2 == 0: hanoi(n - 1, x, y) ...

For_each и аргументы callback-функции; Как передать callback'у больше одного аргумента
Изучаю контейнеры и алгоритмы stl по Майерсу . С непривычки слегка охренел и запутался в них . В...

3
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
01.11.2013, 16:51 2
Что за константа такая SCF_SELECTION ? В документации описана другая: SFF_SELECTION
Они имеют разные значения.
#define SCF_SELECTION 0x0001
#define SFF_SELECTION 0x8000
0
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
01.11.2013, 21:03  [ТС] 3
castaway, Да, но нет, дело не только в этом.

Добавлено через 4 часа 1 минуту
[SOLVED] Решено.
Система имени Гавриила Аккакиевича Нипель. Делается так...

Получаем текст потоком, а вставляем RAWом, так как формат автоматически прожёвывается движком. Не спрашивайте, насколько прочная сидушка у этого велосипеда - не знаю. Главное, едет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DWORD CALLBACK FromCallback (DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
    {
    SendMessage ((HWND)dwCookie, EM_REPLACESEL, 0, (LPARAM)(char*)pbBuff);
    *pcb=cb;
    return 0;
    }
 
//...
    CHARRANGE cr;
    cr.cpMax = -1;
    cr.cpMin = -1;
    SendMessage(fronthwnd, EM_EXSETSEL, 0, (LPARAM)&cr);
    cr.cpMin = indexes[a];
    cr.cpMax = indexes[b];
    SendMessage(backhwnd, EM_EXSETSEL, 0, (LPARAM)&cr);
    EDITSTREAM es;
    es.dwCookie = (DWORD_PTR)&fronthwnd;
    es.dwError = 0;
    es.pfnCallback = FromCallback;
    SendMessage(backhwnd, EM_STREAMOUT, SF_RTF|SFF_SELECTION, (LPARAM)&es);
//...
0
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
13.11.2013, 17:39  [ТС] 4

Не по теме:

Силами Нер-Зула, Мора и Путина Я, кибермаг iCpu, приказываю тебе очнуться от долгого сна и восстать над землёй!


[UNSOLVED] Оказывается, тот метод, что я написал, работает не до конца. То есть он хорош, но при размерах текста более 64Кб начинают лезть артефакты - системные слова и Rich-форматирование\par
Я в замешательстве. Не знаю, откуда лезет, не знаю, чем закрыть брежь.\par
Идеи?\par
Invalid Command!\par
\cf1\highlight2\lang2049\f2\par
}
0
13.11.2013, 17:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2013, 17:39
Помогаю со студенческими работами здесь

Callback или ответ клиенту без запроса
Здравствуйте. Ситуация в кратце такая : у меня есть уже готовый сервис. Он создаёт множество...

Похождения коня
Добрый день! Пишу программу для решения шахматной задачи "Похождения коня," ( Условие :...

приватный метод в качестве callback'а (или криво спроектированный класс?)
Есть у меня класс для работы с БД, и он большой:) В какой-то момент я подумал, что было бы неплохо...

Вот мои похождения во что вылились.
Пр первом знакомстве встало очень много вопросов, попробовал собрать все воедино, и вот что пока...

CallBack C++
Всем привет! Похожий вопрос. Нужно заюзать колбеки. Если работаю без класов т.е функция не...

Callback
как использовать модуль для обратной связи ?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru