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 Kein neuzeichnen (https://www.delphipraxis.net/62476-kein-neuzeichnen.html)

DevilsCamp 5. Feb 2006 12:37


Kein neuzeichnen
 
Ich versuche mich gerade daran ein Programm ohne die VCL zu schreiben.

In diesem Programm erstelle ich 2 GroupBoxen als Child des Hauptfenster und eine GroupBox als Child eines der der anderen Groupboxen.

Wenn ich nun die dritte GroupBox mit Hilfe von
Delphi-Quellcode:
ShowWindow(HANDLE_DRITTER_GROUPBOX, SW_HIDE)
ausblenden will, dann bleibt die solange sichtbar, bis ich das komplette Fenster mit einem anderen Überlagere und dann wieder anzeigen lasse.

Wenn ich die dritte GroupBox aber als Child des Hauptfenster erstelle, dann wird die GroupBox sofort unsichtbar.

Was mache ich falsch?

Ich habe die Fensterprozeduren der ersten beiden GroupBoxen umgebogen, wie es in Lucky's NonVCL Tutorial beschrieben ist.

Luckie 5. Feb 2006 15:35

Re: Kein neuzeichnen
 
Ruf mal MSDN-Library durchsuchenInvalidateRect auf.

Flocke 5. Feb 2006 15:41

Re: Kein neuzeichnen
 
Normalerweise passiert das `ungültig machen´ automatisch beim Verstecken/Anzeigen eines Fensters bzw. Controls. Hast du WM_PAINT und/oder WM_ERASEBKGND in den Groupboxen überschrieben, so dass der Bereich der versteckten Groupbox darin nicht neu gezeichnet wird?

DevilsCamp 5. Feb 2006 17:14

Re: Kein neuzeichnen
 
Zitat:

Zitat von Flocke
Normalerweise passiert das `ungültig machen´ automatisch beim Verstecken/Anzeigen eines Fensters bzw. Controls. Hast du WM_PAINT und/oder WM_ERASEBKGND in den Groupboxen überschrieben, so dass der Bereich der versteckten Groupbox darin nicht neu gezeichnet wird?

Weder noch. Bisher nur WM_COMMAND. Für den Rest wird die alte Windows-Botschaften-Methode aufgerufen...


Mal Lucky's Vorschlag testen.



<edit>

Also:
InvalidateRect auf das HAUPTFenster funktioniert. Auf die GroupBox, die Parent von der dritten ist, funktioniert das nicht. Muss ich das verstehen oder nicht?

</edit>

Flocke 5. Feb 2006 17:42

Re: Kein neuzeichnen
 
:gruebel:
Haben deine Groupboxen den Stil WS_CLIPSIBLINGS?
Hat dein Hauptfenster den Stil WS_CLIPCHILDREN?

// Nachtrag

Noch was gefunden: Frame-Controls (BS_GROUPBOX, SS_...FRAME) zeichnen ihren Hintergrund *nicht* selbst, um die Hintergrundfarbe des übergeordneten Fenster zu übernehmen. Wenn du im Hauptfenster das Bit WS_CLIPCHILDREN gesetzt hat, dann bleibt dort ein Loch. Du solltest vielleicht für die Groupboxen WM_ERASEBKGND explizit abfangen und das Fenster-Rechteck löschen.

DevilsCamp 5. Feb 2006 20:04

Re: Kein neuzeichnen
 
Zitat:

Zitat von Flocke
:gruebel:
Haben deine Groupboxen den Stil WS_CLIPSIBLINGS?
Hat dein Hauptfenster den Stil WS_CLIPCHILDREN?

Sollte das sein oder nicht?

Immo habe beides nicht eingestellt.

Flocke 5. Feb 2006 22:22

Re: Kein neuzeichnen
 
Zitat aus der MSDN:

Zitat:

WS_CLIPCHILDREN Excludes the area occupied by child windows when you draw within the parent window. Used when you create the parent window.

WS_CLIPSIBLINGS Clips child windows relative to each other; that is, when a particular child window receives a paint message, the WS_CLIPSIBLINGS style clips all other overlapped child windows out of the region of the child window to be updated. (If WS_CLIPSIBLINGS is not given and child windows overlap, when you draw within the client area of a child window, it is possible to draw within the client area of a neighboring child window.) For use with the WS_CHILD style only.
Sollten also beide nicht gesetzt sein.


Im Grunde solltest du in der (von dir umgebogenen) Fensterprozedur der Groupboxen die Meldung WM_ERASEBKGND nicht an die alte Fensterprozedur weiterleiten sondern an DefWindowProc, dann sollte alles so geschehen wie es soll.

DevilsCamp 5. Feb 2006 22:24

Re: Kein neuzeichnen
 
ICh mache jetzt ein InvalidateRect auf das Hauptfenster. Das löst auch mein Problem...


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 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 by Thomas Breitkreuz