2009-10-07 2 views
3

Используйте SelectObject() в вашей памяти DC, чтобы выбрать битмап в нем. Это меня озадачивает. Я прочитал msdn, но все еще не знаю, как заполнить второй параметр SelectObject().Программирование API VC++ win32: как я могу получить изображение из буфера обмена и отобразить его в окнах?

+0

Если у вас есть дополнительные вопросы по этому вопросу, пожалуйста, создайте * новый * вопрос вместо обновления этого. Например: «Я пытаюсь выбрать растровое изображение в DC памяти с помощью SelectObject(). Я не понимаю цели второго параметра SelectObject() даже после чтения MSDN. Что мне нужно передать в SelectObject()? " –

ответ

7

Позвоните OpenClipbard(), чтобы открыть буфер обмена и вызвать GetClipboardData() с типом CF_BITMAP, чтобы получить дескриптор данных изображения, хранящихся в буфере обмена. Если в буфере обмена нет изображения, возвращается дескриптор NULL.

Затем внутри WM_PAINT обработчика вашего окна, используйте BeginPaint(), чтобы получить контекст устройства для рисования в окно, и использовать CreateCompatibleDC() создать контекст устройства памяти для растрового изображения. Используйте SelectObject() в своей памяти DC, чтобы выбрать в нем растровое изображение, и, наконец, используйте BitBlt(), чтобы разбить растровое изображение из памяти DC на DC окна. Не забудьте очистить - вызовите DeleteDC(), чтобы удалить память DC, и позвоните EndPaint(), чтобы завершить чертеж.

И наконец, позвоните по телефону CloseClipboard(), когда закончите. Обратите внимание, что буфер обмена владеет ручкой растрового изображения, и как только вы вызываете CloseClipboard(), растровое изображение будет уничтожено. Итак, если вы хотите повесить на растровое изображение после того, как вы закрыли буфер обмена, вам нужно будет сделать его копию.