.bmp in DC laden __statt__ DC über hwnd-Handle füllen | was mach ich falsch?
-
Hallo

Ich nutze Code aus dem Internet in meinem aktuellen Projekt.
In diesem Code wird mit einem Fenster gearbeitet, besser gesagt mit dem DC des Fensters.
Und zwar wird dort ein Teilbereich des Fensters in ein neu angelegtes DC kopiert.Jetzt will ich aber nicht mit einem Abbild eines gerade laufenden Fensters arbeiten sondern mit einem Abbild eines Fensters das in einer .bmp gespeichert wird.
Also hab ich die (funktionierende!) Funktion abgeändert, und zwar wie folgt:
ORIGINAL CODE
HDC WinDC= GetDC (hwnd); // DC vom entsprechenden fenster holen HDC CopyDC= CreateCompatibleDC (WinDC); // DC erstellen in das später ein TeilStück vom Fenster kopiert wird subBmp = CreateCompatibleBitmap (WinDC, rt.right - rt.left+1, rt.bottom - rt.top+1); // eine Bitmap erstellen in die ich dann teile vom Fenster kopieren kann SelectObject (CopyDC, subBmp); BitBlt (CopyDC , 0,0, rt.right - rt.left+1, rt.bottom - rt.top+1, WinDC, rt.left,rt.top, SRCCOPY); // teil des fensters in CopyDC kopierenMein Code
HDC WinDC = GetDC(NULL); // << NULL statt das hwnd HDC CopyDC = CreateCompatibleDC (WinDC); loadBmp = LoadImage ( NULL, (char*)fileName.c_str(), IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE); // hier versuch ich das DC des Fensters mit den daten aus dem .bmp zu "simulieren" SelectObject (WinDC, loadBmp); // noch das geladene .bmp mit WinDC verknüpfen subBmp = CreateCompatibleBitmap (WinDC, rt.right - rt.left+1, rt.bottom - rt.top+1); SelectObject (CopyDC, subBmp); BitBlt (CopyDC,0,0, rt.right - rt.left+1, rt.bottom - rt.top+1, WinDC, rt.left,rt.top, SRCCOPY);Wie ihr seht hab ich nur in der ersten Zeile hwnd mit NULL ausgetauscht, weil ich ja kein hwnd hab.
Und dann hab ich noch die 2, im unteren CodeSchnipsel, kommentierten Lines eingefügt.Nur leide funktioniert das nicht..
Alle Return Werte hab ich überprüft und alle Funktionen werden ohne Fehler ausgeführt -.-Bitte helft mir, wo liegt mein Fehler??
Danke im voraus,
Aith
-
Wahrscheinlich gibt es Probleme, weil du versuchst, einem Fenster-DC ein neues Bitmap-Handle unterzujubeln:
SelectObject (WinDC, loadBmp);Wenn du das Bild einfach nur in den Copy-DC bringen willst, dann empfehle ich dir folgende Zeilen:
HDC WinDC = GetDC (NULL); HDC CopyDC = CreateCompatibleDC (WinDC); loadBmp = LoadImage (NULL, (char *)fileName.c_str(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); subBmp = CreateCompatibleBitmap (WinDC, rt.right - rt.left + 1, rt.bottom - rt.top + 1); SelectObject (CopyDC, subBmp); DrawState (CopyDC, (HBRUSH)GetStockObject (HOLLOW_BRUSH), NULL, (LPARAM)loadBmp, 0, bmpx, bmpy, bmpwidth, bmpheight, DST_BITMAP|DSS_NORMAL);
-
Hi

Erstmal Danke für deine Hilfe!
Hab deinen Code probiert, aber es tut sich nichts
Erst hab ich ihn so verwendet wie du ihn gepostet hast, dann ein wenig verändert, siehe unten!
So, nun zum aktuellen Status:
Zuerst erstell ich das DC in das das Bild rein muss. Das klappt auch 100%.
Danach hab ich 4 Dinge ausprobiert etwas in dieses DC zu bekommen!Versuch 1 (klappt nicht): Das Bild laden und mit der Methode meines Vorposters in CopyDC bekommen
Versuch 2 (klappt nicht): ch lade das Bild mit LoadImage, SelectObjecte es an ein neue erstelltes DC und versuch dann mit BitBlt von diesem neuen DC mein CopyDC zu füllen
Versuch 3 (KLAPPT): Diesmal nehm ich als Source kein .bmp sondern das DC des ForeGround Windows (die .bmp ist schlicht ein Screenshot dieses Fensters!) und versuche dann mit BitBlt CopyDC zu füllen.. Und siehe da, es klappt!
Versuch 4 (klappt nicht): Diesmal nehm ich als Source wieder kein .bmp sondern das DC des ForeGround Windows (die .bmp ist schlicht ein Screenshot dieses Fensters!) und versuche die Daten vom SourceDC mit Get/SetPixel ins CopyDC zu übertragen.. Klappt aber leider auch nicht

// Erstellen des Ziel DCs. Damit wird weitergearbeitet, jetzt muss nur noch ein Bild in diesen DC geladen werden! HDC CopyDC = CreateCompatibleDC (GetDC(NULL)); subBmp = CreateCompatibleBitmap (GetDC(NULL), width, height); SelectObject (CopyDC, subBmp); //Versuch 1: Bild aus .bmp laden und via DrawState in CopyDC kopieren //------------------------------------------------------------------------------------------ // loadBmp = (HBITMAP) LoadImage (NULL, (char *)fileName.c_str(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); // DrawState (CopyDC, (HBRUSH)GetStockObject (HOLLOW_BRUSH), NULL, (LPARAM)loadBmp, 0, 0, 0, width, height, DST_BITMAP|DSS_NORMAL); //Versuch 2: Bild aus .bmp laden und via DrawState in CopyDC kopieren //------------------------------------------------------------------------------------------ // HDC bmpDC = CreateCompatibleDC(GetDC(NULL)); // loadBmp = (HBITMAP) LoadImageA (NULL, (char*)fileName.c_str(), IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE); // oldBMP = (HBITMAP) SelectObject (bmpDC, loadBmp); // BitBlt (CopyDC, 0, 0, width, height, bmpDC, rt.left, rt.top, SRCCOPY); HDC WinDC = GetDC(GetForegroundWindow()); //Versuch 3: Bild aus offenen Fenster mit BitBlt kopieren //------------------------------------------------------------------------------------------ // BitBlt (CopyDC, 0, 0, width, height, WinDC, rt.left, rt.top, SRCCOPY); //Versuch 4: Bild via GetPixel und SetPixel aus offenem Fenster kopieren //------------------------------------------------------------------------------------------ //for(int x = 0; x < width; x++) // for(int y = 0; y < height; y++) // SetPixel(CopyDC, x, y, GetPixel(WinDC, x+rt.left, y+rt.top) );Verdammt ich komm einfach nicht dahinter was ich falsch mache.. Dabei hab ich schon alles mögliche ausprobiert

Bitte helft mir, is verdammt wichtig

Danke schonmal!
mfg
-
Edit:
Im Code soll//Versuch 2: Bild aus .bmp laden und via DrawState in CopyDC kopiereneigentlich
//Versuch 2: Bild aus .bmp laden, an ein neues DC "Selecten", BitBlt zum kopieren nutzenheißen