brauche hilfe bei BitBlt



  • Und zum Schluss sowohl hMemDc als auch m_Bitmap wieder freigeben (DeleteDC, DeleteObject) oder nur einmal initialisieren und dann immer wieder verwenden, solange sie gebraucht werden. Sonst gibts irgendwann keine DCs mehr und der Speicher wird voll von Bitmaps.



  • danke euch beiden!
    hab da voll nicht drauf geachtet!!
    funzt leider immernoch nicht!

    eSl@d3vil



  • [...]
     FillRect ( hMemDC, &rcHighlight, brush );
     // ist rcHighlight wirklich im Bitmap?
    [...]
     BitBlt ( hDC, rcItem.left, rcItem.top, WidthOfRect ( &rcItem ), HeightOfRect ( &rcItem ),
                     hMemDC, rcItem.left/*im Bitmap?*/, rcItem.top/*im Bitmap?*/, SRCCOPY );
    [...]
    

    Mit "im Bitmap" meine ich: ist die x/y-Koordinate wirklich positiv und kleiner als Breite/Höhe?

    Btw.: auch die Brushs musst du wieder freigeben oder eben nur einmal beim Programmstart erstellen und beim Ende wieder freigeben.



  • ich hab die werte ma überprüft:

    rcItem.left = 3
    rcItem.top = 20
    rcItem.right = 237
    rcItem.bottom = 34

    WidthOfRect = 234
    HeightOfRect = 14

    rcHighlight.left = 1
    rcHighlight.top = 20
    rcHighlight.right = 239
    rcHighlight.bottom = 34

    hab dann ma für "rcItem.left/*im Bitmap?*/" und rcItem.top/*im Bitmap?*/
    1 eingesetzt und siehe da er gibt was aus, aber alles nur schwarz!!

    muss ich den bgkmode auch jedesmal ändern?

    //eSl@d3vil



  • Wenn du dein CreateCompatibleBitmap mit WidthOfRect ( &rcItem ) und HeightOfRect ( &rcItem ) machst, dann hast du ja nachher (und das ist ja auch richtig) ein DC der so breit und hoch ist, wie dein Item. Allerdings beginnen dort dann auch die Koordinaten bei 0 und gehen bis WidthOfRect ( &rcItem ) bzw. HeightOfRect ( &rcItem ). Und bei BitBlt musst du dann wohl bei nXSrc (rcItem.left/*im Bitmap?*/) und nYSrc (rcItem.top/*im Bitmap?*/) jeweils 0 einsetzen, um den ganzen Memory-DC auf den Item-DC zu blitten 😉



  • hab ich so gemacht!
    ist trotzdem alles schwarz!
    ich kann es nicht verstehen!
    (erst alles weiß jetzt alles schwarz) 😡



  • Bin mir gerade nicht sicher, aber liefert ListView_GetItemRect ein RECT mit left und top gleich 0, oder hast du den Code bereits geändert? Und dann bitte auch die Änderungen in deinem oben geposteten Code vornehmen, damit man sieht, wie dein Code jetzt aussieht 😉



  • hab den code oben aktualisiert!
    ich glaub es liegt am createcompatiblebitmap!
    nur weiß ich net warum!
    es wird kein richtiges bitmap erstellt ( alles immer nur schwarz!!! )

    hätte noch n problem und zwar wenn ich an den spaltenheadern öfters
    rumklicke und die größe änder, dann verlier ich irgendwann den memdc
    ( also NULL ) und beim bitmap auch!
    weiß einer woran das liegt und wie man das beheben kann?

    [EDIT:]

    hab das auch ma bei nem ganz normalem weißen fenster ausprobiert und
    der gespeicherte bereich wird wieder in schwarz ausgegeben!

    WARUM SCHWARZ?????? *amverzweifelnbin*

    //eSl@d3vil



  • Ich sehe fast keine der Anmerkungen umgesetzt 😕
    - Du gibst nichts frei (DeleteObject).
    - Du arbeitest mit ListView_GetItemRect und wendest diesen direkt auf deinen memDC an. Wenn du mit memDC arbeitest musst du relative Item-Koordinaten verwenden 😉



  • die objekte werden jetzt bei WM_DESTROY freigegeben!
    und das mit dem ListView_GetItemRect benötige ich nur für den focus!
    ( das kannste auch erstma ignorieren, denn er soll erstma den text ausgeben )
    für den memdc verwende ich den rect, den mir LPDRAWITEMSTRUCT übergibt!

    das merkwürdige ist ja, wenn ich den Text und den Focus direkt in den hDC
    (lpdis->hDC) zeichne funktioniert alles, nur wenn ich erst alles in ein memdc zeichne und von da aus in den hDC blitte kommt nix bei rum!

    eSl@d3vil



  • Du erstellst doch bei jedem Ausführen des geposteten Codes neue GDI-Objekte, die müssen ALLE freigegeben werden oder alternativ erstellst du sie nur einmal beim Programmstart zb. WM_CREATE (und nicht bei jedem Neuzeichnen des Listview), dann brauchst du sie auch nur bei WM_DESTROY wieder freizugeben.

    Bei den DrawText funktionen gibst du rect als Parameter an, diese Variable wurde weiter oben mit RECT rect = rcItem; initialisiert, also sind die Koordinaten relativ zum Ursprung des Listview, damit sind sie wahrscheinlich alle, ausser der ersten, ausserhalb des Bitmap. Initialisier rect doch mal so:

    rect.left = rect.top = 0;
    rect.right = rcItem.right - rcItem.left;  //entspricht Breite des Bitmap
    rect.bottom = rcItem.bottom - rcItem.top; //entspricht Höhe des Bitmap
    

    Damit ist der Text auf jeden Fall im Bitmap.



  • thx @ daniel!

    das mit dem text hat wirklich an dem rect gelegen!
    doch das schwarz ist immer noch dagewesen, also hab ich die ganze liste mit fillrect gefüllt!
    gibts da vielleicht noch ne bessere methode? kann man da nicht irgendwie den hintergrund löschen? denn setbkcolor klappt irgendwie net!

    hab jetzt nur das problem, wenn ich zu oft am header von der liste rumziehe, dass sich dann die bitmap verabschiedet und der ganze dialog (bzw. die steuerelemnte verschwinden)
    😕

    den aktuellen "funktionierenden" quelltext poste ich noch,
    muss erstma den quelltext säubern!! 😃

    //eSl@d3vil



  • eSl@d3vil schrieb:

    doch das schwarz ist immer noch dagewesen, also hab ich die ganze liste mit fillrect gefüllt!
    gibts da vielleicht noch ne bessere methode? kann man da nicht irgendwie den hintergrund löschen? denn setbkcolor klappt irgendwie net!

    Afaik ist FillRect schon das Richtige für dich.

    eSl@d3vil schrieb:

    hab jetzt nur das problem, wenn ich zu oft am header von der liste rumziehe, dass sich dann die bitmap verabschiedet und der ganze dialog (bzw. die steuerelemnte verschwinden) 😕

    Das hört sich stark nach nicht freigegebenen GDI-Objekten an. Du kannst dir mal im Taskmanager die Spalte "GDI-Objekte" über Ansicht > Spalten auswählen einfügen. Damit solltest du das recht schnell sehen 😉



  • thx flenders!
    habs gefunden!
    lag am brush!! 😉


Anmelden zum Antworten