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 aus 😞

    Gruß und Dank im Voraus,
    Khadgar


Anmelden zum Antworten