Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Буфер обмена в формате CF_BITMAP |
Автор: dimbas 9.10.2010, 21:29 | ||
Необходимо отрисовать на форме изображение из буфера обмена. Есть обработчик:
Говорит, что "GetClipboardData(CF_BITMAP) has failed" =) Если GetClipboardData закомментировать и ,соответственно, раскомментировать LoadImage, все работает прекрасно, то есть, рисуется бмп из ресурса. В чем может быть проблема? Не конвертится HANDLE к HBITMAP-у? |
Автор: xvr 10.10.2010, 09:58 |
Видимо в том, что в Clipboard лежит не Bitmap. Clipboard не может вернуть любой формат, который захочется программисту, а только тот, который в нее положили. Точнее некоторые форматы она может конвертировать (см http://msdn.microsoft.com/en-us/library/ms649013%28v=VS.85%29.aspx#_win32_Synthesized_Clipboard_Formats ), но далеко не все и не во все PS. Надеюсь OpenClipboard вы не забыли позвать? |
Автор: dimbas 10.10.2010, 12:33 | ||
Насчет форматов это понятно) Что перед запуском проги, что во время работы копирую кусок из пейнта. Дело не в этом. Только хотел писать "во я дурак, забыл openclipboard", но не тут то было. Читается из клипбоарда и рисуется, только исчезает после перерисовки. То есть, отрисовывается только тогда, когда вызывается InvalidateRect() по событию WM_DRAWCLIPBOARD. Урезанный код WndProc:
Можно было бы подумать, что какие-то проблемы со слежением за буфером. Но ведь как раз после Ctrl+C-то и рисуется (я открываю свою прогу слева, Пейнт справа, так чтобы он не перекрывал те 48х48, где происходит рисование, и копирую из пейнта ровно 48х48 для уверенности. Если "испортить" часть отрисованного, оно остается белым). Проверка на формат работает: если скопировать текст, прога ругается "GetClipboardData(CF_BITMAP)". Наверное, я где-то опять туплю ПС. а Опенклипбоард все-таки забыл)) upd Если читать из ресурса, то изображение остается на форме после перерисовки! upd2 Если закомментировать InvalidateRect() в case WM_DRAWCLIPBOARD и перед запуском скопировать в буфер картинку, то она отобразится сразу, но больше никогда |
Автор: xvr 10.10.2010, 18:09 |
Видимо кто то обнуляет clipboard после первой же перерисовки (проверьте, остается ли содержимое clipboard'а) Еще подозрительно выглядит отсутствие SelectObject на первоначальный объект после перерисовки (хотя может быть это и пройдет - надо проверить) |
Автор: dimbas 10.10.2010, 18:32 | ||||
Проверил вставкой в Пейнт после перерисовки. Не обнуляет.
Простите, не понял немного)) |
Автор: xvr 10.10.2010, 22:37 | ||
Из MSDN:
|
Автор: dimbas 11.10.2010, 10:30 | ||
Спасибо! Заработало!)) ![]() |