stell mich bei hbitmap etwas doof an.
-
hallo,
ich habe in HBITMAP hScheme mit LoadImage ein bmp geladen.nun möchte ich aus den einzelbildchen, die in hScheme sind, ein kleines gesamtbild erstellen, aber nicht darstellen.
in meine klasse habe ich daher ein HBITMAP hHoover angelegt.
nun wollte ich folgendermassen vorgehen:
HDC hdcHoover,hdcScheme;
hdcScheme = CreateCompatibleDC(NULL);
SelectObject(hdcScheme,hScheme);hHoover = CreateBitmap(BWidth,BHeight,1,24,NULL);
hdcHoover = CreateCompatibleDC(NULL);
SelectObject(hdcHoover,hHoover);BitBlt(hdcHoover,0,0,10,10,hdcScheme,0,0,SRCCOPY);
was natürlich voll in die hose geht....
was mache ich falsch ? (bitte nu nich zur sau machen *fg*)
-
Sehe so auf Anhieb keinen Fehler.
Prüf mal die Rückgabewerte der Funktionen und beschreib mal was passiert und was du eigentlich erwartest, was der Code tun soll.SelectObject() liefert übrigens immer das ürsprünglich rein-selektierte Objekt gleichen Typs zurück!
d.h. bei SelectObject(hdcScheme,hScheme); würde es eine HBITMAP zurückliefern!
(Wo kommt die HBITMAP her ? - Die hat CreateCompatibleDC() automatisch erzeugt und hinein-selektiert, sie ist 1x1 Pixel groß und schwarz-weiss. Und sollte vor DeleteDC() auch wieder zurück-hineinselektiert werden!)
-
also das hScheme ist zur zeit noch eine globale variable, die soll aber noch in eine andere (verwaltende) klasse verschoben werden. das bitmap wird beim erstellen des fensters geladen.
hHoover ist bestandteil der klasse, die auch das bild zusammensetzen soll.
gezeichnet wird es zur zeit aber nicht innerhalb der klasse, sondern im WM_PAINT des Fensters.der fehler:
wenn ich also auf mein hHoover zugreife, blittet er einfach den inhalt des hScheme bildes. obwohl ich eindeutig hHoover angegeben habe.
was der schnipsel von oben machen soll:
er soll einen teil von hScheme in hHoover kopieren, damit ich es dort weiterbearbeiten kann.
-
zeige mal bitte deine WM_PAINT inhalt und die grösse deiner BWidth,BHeight und die von LoadImage
-
also
BWidth,BHeight werden bei create festgelegt und betragen 70*30. das soll die grösse sein, die hHoover haben soll. hScheme hat irgendetwas mit 1024*768.WM_PAINT:
HDC hdc;
HDC Hdcmem;RECT rect;
PAINTSTRUCT ps;
hdc = BeginPaint(hwndPM,&ps);
Hdcmem = CreateCompatibleDC(hdc);
SelectObject(Hdcmem,hScheme);
bool tab = true; //TEST
int starttop = 0;//HIER WIRD ETWAS ALTER KRAM GEBLITTET VON HScheme//////////////////////
if (tab == true)
{
starttop = 20;
BitBlt(hdc,0,0,10,10,Hdcmem,0,0,SRCCOPY);
StretchBlt(hdc,0,10,10,starttop-10,Hdcmem,0,10,10,10,SRCCOPY);
BitBlt(hdc,rect.right-10,0,10,10,Hdcmem,50,0,SRCCOPY);
StretchBlt(hdc,rect.right-10,10,10,starttop-10,Hdcmem,50,10,10,10,SRCCOPY);
StretchBlt(hdc,10,0,rect.right-20,10,Hdcmem,10,0,40,10,SRCCOPY);
StretchBlt(hdc,10,10,rect.right-20,starttop-10,Hdcmem,10,10,40,10,SRCCOPY); //center
}
BitBlt(hdc,0,starttop,10,10,Hdcmem,0,20,SRCCOPY);
BitBlt(hdc,0,rect.bottom-10,10,10,Hdcmem,0,40,SRCCOPY);
BitBlt(hdc,rect.right-10,starttop,10,10,Hdcmem,50,20,SRCCOPY);
BitBlt(hdc,rect.right-10,rect.bottom-10,10,10,Hdcmem,50,40,SRCCOPY);
StretchBlt(hdc,0,starttop+10,10,rect.bottom-20-starttop,Hdcmem,0,30,10,10,SRCCOPY);
StretchBlt(hdc,rect.right-10,starttop+10,10,rect.bottom-20-starttop,Hdcmem,50,30,10,10,SRCCOPY);
StretchBlt(hdc,10,starttop,rect.right-20,10,Hdcmem,10,20,40,10,SRCCOPY);
StretchBlt(hdc,10,rect.bottom-10,rect.right-20,10,Hdcmem,10,40,40,10,SRCCOPY);
StretchBlt(hdc,10,starttop+10,rect.right-20,rect.bottom-20-starttop,Hdcmem,10,30,40,10,SRCCOPY);//////ALTER KRAM ENDE /////////////////////////////////////////////////
//Hier versuche ich etwas von hButton irgendwo im fenster hinzublitten, um zu
//schaun, ob das kopieren geklappt hat. leider erscheint hier immer der
//ausschnitt von hScheme und nicht von hHoover!
//es kann aber nicht hieran liegen, da ich, sobald ich ein anderes HBITMAP angebe, hier korrekt kopiert wird.SelectObject(Hdcmem,MyTestclass.hHoover);
BitBlt(hdc,0,0,70,30,Hdcmem,0,0,SRCCOPY);DeleteDC(Hdcmem);
EndPaint(hwndPM,&ps);
return (LRESULT) hBrush
-
na ja
wenn ich also auf mein hHoover zugreife, blittet er einfach den inhalt des hScheme bildes. obwohl ich eindeutig hHoover angegeben habe.
du kopierst ja auch
BitBlt(hdcHoover,0,0,10,10,hdcScheme,0,0,SRCCOPY); // und dann SelectObject(Hdcmem,MyTestclass.hHoover); BitBlt(hdc,0,0,70,30,Hdcmem,0,0,SRCCOPY);aber dennoch ziemliches kauterwelch mit BitBlt und StretchBlt
-
klar das hier ist ein komisches beispiel. es spielt aber keine rolle welchen teil ich vom scheme in hoover kopiere. er blittet IMMER scheme und immer von 0,0 ! auch wenn ich wie o.g. gezeigt, hoover angebe!
das mit dem kauderwelsch ignorier mal. das ist alles nur provisorisches experimentiere.
-
ja klar du kopierst ja alles ab der position 0,0 aber die grösse sollte zum orginal anders sein??
-
es ist hier etwas ungünstig im source dargestellt. aber es spielt keine rolle, welchen bereich ich aus hscheme in hHoover kopiere und dann ins fenster blitte. es wird immer 0,0 von hscheme geblittet. hHoover wird grundsätzlich irgnoriert, als wäre hHoover überhaupt nicht da:
beispiel:
ich kopiere den bereich 100,100 bis 170,130 von hScheme in hHoover und zwar Position 0,0, da hHoover ja auch nur 70 X30 pixel groß ist.
wenn ich dann bei paint hHoover ins fenser blitte, wird aber nicht hHoover geblittet, sondern 0,0 bis 100,30 von hScheme! er nimmt immer hscheme und nicht hHoover!
wie gesagt. hHoover scheint nicht existent zu sein...

es liegt definitiv nicht am blitten oder irgendwelchen koordinateneingaben.
ich vermute ehr, dass ich beim ewrstellen von hHoover was falsch gemacht habe.
also, wenn ihr mein problem jetzt nicht verstanden haben solltet, werde ich mal versuchen, heute abend ein miniprogramm zu schreiben, was genau das macht und onlinestellen. vieleicht seht ihr dann mein problem.
-
was passiert den in WM_PAINT bei:
PAINTSTRUCT ps; HDC hdc = BeginPaint(hwndPM,&ps); BitBlt(hdc,0,0,70,30,hdcScheme,50,50,SRCCOPY); // test EndPaint(hwndPM,&ps);