Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Probleme mit CreateCompatibleDC und DeleteDC (https://www.delphipraxis.net/31556-probleme-mit-createcompatibledc-und-deletedc.html)

Nonsense 11. Okt 2004 10:14


Probleme mit CreateCompatibleDC und DeleteDC
 
Hallo,

meine Frage bezieht sich auf Luckies Tutorial OffScreenBitmap realisieren ohne VCL, hat primär damit aber nichts zu tun.

Zum Überprüfen nutze ich immer MemProof (sollte bekannt sein). Jedenfalls kriege ich nach dem Beenden meines Programmes in der MemProof-Sandbox 25 mal den Fehler: 'DeleteDC(...): Falscher Parameter'.

Mal kurz zusammengefasst...
Mein WM_CREATE:
Delphi-Quellcode:
    WM_CREATE:
      begin
        [...]

        hDevCon   := GetDC(hWnd);
        hDevConMem := CreateCompatibleDC(hDevCon);

        hBmp   := CreateCompatibleBitmap(hDevCon, WND_WIDTH, WND_HEIGHT);
        hBmpOld := SelectObject(hDevConMem, hBmp);

        DeleteObject(hBmp);

        TextOut(hDevConMem, 10, 10, 'Hello World', 11);

        // Wäre wohl "richtig":
        // SelectObject(hDevConMem, hBmpOld);
        // DeleteDC(hDevConMem);

        ReleaseDC(hWnd, hDevCon);

        Result := 0;
      end;
Mein WM_DESTROY:
Delphi-Quellcode:
    WM_DESTROY:
      begin
        SelectObject(hDevConMem, hBmpOld);
        DeleteDC(hDevConMem);

        [...]
      end;
Problem ist jetzt, dass ich hDevConMem schon im WM_CREATE wieder löschen müsste (dann würde ich auch keine Fehler bekommen). Habe ich aber nichts von, da ich das DC im WM_PAINT nicht mehr auf das Fenster-DC kopieren könnte, was konkret heißt, mein "Hello World" wird nicht dargestellt.

Nun wollte ich fragen, ob es da eine andere Lösung gibt? D.h.: wo müsste ich mein "CreateCompatibleDC" und "DeleteDC" platzieren, dass ich
a.) im WM_PAINT darauf zugreifen kann
b.) es wieder freigeben kann, ohne dass ich Fehler von der gdi32.dll gekommen.

MfG Philipp

Luckie 11. Okt 2004 10:16

Re: Probleme mit CreateCompatibleDC und DeleteDC
 
Warum machst du das eigenbtlich in WM_CREATE? Mach es doch gleich in WM_PAINT.

Nonsense 11. Okt 2004 10:19

Re: Probleme mit CreateCompatibleDC und DeleteDC
 
Zitat:

Zitat von Luckie
Warum machst du das eigenbtlich in WM_CREATE? Mach es doch gleich in WM_PAINT.

Reicht es nicht, wenn der Aufruf nur 1x kommt? Dachte da jetzt an die Performance. Aber ich teste es mal aus.

E: Haut soweit hin. Hatte mich nur gewundert, ob es wirklich nötig ist das Ganze im WM_PAINT immer wieder neu zu erstellen/löschen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz