GDI+ DrawImage() Double Buffering?



  • Hallo,

    ich beschäftige mich gerade mit GDI+

    Ich hab folgenden Code verbrochen:

    BOOL CFotovermessungDlg::ImgShow()
    {
    	CDC* dc = this->m_statFRM.GetDC();
    	Gdiplus::Graphics graphics(dc->m_hDC);
    //	graphics.Clear(Gdiplus::Color::Gray);
    	graphics.DrawImage(this->m_bmpBitmap,
    		this->m_ptOrigin.x, this->m_ptOrigin.y,
    		(int) (this->m_bmpBitmap->GetWidth() * this->m_fScaleFactor),
    		(int) (this->m_bmpBitmap->GetHeight() * this->m_fScaleFactor));
    
    	return 0;
    }
    

    m_bmpBitmap füttere ich in einer anderen Methode so:

    this->m_bmpBitmap = new Gdiplus::Bitmap(this->m_strBMPFileName.AllocSysString());
    

    Das ganze erzeugt dann beim Verschieben des Bildes diesen "schönen" Effekt:
    http://yfrog.com/5hfotovermessungp

    Wenn ich die auskommentierte Zeile mitkompiliere, dann ist der Effekt zwar weg, aber es flackert tierisch. Ist hier Double Buffering die Lösung? Weil das bekomme ich mit DrawImage nicht hin, ohne GDI+ ist mir das schon gelungen.

    Hier mein Versuch, bei dem allerdings gar nichts mehr angeziegt wird:

    BOOL CFotovermessungDlg::ImgShow()
    {
    	CDC* dc = this->m_statFRM.GetDC();
    	CDC dcMem;
    	dcMem.CreateCompatibleDC(dc);
    	Gdiplus::Graphics graphics(dcMem.m_hDC);
    	graphics.Clear(Gdiplus::Color::Gray);
    	graphics.DrawImage(this->m_bmpBitmap,
    		this->m_ptOrigin.x, this->m_ptOrigin.y,
    		(int) (this->m_bmpBitmap->GetWidth() * this->m_fScaleFactor),
    		(int) (this->m_bmpBitmap->GetHeight() * this->m_fScaleFactor));
    
    	dc->BitBlt(0,0,500,500,&dcMem,0,0,SRCCOPY);
    
    	return 0;
    }
    

    Hat hier jemand einen Tipp für mich? Auch sonstige Kritik an dem Code ist erwünscht, da ich irgendwann auch mal vernünftigen Code produzieren will 😉

    Gruß


  • Mod

    Nimm erstmal eine funktionierende Klasse für das duble-buffering wie CMemDC
    http://www.codeproject.com/KB/GDI/flickerfree.aspx



  • Danke für die fixe Antwort. Von der Klasse habe ich schon viel gelesen, aber ich kriege das jetzt nicht adhoc implementiert, da ich eine Dialog-Anwendung schreibe.

    Ich habe die Deklaration von

    CDC* dc = this->m_statFRM.GetDC();
    

    in

    CMemDC dc (this->m_statFRM.GetDC());
    

    geändert.

    Er zeichnet mir dann auch das Bild und der Effekt ist auch weg, aber dafür zeichnet er jetzt nich mehr nur in dem Rahmen CStatic m_statFRM, sondern im gesamten Dialogfenster und der Hintergrund wird dann weiß.



  • OK, wenn ich dem Konstruktor von CMemDC noch das CRect von dem Rahmen mitgebe, dann funktioniert es erstmal so wie ich das gerne hätte, nur dass der Hintergrund weiß wird stört mich ein wenig. Vielen Dank! 👍

    Kann mir noch jemand erklären, warum mein Double Buffer-Ansatz nicht funktioniert hat?

    Gruß


  • Mod

    wchristian schrieb:

    Kann mir noch jemand erklären, warum mein Double Buffer-Ansatz nicht funktioniert hat?

    Du hast keine Bitmap erzeugt in dem Compatible DC. Bzw. die Bitmap die miterzeugt wird hat genau 1 Pixel Größe.

    Vermutlich warst Du etwas unachtsam und hast nicht gemerkt, das ein Pixel korrekt gezeichnet wurde 🕶


Anmelden zum Antworten