Question

J'essaie de bitblt d'un hbitmap à un bitmap GDI +. J'ai essayé ça, mais rien ne se passe:

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);

ÉDITER: Apparemment, le HDC ne fonctionne pas si je l'acquise et que je l'utilise beaucoup plus tard avec BitBlT. J'avais besoin de m'assurer que le HDC était toujours valable. Ceci est la solution:

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);

Quelqu'un sait-il pourquoi ce changement est nécessaire? Pourquoi cela pourrait-il ne pas fonctionner d'utiliser un HDC qui a été obtenu plus tôt comme dans le premier exemple?

Était-ce utile?

La solution

Vérifiez l'échantillon à la fin de cela page sur pinvoke.net. Les appels supplémentaires vers CreateCompatibedC et SelectObject peuvent faire fonctionner votre échantillon.

Alternativement, vous pouvez envisager d'utiliser Graphics.DrawimageUnScalled, ce qui vous permettrait d'implémenter votre code uniquement du côté .NET et offrirait toujours une assez bonne performance.

Mise à jour (En raison de la question mise à jour)
Je ne sais pas exactement pourquoi le HDC devient invalide après un certain temps, mais selon MSDN Vous appelez GETHDC et releaseHDC dans les paires et regroupez les appels vers le code GDI + entre eux: "Les appels aux méthodes GETHDC et ReleaseHDC doivent apparaître par paires. Pendant l'étendue d'une paire de méthode GETHDC et LimeSHDC, vous ne faites généralement que des appels aux fonctions GDI. "

Donc, selon la documentation, la façon dont vous l'avez fait dans votre deuxième échantillon est la voie à suivre et vous ne devez pas mettre en cache et réutiliser les valeurs de la méthode GETHDC.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top