Можно ли BitBlt непосредственно на растровую карту GDI+?
Вопрос
Я пытаюсь бить от HBITMAP до растровой карты GDI+. Я попробовал это, но ничего не происходит:
Bitmap Buffer = New Bitmap(608, 392)
Graphics BufferGraphics = Graphics.FromImage(Buffer);
IntPtr hBufferDC = BufferGraphics.GetHdc();
...
BitBlt(hBufferDC, x, y, width, height, hInputDC, 0, 0, SRCCOPY);
РЕДАКТИРОВАТЬ: Видимо, HDC не работает, если я приобретаю его, а затем намного позже использую его с BitBlt. Мне нужно было убедиться, что HDC все еще действителен. Это решение:
Bitmap Buffer = New Bitmap(608, 392)
Graphics BufferGraphics = Graphics.FromImage(Buffer);
...
IntPtr hBufferDC = BufferGraphics.GetHdc();
BitBlt(hBufferDC, x, y, width, height, hInputDC, 0, 0, SRCCOPY);
BufferGraphics.ReleaseHdc(hBufferDC);
Кто -нибудь знает, почему это изменение необходимо? Почему это не может работать, чтобы использовать HDC, который был получен раньше, как в первом примере?
Решение
Проверьте образец в конце этого страница на pinvoke.net. Дополнительные вызовы CreateCompatibledc и SelectObject могут сделать ваш образец работы.
В качестве альтернативы, вы можете рассмотреть возможность использования graphics.drawimageunscalled, что позволило бы вам реализовать свой код только на стороне .NET и все равно предложит довольно хорошую производительность.
Обновлять (Из -за обновленного вопроса)
Я не знаю точно, почему HDC становится недействительным через некоторое время, но согласно MSDN Вы называете GETHDC и ReleaseHDC в парах и группируйте вызовы в код GDI+ между ними: «Вызовы в методах GETHDC и релиз HDC должны появляться в парах. Во время объема пары методов GETHDC и релиз HDC вы обычно вызовывают только вызовы функций GDI. "
Таким образом, в соответствии с документацией, то, как вы это сделали во втором образце, - это путь, и вы не должны кэшировать и повторно использовать значения из метода GETHDC.