Как оставить содержимое Clipboard после закрытия RichEdit
От: ValeraVi Украина http://www.vi-soft.com.ua
Дата: 13.02.04 22:00
Оценка:
Использую в программе dialog-based на MFC RichEdit в его нормальном режиме, т.е. в режиме отображения RichTextFormat.
Проблема в том, что при копировании текста из этого РичЕдита в ClipBoard, вставить его куда либо можно только пока мою программу не закрыли. По выходу из программы скопированный текст удаляется РичЕдитом (наверно).
Вопрос 1: как сделать так чтобы после выхода из моей проги, текст оставался в буффере обмена?

Вопрос 2: как узнать, текущее содержимое буффера обмена скопировано из моего РичЕдита или нет? Пробовал использовать:
if(::GetClipboardOwner()!=m_MyRichEditCtrl.GetSafeHwnd())
    return; //т.е. выходим если в буффере данные не из моего РичЕдита

ничего не получилось, т.к. GetClipboardOwner (при заведомо извесном содержимом буффера обмена — из моего ричедита) возвращает хендл какого-то непонятного окна без caption, без parent, без owner, без ничего ...
http://www.vi-soft.com.ua
Re: Как оставить содержимое Clipboard после закрытия RichEdi
От: Othello  
Дата: 17.02.04 10:09
Оценка:
> Использую в программе dialog-based на MFC RichEdit в его нормальном режиме, т.е. в режиме отображения RichTextFormat.
> Проблема в том, что при копировании текста из этого РичЕдита в ClipBoard, вставить его куда либо можно только пока мою программу не закрыли. По выходу из программы скопированный текст удаляется РичЕдитом (наверно).
> Вопрос 1: как сделать так чтобы после выхода из моей проги, текст оставался в буффере обмена?
>
> Вопрос 2: как узнать, текущее содержимое буффера обмена скопировано из моего РичЕдита или нет? Пробовал использовать:
>
> if(::GetClipboardOwner()!=m_MyRichEditCtrl.GetSafeHwnd())
> return; //т.е. выходим если в буффере данные не из моего РичЕдита
>

> ничего не получилось, т.к. GetClipboardOwner (при заведомо извесном содержимом буффера обмена — из моего ричедита) возвращает хендл какого-то непонятного окна без caption, без parent, без owner, без ничего ...
Прочитайте здесь
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re[2]: Как оставить содержимое Clipboard после закрытия Rich
От: ValeraVi Украина http://www.vi-soft.com.ua
Дата: 17.02.04 13:00
Оценка:
Здравствуйте, Othello, Вы писали:
O>Прочитайте здесь
спасибо, эту теорию я читал, но по теории ничего не получается (см. код в моем первом посте), может кто на практике с этим сталкивался и эту проблему как-то решил?
http://www.vi-soft.com.ua
Re: Как оставить содержимое Clipboard после закрытия RichEdi
От: alex_shar  
Дата: 10.03.05 15:37
Оценка:
Здравствуйте, ValeraVi, Вы писали:

VV>Использую в программе dialog-based на MFC RichEdit в его нормальном режиме, т.е. в режиме отображения RichTextFormat.

VV> Проблема в том, что при копировании текста из этого РичЕдита в ClipBoard, вставить его куда либо можно только пока мою программу не закрыли. По выходу из программы скопированный текст удаляется РичЕдитом (наверно).
VV> Вопрос 1: как сделать так чтобы после выхода из моей проги, текст оставался в буффере обмена?

VV> Вопрос 2: как узнать, текущее содержимое буффера обмена скопировано из моего РичЕдита или нет? Пробовал использовать:

VV>
VV>if(::GetClipboardOwner()!=m_MyRichEditCtrl.GetSafeHwnd())
VV>    return; //т.е. выходим если в буффере данные не из моего РичЕдита
VV>

VV>ничего не получилось, т.к. GetClipboardOwner (при заведомо извесном содержимом буффера обмена — из моего ричедита) возвращает хендл какого-то непонятного окна без caption, без parent, без owner, без ничего ...

Первую проблему решил включением RichEdit'a в список окон просмотра буфера обмена :

//OnCreate
...
m_hNextViewer = SetClipboardViewer();
...

//OnDestroy
...
ChangeClipboardChain(m_hNextViewer);
...
Re[2]: Как оставить содержимое Clipboard после закрытия Rich
От: ValeraVi Украина http://www.vi-soft.com.ua
Дата: 11.03.05 03:14
Оценка:
Здравствуйте, alex_shar, Вы писали:

VV>> Вопрос 1: как сделать так чтобы после выхода из моей проги, текст оставался в буффере обмена?


_>Первую проблему решил включением RichEdit'a в список окон просмотра буфера обмена :


_>
_>//OnCreate
_>...
_>m_hNextViewer = SetClipboardViewer();
_>...

_>//OnDestroy
_>...
_>ChangeClipboardChain(m_hNextViewer);
_>...

_>



А смысл? моя прога не является вьювером содержимого буффера обмена...
Я решил эту проблему тупо — раз содержимое того что поместил ричедит в буффер обмена не сохраняется после выхода из проги, то значит он его как-то не так туда помещает (т.к. если помещать его правильно, с глобал аллоком и т.п. — после выхода ничего не удаляется). То перед выходом из проги, нужно вычитать из буффера обмета то что туда поместил ричедит (но не правильно), очистить буффер обмена, а потом загнать туда вычитанное обратно, но уже правильно. И все получилось. Правда решение оказалось очень громоздким и я б его с удовольствием поменял на ваше, если б вы объяснили принцип его работы ...
http://www.vi-soft.com.ua
Re[3]: Как оставить содержимое Clipboard после закрытия Rich
От: Pavel Dvorkin Россия  
Дата: 11.03.05 09:34
Оценка:
Здравствуйте, ValeraVi, Вы писали:

VV>Я решил эту проблему тупо — раз содержимое того что поместил ричедит в буффер обмена не сохраняется после выхода из проги, то значит он его как-то не так туда помещает


Вполне возможно, что "не так". А именно

HANDLE SetClipboardData(UINT uFormat,HANDLE hMem);

hMem
[in]Handle to the data in the specified format. This parameter can be NULL, indicating that the window provides data in the specified clipboard format (renders the format) upon request. If a window delays rendering, it must process the WM_RENDERFORMAT and WM_RENDERALLFORMATS messages. If a window delays rendering, it must process the WM_RENDERFORMAT and WM_RENDERALLFORMATS messages (выделение мое — DP).

Т.е. не исключено, что ричедит не засылает данные в буфер, а только обязуется их представить по требованию. Пока он жив, он и представляет. Ну а после смерти даже УК никаких претензий не предъявляет

Проверить можно с помощью Spy++, получает ли richedit WM_RENDERFORMAT или WM_RENDERALLFORMATS при попыике взять данные из буфера.

Бороться с этим (если это действительно так) невозможно.
With best regards
Pavel Dvorkin
Re[4]: Как оставить содержимое Clipboard после закрытия Rich
От: alex_shar  
Дата: 11.03.05 10:38
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Проверить можно с помощью Spy++, получает ли richedit WM_RENDERFORMAT или WM_RENDERALLFORMATS при попыике взять данные из буфера.


PD>Бороться с этим (если это действительно так) невозможно.


Посмотрел SPYем — нету такого.
Re[3]: Как оставить содержимое Clipboard после закрытия Rich
От: alex_shar  
Дата: 11.03.05 10:46
Оценка:
Здравствуйте, ValeraVi, Вы писали:

VV>Здравствуйте, alex_shar, Вы писали:


VV>>> Вопрос 1: как сделать так чтобы после выхода из моей проги, текст оставался в буффере обмена?


_>>Первую проблему решил включением RichEdit'a в список окон просмотра буфера обмена :


_>>
_>>//OnCreate
_>>...
_>>m_hNextViewer = SetClipboardViewer();
_>>...

_>>//OnDestroy
_>>...
_>>ChangeClipboardChain(m_hNextViewer);
_>>...

_>>



VV>А смысл? моя прога не является вьювером содержимого буффера обмена...

Согласен, сделал это в попытке разобраться и вдруг заработало.

На самом деле у меня и так работала эта функциональность, до тех пор пока я не уничтожал окно(Property Page) вызвавшее тот диалог в котором рич-едит содержится. К сожалению при повторном открытии Property Page и использовании диалога с рич-едитом уже перестает работать. Так что видимо мне еще долго придется разбираться где данные из Clipboarda исчезают. Возможно твоим путем придется пойти

VV>Я решил эту проблему тупо — раз содержимое того что поместил ричедит в буффер обмена не сохраняется после выхода из проги, то значит он его как-то не так туда помещает (т.к. если помещать его правильно, с глобал аллоком и т.п. — после выхода ничего не удаляется). То перед выходом из проги, нужно вычитать из буффера обмета то что туда поместил ричедит (но не правильно), очистить буффер обмена, а потом загнать туда вычитанное обратно, но уже правильно. И все получилось. Правда решение оказалось очень громоздким и я б его с удовольствием поменял на ваше, если б вы объяснили принцип его работы ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.