Blitten mit MFC
-
Hi Leute,
da ich in Aachen momentan kein Internet habe, kann ich Euch momentan leider
nur von Zuhause nerven :(. Es geht immer noch um meinen Versuch ein MMORPG
auf die Beine zu stellen und weitestgehen läuft das alles ganz gut [wenn ich
hier einen Card-reader hätte würde ich die neueste Version online stellen,
geht aber nicht :(]Zu meinem Problem:
Ich lasse in meinem Zeichnen-Methode 420 gifs /jpegs auf die CDC cdMem zeichnen
(dcMem ist eine Membervariable der entsprechenden Klasse) und würde dann gerne
im nächsten Schritt den Inhalt der cdMem auslesen und auf das Fenster blitten.Wenn ich das ganze aber mittels CreateCombatibleBitmap machen lasse habe ich
nur ein schwarzes Rechteck der richtigen Größe auf dem Bildschirm, lasse ich
die Grafiken hingegen direkt auf CClientDc cd(this) zeichnen, werden sie auch
korrekt angezeigt.Den Code kann ich leider grad nicht nachreichen weil der dummerweise noch in
Aachen liegt und ich hier nicht auf gut Glück was tippen möchte was dann nur
für noch mehr Verwirrung sorgt. Ich werde ihn aber asap nachreichen (sollte denn irgendwann mal ein Terminal in der Bibliothek frei sein *grml*).Gruß,
Khadgar
-
Wenn man ein Bitmap von Windows erstellen lässt ist es am Anfang erstmal auf schwarz gesetzt. Hört sich also ganz so an also ob Du nicht in das Bitmap reinzeichnest, aber ohne Code kann man wirklich nicht viel dazu sagen...
-
Das stimmt soweit auch, ich lasse direkt in die dcMem reinzeichnen (genauso
wie ich es vorher in die dc(this) reinzeichen haben lasse). Erstelle dann
von dieser eine kompatibles Bitmap und lasse das dann zeichnen - Und dieses
ist dann schwarz.Ich werde den Code aber asap posten, denn ich verzweile wirklich an diesem
Problem.
-
Hast Du vielleicht irgendein CDC::SelectObject() vergessen? In dcMem zB muss ja das neue Bitmap auch selektiert sein.
Aber schick mal Code, sonst ist es nur eine Raterei.
-
da ich in Aachen momentan kein Internet habe, kann ich Euch momentan leider nur von Zuhause nerven
Hui, Glück gehabt.[Enter]
-
Tja TGGC,
die Schonfrist ist rum *gnarrharrharrwhaarrr*Da ich nun endlich das Glück habe wieder in den Genuß eines Internetzugangs zu
kommen hier als der Sourcecode:Die Funktion "ZeichneBild" zeichnet nach jeder Bewegung der Spielfigur die
einzelnen Tiles innerhalb zweier For-Schleifen neu:void CMORK_BEWEGUNGDlg::ZeichneBild(IPicture *bild, int pX, int pY, int pBreite, int pHoehe) { CRect rc; GetClientRect(&rc); OLE_XSIZE_HIMETRIC width; OLE_YSIZE_HIMETRIC height; bild->get_Width(&width); bild->get_Height(&height); int x = 0, y = 0, size_x = width*96/2540, size_y = height*96/2540; if ((size_x > 32) || (size_y > 32)) { int neueXPosition = pX-((size_x-32)/2); int neueYPosition = pY-(size_y-32); bild->Render(*dcMem, neueXPosition, neueYPosition, size_x, size_y, 0, height, width, -height, &rc); } else { bild->Render(*dcMem, pX, pY, pBreite, pHoehe, 0, height, width, -height, &rc); } }
Und die Funktion "BitBlt" sollte das ganze dann eigentlich auf den aktiven
Screen kippen:void CMORK_BEWEGUNGDlg::BltBild() { CClientDC cdc(this); cdc.BitBlt(0, 0, 100, 100, dcMem, 0, 0, SRCCOPY); // int msga = MessageBox("bit", "xx"); // // this->Invalidate(true); // CDC * pDC = GetDC(); // // CRect rc; // // GetClientRect(&rc); // CBitmap bitmap; // bitmap.CreateCompatibleBitmap(pDC, 672, 672); // CBitmap * oldBitmap = dcMem.SelectObject(&bitmap); // // CClientDC dc(this); // // dc.BitBlt(0, 0, 672, 672, &dcMem, 0, 0, SRCCOPY); // pDC->BitBlt(0, 0, 672, 672, &dcMem, 0, 0, SRCCOPY); // // CBitmap * bmp = dcMem.GetCurrentBitmap(); // // CClientDC cdc(this); // // cdc.BitBlt(0, 0, 672, 672, &dcMem, 0, 0, SRCCOPY); // // dcMem.BitBlt(0, 0, 320, 320, dc, 0, 0, SRCCOPY); // // dcMem.SelectObject(oldBitmap); // Altes Bitmap wieder selektieren // // ReleaseDC(this->GetDC()); }
Meine - wenn auch falsche - Vorstellung vom Blitten mit den MFC sah eigentlich
so aus, dass ich mir einen Gerätekontext erzeuge und dann einfach mittels
BitBlt() die Pixel aus dem Speicherkontext auf den neuen Gerätekontext zeichne.
Die Kommentare oben habe ich mal der Vollständigkeit halber belassen um zu
zeigen was ich aus Verzweifelung schon alles für einen $§"&# probiert habe.Vielleicht blickt ja einer von Euch da durch; Meine C++ Kenntnisse reichen
da leider nicht genug ausGruß und Dank im Voraus,
Khadgar