Korrektes löschen von DC, HBITMAP und *CBitmap



  • Hallo,

    hab da ein Problem, an dem ich schon längere Zeit rumhänge.

    Es geht darum Bitmaps nacheinander anzuzeigen.
    Dazu erzeuge ich aus dem imageBuffer ein Bitmap im Device Context m_dcOrig und kopiere dieses mit der neuen Größe, in der es angezeigt werden soll, in m_dcDisplay;
    Da die geladenen Bitmaps nicht gleich groß sind, brauche ich jedesmal ein neues CBitmap-Object. Wie und wann kann ich m_hBmpToDelete löschen damit ich:
    - kein MemLeak bekomme?
    - ich keinerlei asserts in den handles versaue und mir das Programm beim beenden nicht noch abschmiert?

    Mit anderen Worten: Wie lösche ich hier richtig?
    Edit: und wie lösche ich am Ende alle Objekte?

    Thx für eure Hilfe!

    loop
      // erzeuge neues Array mit Bitmap mit ColorBits/8*width*height Bytes Länge
      unsigned short *imageBuffer = getNextImage(); drin
      m_hBmp = Create Bitmap (width, height, 1, ColorBits, imageBuffer);
      free(imageBuffer);
    
      if (m_hBmp != NULL) {
        dipslayX, displayY =... // Größe des Zielfensters
        bmpX, bmpY = ... // Größe der Bitmap
    
        m_hBmpToDelete = (HBITMAP)SelectObject(m_dcOrig, m_hBmp);
        if (m_hBmpDisplay == NULL)
          m_hBmpDisplay = CreateCompatibleBitmap(m_dcOrig, displayX, displayY);
        m_hBmpToDelete = (HBITMAP)SelectObject(m_dcDispaly, m_hBmpDisplay);
    
        SetStretchBltMode(m_dcMemDisplay, HALFTONE);
        StretchBlt(m_dcDisplay, 0, 0, displayX, displayY,
                   m_dcOrig, 0, 0, bmpX, bmpY, SRCCOPY); 
        offsetx= m_pt.x;
        offsety=m_pt.y;    
        InvalidateRect(&rectStaticClient);
    
        m_st1.ShowWindow(true);
      }
    


  • die bitmaps sollen nicht in einem dc selected sein, wenn man sie löschen möchte
    beispiel.

    HBITMAP newbmp = CreateCompatibleBitmap(hdc, ...); // neues bmp erzeugen
    HBITMAP oldbmp = SelectObject (hdc, newbmp);  // neues bmp in dc einsetzen, altes merken
    ... 
    ... // maloperationen
    ...
    SelectObject (hdc, oldbmp); // neues bmp aus dc rausnehmen
    DeleteObject (newbmp); // jetzt kann's gelöscht werden
    


  • Ja wenns so einfach ist, dann war es ja klar, daß ich nicht draufgekommen bin.
    Zu blöd, wenn man Das CBitmap vom Handle auch noch löschen will 😇

    Viel Dank nochmal.



  • FroIng schrieb:

    Zu blöd, wenn man Das CBitmap vom Handle auch noch löschen will 😇

    wie das mit 'CBitmap' geht, weiss ich nicht. kann aber gut sein, das da automatisch 'DeleteObject' im destruktor aufgerufen wird


Log in to reply