| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > ClipBoard через MFC |
| Автор: ShurikA 13.8.2006, 09:54 | ||
Пытаюсь записать картинку в ClipBoard ц помощью классов MFC, вот таким образом:
во первых дебагер на меня ругается что пользую pIData без инициализации а во вторых: на правильном ли я пути? |
| Автор: 0x07L 13.8.2006, 10:09 |
| Извини, конечно, но память под pIData все-таки надо выделить |
| Автор: ShurikA 13.8.2006, 10:10 |
| А разве обьявлением переменной я не выделяю память? Добавлено @ 10:18 Ладно, эту проблемму я решил. Теперь он вроде как копирует дату, но при попытке вставить её на пример в MS Paint вылетает ошибка вот в етой функцие: AFX_STATIC HGLOBAL AFXAPI _AfxCopyGlobalMemory(HGLOBAL hDest, HGLOBAL hSource) |
| Автор: ShurikA 13.8.2006, 10:28 |
| Так, есть продолжение: поменял TYMED_HGLOBAL на TYMED_GDI, стало копировать картинку правилных размеров, но на кастинке неопределённый бардак. Добавлено @ 10:38 и при этом, если я хочу скопировать ещё раз уже вылетает ошибка в COleDataSource::Empty() ??? |
| Автор: 0x07L 13.8.2006, 11:04 |
| К сожалению, я не успел еще поработать с буфером обмена в MFC. Использовал его только через API. Могу предположить, что здесь тоже необходима возня с хендлами, как в WinAPI. Для того чтобы копировать текст, мне приходилось: 1) выделить нужное количество памяти через GlobalAlloc (обязательно!) и получить HGLOBAL 2) вызвать GlobalLock и получить "нормальный" хендл 3) записать по хендлу текст 4) вызвать GlobalUnlock 5) вызвать SetClipboardData() Скорее всего, у тебя проблема не из-за этого. Тем более, у тебя вроде HBITMAP, а не HGLOBAL. Возможно, проблема из-за того, что ты не открываешь буфер обмена перед записью в него. Хотя, может быть, pData->SetClipboard() делает это, но не уверен. Может быть, тебе нужно 1) вызвать OpenClipboard() и проверить возвращенное значение 2) вызвать EmptyClipboard() 3) здесь сделать то, что написано в твоем посте 4) вызвать CloseClipboard() Еще проблемка может быть в том, что (MSDN) After the call to CacheData the ptd member of lpFormatEtc and the contents of lpStgMedium are owned by the data object, not by the caller. Возможно, тебе нельзя использовать хендл картинки после вызова CacheData(). Копировать ее, что ли? Повторяю, в данном вопросе я абсолютно некомпетентен. В первую очередь, попробуй добавить OpenClipboard() ... CloseClipboard(). Во вторую - копируй картинку. В третью - добавь GlobalAlloc. В четвертую - жди, пока тебе не ответит кто-нибудь поопытнее. |
| Автор: ShurikA 13.8.2006, 13:02 | ||
Сделал вот так:
и ничего не поменялось... |
| Автор: ShurikA 14.8.2006, 12:53 |
| неужели никто не знает? |