Forum: PC-Programmierung Windows Bildschirm "löschen"


von Joshua H. (joshih13)


Lesenswert?

Guten Tag,
ich weiß, viele werden mich vermutlich für diese einfache Frage hassen, 
aber bisher bin ich noch nicht wirklich fündig geworden. Nun also zur 
Frage: Wie komme ich in Windows (C++) "auf die nächste Ebene"? Das 
heißt, ich klicke auf einen Button und das Fenster soll komplett neu 
gezeichnet werden, diesmal jedoch mit einem anderen Inhalt. Ich habe das 
ganze schon versucht, indem ich if-Verzweigungen benutzt habe, um 
praktisch dem Programm beim neu zeichnen zu befehlen, dass der alte 
Inhalt nicht neu gezeichnet wird, sondern der neue. Hat jedoch nicht 
funktioniert, der alte Inhalt war nach wie vor da und der neue nur 
darüber. In der Konsolenanwendung gab es ja den netten Befehl 
system("cls"), womit man das Fenster einmal komplett löschen und wieder 
neu beschreiben konnte. Wie macht man das üblicherweise in Windows? Oder 
muss ich ein komplett neues Fenster zeichnen? Und wenn ja, was für eins? 
Ein komplett neues Parent Window und das alte schließen oder den Inhalt 
vom Parent Window mit einem Child Window überdecken? Das muss doch auch 
einfacher gehen... Oder? Vielen Dank schonmal im Voraus und 
entschuldigung, dass ich mit solchen Fragen das Forum "zuspame", aber 
ich bin nach wochenlanger Suche einfach zu keinem Ergebnis gekommen. Ich 
würde mich dennoch über freundliche Antworten freuen. :)

von Test (Gast)


Lesenswert?

Ein Rechteck drüberzeichnen..

von Joshua H. (joshih13)


Lesenswert?

Und das ist die übliche Methode? Vielen Dank übrigens für die schnelle 
Antwort :)

von Dr. Sommer (Gast)


Lesenswert?

Wie wärs mit dem Invalidate-Event/Funktion des verwendeten Toolkits?

von Georg (Gast)


Lesenswert?

Joshua H. schrieb:
> Und das ist die übliche Methode?

Natürlich nicht. Da liegt ein grundsätzliches Missverständnis vor. Ein 
Dialogfenster z.B. besteht aus vielen Fenstern, jede Listbox, jeder Text 
und jeder Button ist eines, und die gehören alle Windows, d.h. da gibt 
es für den User garnichts zu zeichnen. Du kannst mit einer Message den 
Text eines Buttons ändern, dann zeichnet ihn Windows neu.

Anders ist das bei einem (Unter-)Fenster mit Grafik. Das wird von deinem 
Programm neu gezeichnet, aber nicht dann, wenn du meinst, sondern wenn 
Windows das verlangt. Du kannst das aber erzwingen mit InvalidateRect, 
dann sorgt Windows dafür, dass das für ungültig erklärte Rechteck bei 
nächster Gelegenheit neu gezeichnet wird.

Irgendwo auf dem Bildschirm rumzusudeln ist nicht windowskonform, auch 
wenn es Funktionen dafür gibt. Sonst würde die Kooperation verschiedener 
Programme nie funktionieren.

Georg

von bluppdidupp (Gast)


Lesenswert?

Üblicherweise zeichnet man nur in WM_PAINT.
WM_PAINT wird durch Windows ausgelöst, wenn es das für nötig hält.
WM_PAINT kann durch InvalidateRect() (ggf. direkt gefolgt von 
UpdateWindow()) auch von Hand ausgelöst werden.
Der "Fensterhintergrund" wird ggf. in WM_ERASEBKGND gezeichnet - 
standardmässig wird die Fläche mit dem in der WNDCLASS-Struktur 
angegebenen Brush gefüllt.

von begrifflichkeiten (Gast)


Lesenswert?

Georg schrieb:
> Ein Dialogfenster z.B. besteht aus vielen Fenstern, jede Listbox,
> jeder Text und jeder Button ist eines

Nein, das sind keine Fenster, sondern (im MS-Sprech) Controls.

> Anders ist das bei einem (Unter-)Fenster mit Grafik.

Und hier meinst du wahrscheinlich einen Canvas.

Wichtig wäre zu wissen, was der TE eigentlich konkret machen will.
Insbesondere auch, ob es um Controls oder doch einen Canvas geht.
"Ich möchte das Fenster löschen" ist nämlich keine Problembeschreibung,
sondern vielmehr schon der "Lösungsansatz" - möglicherweise aber der
komplett falsche.

von Georg (Gast)


Lesenswert?

begrifflichkeiten schrieb:
> Nein, das sind keine Fenster

MS:

"A control is a child window that an application uses in conjunction 
with another window to enable user interaction. "

Hattu was verwexelt.

Georg

von Joshua H. (joshih13)


Lesenswert?

Tja ich möchte also im Prinzip "auf die nächste Ebene". Das heißt also 
zum Beispiel wie bei einem Installationsassistenten durch ein Event 
(Klick auf einen Button zB Weiter) auf die nächste "Seite". Das heißt 
also, dass ich alle bis dahin existierende Buttons, Texte usw. löschen 
möchte und das leere Fenster dann mit neuem Inhalt füllen. Ich hatte mir 
das so vor gestellt, das WM_PAINT mit einer if-Verzweigung die jeweils 
aktuellen Child Windows, also hauptsächlich Buttons zugewiesen bekommt. 
Klappt auch, nur die alten sind natürlich noch da. Deshalb suche ich 
nach einer Möglichkeit, das Parent Window komplett von Childs zu 
"bereinigen" und durch die if gesteuerte WM_PAINT function die 
entsprechenden neuen zu zeichnen. Deshalb ist das Teilchen, was mir hier 
noch fehlt der Befehl, alle Childs zu löschen. Da ich jedoch nicht weiß, 
ob Windows dies standartmäßig kann und ob es überhaupt so vorgesehen 
ist. Wie ist denn zB so ein Installationsassistent aufgebaut? Wie wird 
da auf die nächste "Seite" gewechselt?

von nicht"Gast" (Gast)


Lesenswert?

Hallo,

Ich glaube verstanden zu haben , was du machen willst.

was benutzt du denn für ein Framework? (QT, WxWidgets. wasauchimmer)

Wenn du das Wirklich mit WinApi machen willst, dann viel Spaß dabei. Ich 
kann dann nur empfehlen eines der FW von oben zu benutzen. Die machen 
dir die Sache um einiges leichter.
Mit QT z.Bsp kannst du in einem Designer die Oberfläche zusammenklicken 
und blendest immer nur das Gewünschte ein und das ungewollte aus.


Grüße,

von tastendrücker (Gast)


Lesenswert?

Tja, da liegt bei dir wohl ein Missverständnis vor. Diese "Ebenen", wie 
du sie bezeichnest, sind nichts anderes al verschiedene Fenster, die 
nacheinander angezeigt werden.

Ein Klick auf den [Weiter]-Button schließt einfach das aktuelle Fenster, 
bzw, macht es unsichtbar und zeigt das nächste. Du kannst/musst eben 
alle Fenster im Voraus entwerfen/gestallten.

von Joshua H. (joshih13)


Lesenswert?

Sehr schön, auf eine solche Antwort habe ich gewartet. Gut, danke, jetzt 
ist mir vieles klarer geworden :)

von Joshua H. (joshih13)


Lesenswert?

Benutzen tue ich DEV-C++. Mit Visual Studio bin ich nicht wirklich 
zufrieden und QT habe ich installiert, aber noch nicht reingearbeitet. 
Ich wollte alles erstmal manuell machen, um das eigentliche 
programmieren komplett zu verstehen.

von Marcus W. (marcusaw)


Lesenswert?

Also in c# Basel ich die Assistenten immer in einzelnen panels 
(panel-control), leg sie alle nebeneinander und blende immer nur den 
aktiven ein.

Bei C++ mit mfc wird es ähnlich sein.

von Stefan (Gast)


Lesenswert?

>> Nein, das sind keine Fenster, sondern (im MS-Sprech) Controls.
>> Und hier meinst du wahrscheinlich einen Canvas.
>> was benutzt du denn für ein Framework? (QT, WxWidgets. wasauchimmer)
>> Wenn du das Wirklich mit WinApi machen willst, dann viel Spaß dabei
>> Benutzen tue ich DEV-C++.

Dein Stichwort könnte PropertySheet sein.

Und ja man kann auch Anwendungen erstellen die keine GB RAM und 
Multicores brauchen um ein zwei Werte abzufragen. Allerdings braucht man 
dazu oftmals außer der Maus auch eine Tastatur!

http://msdn.microsoft.com/en-us/library/windows/desktop/bb774538(v=vs.85).aspx

Stefan

von Georg (Gast)


Lesenswert?

Joshua H. schrieb:
> Deshalb ist das Teilchen, was mir hier
> noch fehlt der Befehl, alle Childs zu löschen.

In dem Fall ist es am besten, das ganze Window durch ein anderes zu 
ersetzen. Aber im Prinzip kannst du natürlich auch in einem bestimmten 
Fenster jedes beliebige Child Window, also z.B. einen Button, sichtbar 
oder unsichtbar machen, am primitivsten mit ShowWindow und dem 
Fenster-Handle. In den meisten Frameworks ist es noch viel einfacher, da 
haben solche Objekte eine Eigenschaft Visible, die man true oder false 
setzen kann.

Das ist aber nur für einfache Änderungen sinnvoll, denn man muss in der 
IDE alle Controls zeichnen und dann zur Laufzeit die gewünschten 
sichtbar machen, das wird schnell unübersichtlich. Allerdings musst du 
ja nicht 2 Buttons übereinander zeichnen, du kannst auch einfach dem 
Button einen anderen Text verpassen.

Georg

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

In "meiner" Lieblings-IDE (RealBasic f. Mac und Win) gibts ein Element 
mit dem Namen "Tabpanel", das kann man mit den berühmten 
Register-Reitern anzeigen aber auch ohne.

Wenn ohne, kann man über die Eigenschaft "panelindex" quasi zwischen den 
einzelnen Oberflächen blättern. Sowas in eine Dialogbox verfrachtet, 
macht genau, was der TE will ...

Da dies ein Standardcontrol des Betriebssystems ist, gibts das mit 
Sicherheit auch in anderen Programmiersprachen, heisst nur evtl. anders.

: Bearbeitet durch User
von Rolf Magnus (Gast)


Lesenswert?

nicht"Gast" schrieb:
> Mit QT z.Bsp kannst du in einem Designer die Oberfläche zusammenklicken
> und blendest immer nur das Gewünschte ein und das ungewollte aus.

Das wäre mir aber auch zu mühselig, und es läßt sich nicht mit Layouts 
kombinieren.
Deshalb würde ich das eher mit einem QStackedWidget machen. Das hat 
genau die Funktion, mehrere "Seiten" anzubieten, die man jeweils mit 
Widgets füllen kann und zwischen denen dann zur Laufzeit quasi 
umgeblättert werden kann.

von nicht"Gast" (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Das wäre mir aber auch zu mühselig, und es läßt sich nicht mit Layouts
> kombinieren.
> Deshalb würde ich das eher mit einem QStackedWidget machen. Das hat
> genau die Funktion, mehrere "Seiten" anzubieten, die man jeweils mit
> Widgets füllen kann und zwischen denen dann zur Laufzeit quasi
> umgeblättert werden kann.

So in der Art hatte ich das auch im Sinn. Das hat es nur nicht bis zur 
Tastatur geschafft ;)

Denn Blödsinn Mut einzelnen Elementen ein und aus blenden hatte ich mal 
in meinen Anfangstagen der Programmierung gemacht und das war der blanke 
Horror
Grüße

von ?!? (Gast)


Lesenswert?

nicht"Gast" schrieb:
> Denn Blödsinn Mut einzelnen Elementen ein und aus blenden hatte ich mal
> in meinen Anfangstagen der Programmierung gemacht und das war der blanke
> Horror

Ich habe zwar keine Ahnung, was Blödsinn mit Mut zu tun hat, aber wenn 
du von deinen Anfangstagen der Programmierung sprichst, kannst du sicher 
nicht nur erläutern, wie man es nicht macht, sondern auch, wie man es 
richtig macht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.