Использую в программе dialog-based на MFC RichEdit в его нормальном режиме, т.е. в режиме отображения RichTextFormat.
Проблема в том, что при копировании текста из этого РичЕдита в ClipBoard, вставить его куда либо можно только пока мою программу не закрыли. По выходу из программы скопированный текст удаляется РичЕдитом (наверно).
Вопрос 1: как сделать так чтобы после выхода из моей проги, текст оставался в буффере обмена?
Вопрос 2: как узнать, текущее содержимое буффера обмена скопировано из моего РичЕдита или нет? Пробовал использовать:
if(::GetClipboardOwner()!=m_MyRichEditCtrl.GetSafeHwnd())
return; //т.е. выходим если в буффере данные не из моего РичЕдита
ничего не получилось, т.к. GetClipboardOwner (при заведомо извесном содержимом буффера обмена — из моего ричедита) возвращает хендл какого-то непонятного окна без caption, без parent, без owner, без ничего ...
> Использую в программе 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
Здравствуйте, Othello, Вы писали: O>Прочитайте здесь
спасибо, эту теорию я читал, но по теории ничего не получается (см. код в моем первом посте), может кто на практике с этим сталкивался и эту проблему как-то решил?
Здравствуйте, 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 в список окон просмотра буфера обмена :
Здравствуйте, alex_shar, Вы писали:
VV>> Вопрос 1: как сделать так чтобы после выхода из моей проги, текст оставался в буффере обмена?
_>Первую проблему решил включением RichEdit'a в список окон просмотра буфера обмена :
_>
А смысл? моя прога не является вьювером содержимого буффера обмена...
Я решил эту проблему тупо — раз содержимое того что поместил ричедит в буффер обмена не сохраняется после выхода из проги, то значит он его как-то не так туда помещает (т.к. если помещать его правильно, с глобал аллоком и т.п. — после выхода ничего не удаляется). То перед выходом из проги, нужно вычитать из буффера обмета то что туда поместил ричедит (но не правильно), очистить буффер обмена, а потом загнать туда вычитанное обратно, но уже правильно. И все получилось. Правда решение оказалось очень громоздким и я б его с удовольствием поменял на ваше, если б вы объяснили принцип его работы ...
Здравствуйте, ValeraVi, Вы писали:
VV>Я решил эту проблему тупо — раз содержимое того что поместил ричедит в буффер обмена не сохраняется после выхода из проги, то значит он его как-то не так туда помещает
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
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Проверить можно с помощью Spy++, получает ли richedit WM_RENDERFORMAT или WM_RENDERALLFORMATS при попыике взять данные из буфера.
PD>Бороться с этим (если это действительно так) невозможно.
Посмотрел SPYем — нету такого.
Re[3]: Как оставить содержимое Clipboard после закрытия Rich
Здравствуйте, ValeraVi, Вы писали:
VV>Здравствуйте, alex_shar, Вы писали:
VV>>> Вопрос 1: как сделать так чтобы после выхода из моей проги, текст оставался в буффере обмена?
_>>Первую проблему решил включением RichEdit'a в список окон просмотра буфера обмена :
_>>
VV>А смысл? моя прога не является вьювером содержимого буффера обмена...
Согласен, сделал это в попытке разобраться и вдруг заработало.
На самом деле у меня и так работала эта функциональность, до тех пор пока я не уничтожал окно(Property Page) вызвавшее тот диалог в котором рич-едит содержится. К сожалению при повторном открытии Property Page и использовании диалога с рич-едитом уже перестает работать. Так что видимо мне еще долго придется разбираться где данные из Clipboarda исчезают. Возможно твоим путем придется пойти
VV>Я решил эту проблему тупо — раз содержимое того что поместил ричедит в буффер обмена не сохраняется после выхода из проги, то значит он его как-то не так туда помещает (т.к. если помещать его правильно, с глобал аллоком и т.п. — после выхода ничего не удаляется). То перед выходом из проги, нужно вычитать из буффера обмета то что туда поместил ричедит (но не правильно), очистить буффер обмена, а потом загнать туда вычитанное обратно, но уже правильно. И все получилось. Правда решение оказалось очень громоздким и я б его с удовольствием поменял на ваше, если б вы объяснили принцип его работы ...