Bitmap zur Laufzeit ändern



  • Hallo,
    habe mit VS2010 ein Picture Control (IDC_STATIC_Picture_1) mit zugehörigem Picture (IDB_BITMAP_min) = mini.bmp positioniert.
    Dies läuft und Picture ist sichtbar. Jetzt soll ich zur Laufzeit das "IDB_BITMAP_min" mit dem "IDB_BITMAP_max" tauschen und die Größe anpassen.
    Habe dies so versucht:

    void CMainDlg::OnBnClickedButtonChangePicture()
     {
    
    	CStatic *m_pictCtrl = (CStatic*)GetDlgItem(IDC_STATIC_Picture_1);
    
    	CBitmap bitmap;
    	CRect *rect = new CRect();
    	m_pictCtrl->GetClientRect(rect);
    	bitmap.LoadBitmapA(IDB_BITMAP_max);
    	m_pictCtrl->SetBitmap(HBITMAP(bitmap));
    
    	CDC *pDC = m_pictCtrl->GetDC();
    	CDC m_DC;
    
    	m_DC.CreateCompatibleDC(pDC);
    	m_DC.SelectObject(&bitmap);
    
    	pDC->StretchBlt(0, 0, rect->Width(), rect->Height(), &m_DC, 0, 0, 18, 18, SRCCOPY);
    }
    

    Das Picture ist nach dieser Funktion nicht mehr sichtbar.
    Was ist falsch?



  • sati schrieb:

    Das Picture ist nach dieser Funktion nicht mehr sichtbar.
    Was ist falsch?

    das bitmap handle ist nach Verlassen der Funktion nicht mehr gültig?



  • Danke - du hast natürlich Recht.
    Jetzt ist das veränderte Picture (Bitmap) sichtbar!

    So nun muss ich aber feststellen, dass das "StretchBlt" keine Veränderung an der Größe bewirkt - die Größe bleibt unverändert.

    Was ist hier wiederum nicht ok?



  • 1. du zeichnest außerhalb der OnPaint, das ist schon mal schlecht und geht nach hinten los
    2. wenn du schon das neue Bitmap mit SetBitmap in deinem PictureCtrl setzt, warum sagst du dann nicht einfach dem Control das es sich neu darstellen soll mit Invalidate() dann sollte auch dein Bitmal neu gezeichnet werden
    3. Setzen der neuen Größe kannst du mit SetWindowPos() erledigen

    void CMainDlg::OnBnClickedButtonChangePicture()
     {
    
        CStatic *m_pictCtrl = (CStatic*)GetDlgItem(IDC_STATIC_Picture_1);
    
        CBitmap bitmap;
        bitmap.LoadBitmapA(IDB_BITMAP_max);
        m_pictCtrl->SetBitmap(HBITMAP(bitmap));
        m_pictCtrl->Invalidate();
    }
    

    Sollte den gleichen Effkt wie dein code haben, nur halt Systemkonform sein. denn mit deinem Bitblt hast du sicher nur versucht die Darstellung zu aktualisieren, aber das ist nun mal nicht der "richtige" Weg.



  • Hi,

    mit deinem Code wird das Bitmap getauscht und an der alten Position in gleicher Größe gezeichnet.
    Ich muss aber auch die Größe ändern.
    Mit StretchBlt (nicht Bitblt) versucht das Bitmap zu Strechen und so eine neue Größe zu geben.
    Mit

    CStatic *m_pictCtrl = (CStatic*)GetDlgItem(IDC_STATIC_Picture_1);
        CRect *rect = new CRect();
        m_pictCtrl->GetClientRect(rect); 
    
        CBitmap bitmap;
        bitmap.LoadBitmapA(IDB_BITMAP_max);
        m_pictCtrl->SetBitmap(HBITMAP(bitmap));
        m_pictCtrl->SetWindowPos(NULL, rect->left, rect->top, newWidth, newHeight, SWP_SHOWWINDOW );
        m_pictCtrl->Invalidate();
    

    wird zwar die Größe verändert, es geht jedoch die Position im Dialog verloren.
    Wie kann man beim Bitmap die Größe verändern und die Position behalten?



  • Hab die Lösung:

    void CMainDlg::OnBnClickedButtonChangePicture()
     {
    
        CStatic *m_pictCtrl = (CStatic*)GetDlgItem(IDC_STATIC_Picture_1);
        CBitmap bitmap;
        CRect *rect = new CRect();
    
        bitmap.LoadBitmapA(IDB_BITMAP_max);
        m_pictCtrl->SetBitmap(HBITMAP(bitmap));
        m_pictCtrl->GetWindowRect(rect);
        m_pictCtrl->SetWindowPos(NULL, rect->left, rect->top, rect->Width()*FaktorW, rect->Height()*FaktorH, SWP_SHOWWINDOW );
    }
    

    FaktorW + FaktorH sind Faktoren zum Ändern der Breite und Höhe.

    Grüße


Log in to reply