2010-06-29 12 views
5

Ich schreibe eine nicht verwaltete Win32 C++ - Funktion, die ein Handle zu einer Bitmap erhält, und ich muss darauf zeichnen.Wie zeichne ich auf gegebenes Bitmap-Handle (C++/Win32)?

Mein Problem ist, dass ich zeichnen muss, um einen Gerätekontext zu bekommen, aber wenn ich GetDC (NULL), gibt es mir einen Gerätekontext für das WINDOW! Der Parameter für GetDC() ist ein Fensterhandle (HWND), aber ich habe kein Fenster; nur ein Bitmap-Handle.

Wie kann ich auf diese Bitmap zeichnen? Vielen Dank!

Antwort

2

Neben der Antwort von Pavel hat mich auch das "Kompatibel mit dem Bildschirm" immer abgehört, aber da CreateCompatibleDC(NULL) universell für diesen Zweck verwendet wird, nehme ich an, dass es korrekt ist.

Ich denke, dass das „kompatibel“, was nur zu DDB verwendet ist (die DC eingerichtet ist, auf der richtigen DDB für den aktuellen Bildschirm zu schreiben), aber keinen Einfluss auf Lese-/schreibt auf DIBs.

Also, um sicher zu sein, immer DIBs und nicht DDBs verwenden, wenn Sie mit Bitmaps arbeiten müssen, die nicht nur vorübergehend auf dem Bildschirm gehen müssen, heutzutage ist der Unterschied in der Leistung vernachlässigbar. Weitere Informationen zu DIBs und DDBs finden Sie unter here.

1

CreateCompatibleDC() und SelectObject() Ihre Bitmap hinein.

Es kann jedoch nicht jedes Bitmap in einem DC ausgewählt werden. Möglicherweise müssen Sie mit dem Mapping-Modus und anderen Optionen von Speicher-DCs spielen.

+0

Aber CreateCompatibleDC() nimmt eine HDC als Parameter. Wenn ich eine HDC hätte, müsste ich keine erstellen! (Gibt es etwas, das ich übersehen habe?) – user20493

+2

'CreateCompatibleDC' kann NULL als Parameter annehmen und erstellt einen Speicher-DC, der mit dem Anwendungsbildschirm kompatibel ist. Sie können dann entweder SelectObject Ihre Bitmap darin einfügen, wie Sie sagten, Sie können CreateCompatibleBitmap() und dann BitBlt() Ihre ursprüngliche in die DC. –

+0

Ich versuche, auf eine 8bpp-Bitmap zu zeichnen. Dies ist natürlich nicht mit dem Anwendungsbildschirm kompatibel. Ist es möglich, auf eine solche Bitmap zu zeichnen? – user20493

0

Das grundlegende Win32-Paradigma zum Zeichnen einer Bitmap besteht darin, dass Sie die Bitmap auf einen Gerätekontext auswählen. Danach werden alle Zeichenoperationen für diesen Gerätekontext in der Bitmap gespeichert. Sie verwenden dann eine der verschiedenen "Blit" -Operationen (z. B. StretchBlt), um diese auf eine Anzeigeoberfläche zu übertragen, die nur der Gerätekontext eines Fensterclientbereichs ist.

Andere haben bessere Details zur Verfügung gestellt, das ist nur die High-Level-Ansicht.

+0

Danke für die Antwort, aber ich muss 8bpp Bilder speichern, die nicht mit dem Display kompatibel sind. Dies ist die Quelle (kein Wortspiel beabsichtigt) des Problems. – user20493

+0

@alankdkd: Nun, nichts sagt, dass Sie eine Bitmap anzeigen müssen, aber Sie können trotzdem GDI-Operationen verwenden, um auf diese Weise zu zeichnen. Sie sollten sich CreateDIBitmap() oder CreateDIBSection() ansehen, wenn Sie ungewöhnliche Pixel-Organisationen benötigen. – JustJeff

0

Nun, das ist ein bisschen außerhalb der Box .. Ich denke, .. Aber ich weiß, dass Graphics kann return a HDC und Graphics seine ctor ein Bitmap als Argument nehmen. Eine Bitmap wiederum kann created from a HBITMAP and a HPALETTE sein. Das einzige Problem hier ist, dass ich nicht weiß, ob das HPALETTE Argument NULL sein kann.

Graphics* g; 
Bitmap* bitmap; 
HBITMAP _bitmap; // <- this one is yours 

bitmap = Bitmap::FromHBITMAP(_bitmap, NULL); 
g = new Graphics(bitmap); 

HDC hdc = g->GetHDC(); 

// when done, call g->ReleaseHDC(hdc); 

Allerdings würde ich Sie bitten, die HDC als Argument an die Funktion als auch zu erhalten .. Ich glaube nicht, dass jemand eine BITMAP haben wird und nicht das DC zu ihm haben.
Wenn Sie diese Probleme mit der Suche nach einer HDC zu einem HBITMAP haben, so werden alle anderen.

+0

Danke für den Vorschlag, aber das muss in nicht verwaltetem Win32 sein, das (leider) nicht die Grafikklasse hat. – user20493

Verwandte Themen