![]() |
[GDI] Offscreen Bitmap - solved
Hoi
ich brauch mal wieder Hilfe. Erstmal mein bisheriger Code:
Code:
Wie krieg ich jetzt nen DC/ein Bitmap mit ner bestimmten Farbtiefe (24, besser 32 Bit)? Der hier scheint jedenfalls monochrom zu sein, das rote Rechteck ist aus Schwarz und Weiß gerastert :(.
HBITMAP hBMP;
HDC hDC; RECT Rect; int *pixels = new int[512*512]; hDC = CreateCompatibleDC(GetDC(NULL)); // GetDC(NULL) sollte einen DC zum Bildschirm zurückgeben, also in FARBE (bei mir jedenfalls) hBMP = CreateCompatibleBitmap(hDC, 512, 512); SelectObject(hDC, hBMP); Rect = (RECT){1, 1, 100, 100}; SetDCBrushColor(hDC, 0x00000000); HBRUSH hBrush = CreateSolidBrush(0x000000FF); FillRect(hDC, &TextRect, hBrush); DeleteObject(hBrush); // zum angucken auf den Schirm blitten BitBlt(GetDC(NULL), 0, 0, 512, 512, hDC, 0, 0, SRCCOPY); DeleteObject(hBMP); DeleteDC(hDC); delete [] pixels; Und wie komm ich hinterher an die Pixeldaten? Bei CreateBitmap kann man ja nen Pointer angeben (pixels), den vermiss ich hier auch. Wenns nur ein Rechteck zu zeichnen wär würd ichs ja selber machen, aber ich brauch GDI weil ich eigentlich Text zeichnen will.+ (Edith hats gelöst) |
Re: [GDI] Offscreen Bitmap
Was an TCanvas.TextOut() gefällt dir denn nicht?
Edit: Ach, C++! Wenns Borland C++ ist, gibts da aber ja auch die VCL und somit TCanvas 8) |
Re: [GDI] Offscreen Bitmap
Mit dem [GDI] im Titel wollte ich eigentlich andeuten dass ich GDI benutzen will und keine VCL und kein TCanvas ;)
Das Problem ist auch garnicht der Text sondern wie oben steht einen bunten offscreen DC zu kriegen und hinterher an die Pixel zu kommen. |
Re: [GDI] Offscreen Bitmap
Zitat:
Zu dem Problem: Ich hab bisher sehr wenig mit der GDI direkt gemacht, aber hilft es evtl. den Brush mit SelectObject in den DC zu selektieren? Ich weiss jetzt nicht, was GetDC(0) liefert, aber laut msdn kannst du CreateCompatibleDC direkt mit NULL aufrufen um einen Screen-DC zu erhalten. Vielleicht tuts das ja :) |
Re: [GDI] Offscreen Bitmap
Zitat:
Es geht auch nicht darum auf die VCL zu verzichten, ich hab einfach garkeine. Gibt ja nicht nur Borland C++. Zitat:
Zitat:
|
Re: [GDI] Offscreen Bitmap
![]() Zitat:
Zitat:
|
Re: [GDI] Offscreen Bitmap
Das klingt nach einem Teufelskreis, der DC ist monochrom und nimmt Farbinfos vom Bitmap, das Bitmap wird aber mit den Farben vom DC erzeugt. Und es gibt keine Mäglichkeit das zu ändern, jedenfalls hab ich noch keine gefunden :D
![]() So schauts aus, sowohl mit NULL als auch mit GetDC(NULL) bei CreateCompatibleDC ![]() ![]() |
Re: [GDI] Offscreen Bitmap
Also eines kann ich dir zumindest jetzt schon sagen: Es liegt nicht an einem Problem mit deinem Rechner. Ich hab deinen Code mal (mangels C++ Compiler) nach Delphi übersetzt, und bekomme das selbe Resultat. Immerhin schon mal etwas ;)
Edit: Folgendes klappt: DC := GetDC(0); oder DC := CreateDC(PChar('DISPLAY'), nil, nil, nil); Beides gibt einen DC zurück, auf den sich farbig zeichnen lässt. Sobald man aber CreateCompatibleDC() über einen derjenigen ausführt, ist der resultierende wieder monochrom. Daher sollte an und für sich auf jeden Fall die 2. Variante benutzbar sein. Ich habe mir das auch grad nur zusammengedokort da ich "zu Fuß" über GDI bislang auch nur eher sporadisch unterwegs war, aber hey! Zumindest war das Rechteck rot ;) |
Re: [GDI] Offscreen Bitmap
Willst du nicht erst einmal ein Bitmap erzeugen?
![]() Danach kannst du dann von DC zu DC blitten, wie du lustig bist :) |
Re: [GDI] Offscreen Bitmap
Hat er ;)
Zitat:
|
Re: [GDI] Offscreen Bitmap
Ja aber wenn ich aufn monochromen DC blit hab ich auch nix davon.
Lustig bin ich fast immer, daran sollts net scheitern :D Der kompatible DC is erstmal immer monochrom und 1x1 Pixel groß. Der braucht ja dann ein (buntes) größeres Bitmap. Aber es geht halt auch nur mit nem kompatiblen Bitmap, wenn ich eins mit CreateBitmap erzeug kann des noch so bunt sein, er malt mir dann aufn Bildschirm, selbst mit dem Memory DC :( |
Re: [GDI] Offscreen Bitmap
Nochmal in Klartext: Ersetze diese Zeile:
Code:
mit dieser:
hDC = CreateCompatibleDC(GetDC(NULL));
Code:
Sonst nichts, und schau ob das so ist, wie du es möchtest.
hDC = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
|
Re: [GDI] Offscreen Bitmap
Nein, so hatt ichs zuerst. Das malt zwar in Farbe aber aufn Bildschirm und nicht ins Bitmap :(
Sowohl mit nem kompatiblen als auch mit nem 'normalen' Bitmap. |
Re: [GDI] Offscreen Bitmap
Hm, okay, mist :) Dann muss ich hier leider aussteigen, das war schon leicht über der Grenze meines Lateins ;)
Ich sollte mich eindeutig mal mehr mit der API beschäftige... |
Re: [GDI] Offscreen Bitmap
Ok, ich hab einen kleinen Fortschritt erzielt^^
Ich komm an meine Pixeldaten :love:
Code:
Fehlt nur noch etwas Farbe...
GetDIBits(hDC, hBMP, 0, 512, pixels, &BmpInfo, DIB_RGB_COLORS);
//Edit: Manchmal hilfts in Beispiele zu gucken die nicht ganz direkt was damit zu tun haben: ![]() Zitat:
Das hier tuts auch und ist meiner Meinung nach sauberer weil kein ungenutzter DC erzeugt werden muss:
Code:
HDC hDC,
hTmpDC = GetDC(HWND_DESKTOP); // ... hDC = CreateCompatibleDC(hTmpDC); hBMP = CreateCompatibleBitmap(hTmpDC, 512, 512); |
Re: [GDI] Offscreen Bitmap - solved
@Medium ops... passiert *g* das nächste mal bin ich wohl lieber ruhig ;)
|
Re: [GDI] Offscreen Bitmap - solved
Also das Bitmap mit dem ersten DC als Parameter erstellen, um es dann im davon ausgehend erzeugten zweiten DC zu benutzen ist die Lösung. Machmal... also, nur manchmal, da wundere ich mich schon ob jetzt der Entwickler dieser API einen im Tee hatte, oder ob mein Kaffee nur zu schwach war um dem einen tieferen Sinn beimessen zu können :gruebel:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz