AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kein neuzeichnen

Ein Thema von DevilsCamp · begonnen am 5. Feb 2006 · letzter Beitrag vom 5. Feb 2006
Antwort Antwort
DevilsCamp
(Gast)

n/a Beiträge
 
#1

Kein neuzeichnen

  Alt 5. Feb 2006, 12:37
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
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Kein neuzeichnen

  Alt 5. Feb 2006, 15:35
Ruf mal MSDN-Library durchsuchenInvalidateRect auf.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: Kein neuzeichnen

  Alt 5. Feb 2006, 15:41
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?
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#4

Re: Kein neuzeichnen

  Alt 5. Feb 2006, 17:14
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>
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Kein neuzeichnen

  Alt 5. Feb 2006, 17:42

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.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#6

Re: Kein neuzeichnen

  Alt 5. Feb 2006, 20:04
Zitat von Flocke:

Haben deine Groupboxen den Stil WS_CLIPSIBLINGS?
Hat dein Hauptfenster den Stil WS_CLIPCHILDREN?
Sollte das sein oder nicht?

Immo habe beides nicht eingestellt.
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: Kein neuzeichnen

  Alt 5. Feb 2006, 22:22
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.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#8

Re: Kein neuzeichnen

  Alt 5. Feb 2006, 22:24
ICh mache jetzt ein InvalidateRect auf das Hauptfenster. Das löst auch mein Problem...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz