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. :)
Und das ist die übliche Methode? Vielen Dank übrigens für die schnelle Antwort :)
Wie wärs mit dem Invalidate-Event/Funktion des verwendeten Toolkits?
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
Ü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.
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.
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
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?
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,
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.
Sehr schön, auf eine solche Antwort habe ich gewartet. Gut, danke, jetzt ist mir vieles klarer geworden :)
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.
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.
>> 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
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
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.