tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von MCoder
ERLEDIGT
JA
ANTWORTEN
3
ZUGRIFFE
323
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Thomasio Thomasio ist offline Mitglied Platin
    Registriert seit
    Aug 2006
    Beiträge
    680
    Wenn ich einen HDC erstelle und da rein eine HBITMAP wähle, ohne dabei ein Fenster zu erstellen, etwa so:

    Code :
    1
    2
    3
    4
    
    HDC ScreenDC = GetDC(0);
    HDC hdc = CreateCompatibleDC(ScreenDC);
    HBITMAP MyBitmap = (HBITMAP)LoadImage(0,"MyImage.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    SelectObject(hdc,MyBitmap);

    wie lösche ich den Kram dann wieder?

    Ich weiss nur 2 Dinge:
    1) DeleteObject() funktioniert nicht, solange das Objekt in einem HDC ausgewählt ist.
    2) Wenn ich im case WM_PAINT eines Fensters sowas mache:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hWnd,&ps);
    HDC hdcMem = CreateCompatibleDC(hdc);
    HBITMAP MyBitmap = CreateCompatibleBitmap(hdc,100,20);
    HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem,MyBitmap);
     
    ...
     
    SelectObject(hdcMem,hbmOld);
    DeleteDC(hdcMem);
    DeleteObject(MyBitmap);
    EndPaint(hWnd,&ps);

    dann kann DeleteDC() offensichtlich die ausgewählte HBITMAP mit löschen, aber MyBitmap muss ich immer noch separat löschen.

    In kurz: Wie räume ich das auf, ohne Fenster, ohne WM_PAINT, und ohne Leaks?
     

  2. #2
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Hallo,

    In der MSDN ist für SelectObject folgendes zu finden:

    This function returns the previously selected object of the specified type. An application should always replace a new object with the original, default object after it has finished drawing with the new object.
    Wenn du nach Ablauf deines Programmes wieder das originale Objekt reinlädst solltest du deines löschen können.
     

  3. #3
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Zitat Zitat von Thomasio Beitrag anzeigen
    ...dann kann DeleteDC() offensichtlich die ausgewählte HBITMAP mit löschen, aber MyBitmap muss ich immer noch separat löschen.
    Nicht ganz. Mit DeleteDC() wird das Objekt gelöscht, dessen Handle zum Kontext gespeichert wurde. Mit SelectObject() überschreibst du das Default-Handle zum Default-Objekt mit dem deines eigenen Objektes. Das Default-Handle bekommst du ja als Rückgabewert der Funktion. Wenn du nun DeleteDC() aufrufst, ohne das Default-Handle wieder einzutragen (mit SelectObject) , wird zwar dein eigenes Objekt gelöscht, aber nicht das Default-Objekt. Damit hast du ein Speicherloch.

    Ansonsten gilt: Alle GDI-Objekte, die mit Create,,,() erzeugt werden müssen mit der korresepondierenden Delete...()-Funktion wieder gelöscht werden.

    In deinen Code habe ich übrigens keinen Fehler erkennen können - das Aufräumen machst du richtig.

    Gruß
    MCoder
    Thomasio bedankt sich. 
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  4. #4
    Thomasio Thomasio ist offline Mitglied Platin
    Registriert seit
    Aug 2006
    Beiträge
    680
    Erstmal danke für die Antworten, das leuchtet mir soweit alles ein, nur eine Frage bleibt da offen.

    Wo ist mein Default Handle in

    Code :
    1
    2
    3
    4
    
    HDC ScreenDC = GetDC(0);
    HDC hdc = CreateCompatibleDC(ScreenDC);
    HBITMAP MyBitmap = (HBITMAP)LoadImage(0,"MyImage.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    SelectObject(hdc,MyBitmap);

    bzw. wie schaut die Syntax aus mit der ich das wieder auswähle und lösche?


    Edit: Ich nehme die Frage zurück, hab mich nur mal wieder zu blöd angestellt, das geht natürlich genauso wie im WM_PAINT.

    Vielen Dank für eure Hilfe.
    Geändert von Thomasio (01.08.11 um 20:29 Uhr)
     

Ähnliche Themen

  1. Gerätekontext (SelectObject und Selectstockobject)
    Von LukeS im Forum VisualStudio & MFC
    Antworten: 4
    Letzter Beitrag: 23.03.06, 23:06