Bild wird "wegradiert"



  • Hey,

    erstmal herzlich willkommen 🙂 ich freue mich zu euch gefunden zu haben.
    Ich hoffe auf eine gute zusammenarbeit 😉

    Undzwar bin ich gerade dabei ein "Quiz" mithilfe der MFC zu erstellen. D.h. ich habe eine Excel-Datei mit meinen Fragen und Antworten. Diese lese ich aus der MFC aus und zeige sie dann an ...

    Und damit mein Fenster nicht so langweilig aussieht habe ich mir gedacht ich mache ein Bild in den Hintergrund.
    Diese lade ich in der Funktion OnPaint()

    void Cpre_1View::OnPaint()
    {
      CClientDC dc( this );
      BITMAP bm;
      Bild_EHG.GetObject( sizeof( bm ), &bm );
      CDC SpeicherDC;
      SpeicherDC.CreateCompatibleDC( &dc );
      SpeicherDC.SelectObject( &Bild_EHG );
      CRect Rect;
      GetClientRect( &Rect );
      dc.SetStretchBltMode( HALFTONE );
        dc.StretchBlt( 0, 0, Rect.right, Rect.bottom, &SpeicherDC,
    				0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY );
    
    }
    

    Und lade das Bild dann in OnInitialUpdate() mit:

    Bild_EHG.LoadBitmap( IDR_EHGLogo );
    

    Probleme:
    1. Beim allerersten Aufruf an einem PC zeigt es mir das Bild nicht an. Jedoch wenn ich es ein zweites mal starte erscheint es ?

    2. Wenn ich unter Win7 das Fenster über den Rand hinausbewege ist das bild weg und unter WinXP ist es sogar weg wenn ich nur mit einem anderen Fenster darüber gehe (z.b. Explorer) das kann ziemlich nervig sein und sieht auch nicht schön aus?

    Ich hoffe ihr könnt mir irgendwie helfen ?

    Es ist ein SDI.

    Mfg Naptime


  • Mod

    Du verwendest den falschen DC. Du musst CPaintDC verwenden und nicht CClientDC.

    Ich würde Dir raten noch ein paar Basics zur MFC zu lesen...



  • Hey,
    danke erstmal aber wenn ich das CClientDC durch CPaintDC ersetze dann zeigt es mir gar kein Bild mehr an?

    Ich weiß, ich bin gerade auch noch dabei am lernen:)
    Deshalb würde ich mich auch über Bücher oder sonstige Quellen zu diesem Thema freuen.


  • Mod

    Dann stimmt grundsätzlich etwas nicht mit Deinem Control.

    Ansonsten kannst Du gerne die Forumsuchfunktion nutzen und nach bereits vorgeschalgenen Tutorials und Büchern durchsuchen. 😉



  • Ich habe es jetzt relativ einfach hinbekommen und das mit dem "CClientDC",
    ich habe es nur in eine andere Funktion machen müssen undzwar in "OnDraw()" und jetzt habe ich keins der Probleme mehr:)



  • Du benutzt trotzdem noch den falschen DC, es ist so und so der PaintDC den du nutzen mußt



  • Hallo Naptime,

    Dein Bitmap hat keinen map.
    benutze lieber CDC * tmpdc = GetDC();
    CreatecompatibleBitmap (tmpdc) stat GetObject

    und nicht vergessen ReleseDC für tmpdc zu machen.



  • Sigie schrieb:

    Hallo Naptime,

    Dein Bitmap hat keinen map.

    Was willst du uns damit sagen?

    Sigie schrieb:

    benutze lieber CDC * tmpdc = GetDC();

    was soll er mit dem DC anstellen, wenn er einen kompatiblen DC zu seinem Window benötigt?

    Sigie schrieb:

    CreatecompatibleBitmap (tmpdc) stat GetObject

    Warum solle er ein neues Bitmap erstellen, wenn er nur die größe des Bitmap zum Blitten benötigt? Der Sinn geht mir dabei Verlohren, den du damit verfolgst.



  • intos als komentar

    // pDC <- z.B. Deine CClientDC
    HDC dc = pDC->m_hDC ;
    HBITMAP bm;
    RECT rect;
    GetClientRect(&rect);
    // erzeugst Du hier den Map.
    bm = CreateCompatibleBitmap(dc,rect.right,rect.bottom);
    HDC SpeicherDC;
    SpeicherDC = ::CreateCompatibleDC( dc );
    // verbindest bitmap mit DC, sonst malst Du im Luft mit unsichtbaren Farben
    HGDIOBJ obj = ::SelectObject( SpeicherDC , bm );
    // hier malst Du dein Bild oder ladest z.B. ihn über CImage classe
    #if 0
    MoveToEx(SpeicherDC,10,10,NULL);
    LineTo(SpeicherDC,20,20);
    #else
    // alternativ auf CPaintDC und kopuiere den
    pDC->MoveTo(10,10);
    pDC->LineTo(20,20);
    ::BitBlt(SpeicherDC,0,0,rect.right ,rect.bottom ,pDC->m_hDC ,0,0,SRCCOPY);
    #endif
    // wie gehabt
    ::SetStretchBltMode(dc, HALFTONE);
    ::StretchBlt( dc,rect.left,rect.top, rect.right, rect.bottom, SpeicherDC, rect.left, rect.top, rect.right, rect.bottom, SRCCOPY);

    // alte Bitmap object zurücksetzen
    ::SelectObject( SpeicherDC , obj );

    // aufräumen
    DeleteObject(bm);
    DeleteObject(SpeicherDC );



  • @Sigie

    das was du hier zeigst ist WinAPI und kein MFC, geht zwar auch mit MFC zu mischen, ist aber halt kein MFC und wie schon paar mal geschrieben in OnPaint zeichnet man nicht mit dem ClientDC



  • Dann schau mal in die klassen CDC, CPaintDC und in ClientDC rein, da findes Du eine Lösung.


Anmelden zum Antworten