mehrere Gerätekontexte während der gesamten Laufzeit der Anwendung



  • Hallo zusammen,

    ich möchte gern ein kleines Programm schreiben was hauptsächlich mit der WindowsGDI arbeitet. Es sollen mehrere kompatible DC's erstellt werden.
    Eine als Hauptschirm der dann auf die Form geblittet wird und ein paar andere
    die jeweils nur einen Teil auf den Haupt-DC blitten.

    Vom Aufbau her wie DirectDraw. Da ich aber kein DirectX kann, versuche ich es so und weil es grafisch nicht so aufwendig ist, sollte es schnell genug sein.

    Nun zu meiner eigentlichen Frage. Herr Petzold schreibt in seinem Buch das der DC nach jeder Verarbeitung von WM_PAINT wieder freigegeben werden muss.

    Gibt es überhaupt eine Möglichkeit drei DC'S dauerhaft in der Andwendung zu halten mit selektierten Pattern, Brushes, Pens usw,
    das diese nicht immer wieder neu erstellt werden müssen?

    Grüße, Nicky



  • Ja, das sollte kein Problem sein. Ich glaube, du kannst sogar 5 DCs haben ^^ Aber man kann das alles natürlich auch schlauer lösen.



  • Da du den Petzold erwähnt hast: Schau dir mal Sketch.exe an (Zeichnen in eine Bitmap und Blitten im WM_PAINT-Zweig.
    Du kannst dir also (vorausgesetzt, du nutzt einen C++-Compiler) eine Klasse erstellen, die einen HDC und eine Wrapperklasse um eine DIBSECTION enthält. Diese DIBSECTION ist in diesen DC selektiert.
    Anschließend können beliebige GDI-Objekte in den DC eingewählt und mit ihnen gezeichnet werden. Sind diese Vorgänge für eine "Szene" abgeschlossen, erfolgt ein InvalidateRect und wie oben geschrieben der Blit in WM_PAINT.

    Ich glaube aber nicht, dass die GDI für das was, du vorhast (kleines 2D-Spiel?) empfehlenswert ist. Schau dir doch mal SFML an!

    PS: Ohne jetzt nachgelesen zu haben: Ich denke, dass Petzold damit meint, dass man den DC, den man durch BeginPaint erhält, nicht dauerhaft speichern und außerhalb von WM_PAINT darin beliebig herumkritzeln solle.



  • Ja, das sollte kein Problem sein. Ich glaube, du kannst sogar 5 DCs haben ^^ Aber man kann das alles natürlich auch schlauer lösen.

    Hallo,

    ich dachte immer wenn man seine Frage gut beschreibt bekommt man auch gute Antworten 😕

    Kannst du mir was schlaues empfehlen?

    Nicky



  • mapper schrieb:

    Da du den Petzold erwähnt hast: Schau dir mal Sketch.exe an (Zeichnen in eine Bitmap und Blitten im WM_PAINT-Zweig.
    Du kannst dir also (vorausgesetzt, du nutzt einen C++-Compiler) eine Klasse erstellen, die einen HDC und eine Wrapperklasse um eine DIBSECTION enthält. Diese DIBSECTION ist in diesen DC selektiert.
    Anschließend können beliebige GDI-Objekte in den DC eingewählt und mit ihnen gezeichnet werden. Sind diese Vorgänge für eine "Szene" abgeschlossen, erfolgt ein InvalidateRect und wie oben geschrieben der Blit in WM_PAINT.

    Ich glaube aber nicht, dass die GDI für das was, du vorhast (kleines 2D-Spiel?) empfehlenswert ist. Schau dir doch mal SFML an!

    PS: Ohne jetzt nachgelesen zu haben: Ich denke, dass Petzold damit meint, dass man den DC, den man durch BeginPaint erhält, nicht dauerhaft speichern und außerhalb von WM_PAINT darin beliebig herumkritzeln solle.

    Hallo,

    ich suche eine Möglichkeit für C.
    Es soll eine Art Würfelspiel werden, also sehr wenig Animation. Dafür sollte die GDI doch reichen oder nicht?

    Nicky



  • Klar, dafür reicht es. Schau dir aber auf jeden Fall die double-buffering-Technik im oben erwähnten Sketch.exe an. Und auch in C kannst du objektorientiert programmieren 😉

    typedef struct
    {
      HDC hdc_;
      HBITMAP bitmap_;
    } MyBufferedImage;
    
    void Init(MyBufferedImage* pImg, const RECT* pClient); // Initialisierungen vornehmen
    void OnSize(MyBufferedImage* pImg, const RECT* pClient); // falls client größer als Bitmapmaße: Bitmap vergrößern
    void OnPaint(HDC hdc, MyBufferedImage* pImg, const RECT* pClient); // in hdc blitten/"stretchen"
    

    Die Technik sollte klar sein. Ich muss aber gestehen, dass ich in nacktem C eigentlich noch nie programmiert habe 🙂



  • Da fällt mir gerade auf: Wenn du wirklich ein SetPixel/GetPixel für die Bitmap brauchst, dann schau dir auch noch Petzold's HDIB an und ersetze das HBITMAP damit.



  • supernicky schrieb:

    ich dachte immer wenn man seine Frage gut beschreibt bekommt man auch gute Antworten 😕

    Kannst du mir was schlaues empfehlen?

    Ja, das war sicher richtig gedacht, aber viel kann ich dir hier nicht empfehlen. Du beschreibst ja nicht genau, was du eigentlich machen willst. Was mapper schreibt wär z.B. eine Möglichkeit. Wenn ich dich richtig verstanden habe, brauchst du doch nur eigentlich eine Bitmap, und Teile davon werden beim Zeichnen ins DC gezeichnet? Dann brauchst du ja nicht mehrere DCs speichern. In der WM_PAINT Nachricht erstellst du dir dann dein DC und zeichnest dann den entsprechenden Ausschnitt rein.



  • also kann ich mir eine Speicherbitmap erstellen und darin zeichnen über die gesamte Laufzeit... und das Blitten auf die Form packe ich dann zu WM_PAINT?

    ich versuch das mal... wenn was nicht klappt melde ich mich nochmal...

    Besten Dank

    Nicky


Anmelden zum Antworten