wxWidgets: 1-2 Fragen zu Sizern/Notebooks/GlCanvases/Größenänderungen etc.
-
Hallo,
ich bin immernoch dabei, mir ein Programm zu erstellen, um einen groben Überblick zu erhalten.. Geht auch recht gut, aber ein paar, hoffentlich nicht zu simple, Fragen haben sich nun doch angehäuft.Ich fange mal mit den ungewöhnlicheren Fragen an:
-
In den Docs zum wxNotebook steht was von OnSelChange(). Gibt's die Methode überhaupt??
-
Ich habe ein Notebook mit einem wxGLCanvas auf einer Seite (zB. Seite 2). Wenn ich mir den GLCanvas per Knopfdruck (zB. Seite 1) "herbeihacke", also ohne 'umblättern', dann bleibt bei jedem Umblättern der GLCanvas im Hintergrund (ist ja klar), aber es wird auch jedes Mal ein Paint-Event des GLCanvas ausgelöst.
Ich weiß, dass man das eigentlich so nicht macht, aber weiß trotzdem jemand, warum das Paint-Event immer kommt?? -
Was genau ist eigentlich der Unterschied zwischen wxWindow:: -IsShown() und -IsShownOnScreen()? Mir fehlt da ein praktisches Beispiel..
-
Warum wird beim Notebook ein 'PageChanged-Event' ausgelöst, wenn ich "notebook->AddPage(..., ..., true)" für die "0te" Seite wähle, aber nicht wenn ich nachträglich notebook->SetSelection(0) wähle?
Das hat mir schon einen unangenehmen Bug beschert... -
Ich wollte, dass der GLCanvas zwar seine Größe ändert, aber seine Proportionen beibehält, wenn man die Fenstergröße ändert. Und das wollte ich direkt mit zB. SetClientSize() machen. Also das SizeChange-Event im GLCanvas abfangen und dann mit SetClientSize() die Größe vorgeben. Aber wie es aussieht, löst SetClientSize() selbst ein SizeChange-Event aus.
Was kann man da machen? Gibt es ein zufällig ein stummes Gegenstück dazu?
Was mich noch wundert, ist, dass ich nicht einer Dauerschleife ende, sondern das SizeChange-Event 'nur' 2-mal gesendet wird. Das finde ich etwas kurios.. Gibt's da irgendeinen Schutzmechanismus speziell für dumme Endanwender/-programmierer, oder wie kommt's?
Und noch etwas ganz anderes (eher die dummen Fragen):
6) Ich habe einen StaticText und ein TextCtrl in einem vertikalen BoxSizer. Wie schaffe ich es, dass der staische Text sichtbar bleibt - also StaticText größer wird, wenn er wegen Verkleinerung des Hauptfensters mehrzeilig wird??- Kann man eine minimale und eine maximale Größe für Objekte im Sizer vorgeben?
Noch eine letzte Frage zu C++ (weil ich es auch anders kenne):
Kann man in Funktionen mit vorgegebenen Parametern irgendwie diejenigen, die nicht von Interesse sind überspringen, oder muss man alle vorigen mit angeben, auch wenn einen nur der letzte interessiert?? ..Und warum nicht?..
Also für fkt1(x,y,a=13,b=14) und Interesse an b nur fkt1(1,2,b=42), oder fkt1(1,2,,42) schreiben?!So, das wärs auch schon..
Ich hoffe, mir jemand zu irgendeiner Frage etwas sagen...
MfG,
Klon457
-
-
1.) Die gibts, aber das ist ein Event, das musst du senden mit GetEventHandler()->QueueEvent(). Oder verbinden, wenn du darauf reagieren möchtest.
2.) Da musst du die Entwickler fragen, warum genau. Aber wenns im Hintergrund war, dann muss/sollte es halt neu gezeichnet werden. Du kannst mit Veto() im Paint Event das ganze aber blocken, wenn nötig.
3.) Steht in der Doku: http://docs.wxwidgets.org/3.0/classwx_window.html#a95af3a39aa422580dae156ed281a7e88 IsShown() ist false wenn das Fenster minimiert ist. True wenn es nicht minimiert ist. IsShownOnScreen() heisst, es ist im Vordergrund. Sobald es in den Hintergrund geht (ohne minimiert zu werden, weil als bsp eine andere Anwendung den Fokus bekommt), wird der Rückgabewert false.
4.) Frag die Entwickler^^. Das sind interna die hier schwer beantwortet werden können.
5.) Kann ich nicht sagen.
6+7.) Ja, kannn man: http://docs.wxwidgets.org/3.0/classwx_window.html#a38b496214d728a3212afadee5ed51606 (7 löst das Problem von 6, daher..)
8.) Nein, musst alle bis zum letzten angeben in dem Fall.
Wie ich Dir bereits sagte: Lad dir mal wxFormBuilder runter und schau dir die ganzen Eigenschaften der Controls an, wenn du sie platziert hast. Das beantwortet viele Fragen.
-
Hallo Scorcher,
ich danke dir vielmals! Was würde ich nur ohne deine Expertise machen -wahrscheinlich noch mehr pfuschen..
Ich bin froh, dass ich zumindest schon teilweise bei den Fragen angekommen bin, die sich stellen, nicht weil es bei mir hapert, sondern wegen Designentscheidungen der Entwickler...1.) Müsste sich die Funktion nicht in irgendeinem Header wiederfinden lassen? Ich (bzw. Code Blocks) habe da aber nichts gefunden..
Ehrlich gesagt, kann ich mir nicht viel darunter vorstellen: Mit welchem Event hat das denn zutun?! -Eher "EVT_NOTEBOOK_PAGE_CHANGED", oder "EVT_NOTEBOOK_PAGE_CHANGING", ..?! Und wie genau Events 'gehändelt' werden, wird auch nicht beschrieben.. Das stößt mich doch gerade etwas vor den Kopf.
Mit GetEventHandler()->QueueEvent(), oder dynamischen Verbindungen habe ich noch nicht gearbeitet. Aber sehe ich das richtig, dass die Funktion nicht aufgerufen wird, sofern ich "EVT_NOTEBOOK_PAGE_CHANGED" mit eigener Funktion abfange?2.) Okay, dabei wird wohl irgendeine Eigenschaft aktiviert, die, solange aktiv, darauf das Paint-Event auslöst..
3.)Tja, das dachte ich auch.. Hat aber offenbar nichts mit 'minimiert', 'maximiert', oder `verdeckt` zutun. Ich habe den GLCanvas als eigene Notebook-Seite realisiert. Und da verhalten sich IsShown() und IsShownOnScreen() identisch. Und sind nur 'false', wenn die Seite nicht sichtbar ist, unabhängig davon, ob das Programm als ganzes sichtbar, oder maximiert ist..
Vorausgesetzt ich sehe das richtig, mal angenommen ich habe einen Button auf einem Panel, der aber von einem anderen Fenster verdeckt ist. Wie kann ich feststellen, dass der nicht sichtbar ist (obwohl der Rest des Programms sichtbar ist)?Soo, jetzt werde ich mir erstmal anschauen, wie der StaticText auf die Vorschläge reagiert, und was der wxFormBuilder so zu bieten hat..
-
1.) Definition ist in Datei: $(WXWIDGETS)/include/wx/event.h, Zeile 3383
Ansonsten siehe:
http://docs.wxwidgets.org/trunk/classwx_evt_handler.html
http://docs.wxwidgets.org/trunk/classwx_evt_handler.html#acffd03bf407a856166ea71ef0318b59a
http://docs.wxwidgets.org/trunk/classwx_evt_handler.html#a0737c6d2cbcd5ded4b1ecdd53ed0def3
Zur Frage: ja, wenn du ein event.Veto(); zur Sicherheit reinpackst. Manche Events werden nur gehandelt, wenn man keine eigene Funktion anmeldet und automatisch nicht mehr von wxWidgets gehandhabt. Manche haben aber immer noch zusätzlichen Code, auch wenn man WX sagt, man handelt es selber. Dafür gibt es Veto() und Skip(). Lektüre: http://wiki.wxwidgets.org/Events3.) Hmm, scheint derzeit wohl kaputt zu sein oder doch was anderes zu machen:
https://forums.wxwidgets.org/viewtopic.php?f=1&t=38245
Frag das mal hier: https://groups.google.com/forum/#!forum/wx-users
-
Also nochmal zu 1.)
Man kann aber nicht zufällig herausfinden, welches Verhalten von Fall zu Fall genutzt wird, oder? ..Naja, ein veto() kann ja nicht schaden..Was ich eigentlich sagen wollte:
Kann es sein, dass OnSelChange() veraltet ist?!
- Im event.h hier steht in Zeile 3383 nur "virtual void QueueEvent(wxEvent *event);"
- In den Docs zum wxNotebook wird die Funktion aber als Mitglied von wxNotebook angagaben: "void wxNotebook::OnSelChange(wxBookCtrlEvent &event)"
http://docs.wxwidgets.org/trunk/classwx_notebook.html#a24783577628b3da1537a9476629cc72b
- Und was mich tatsächlich am meisten wundert: Wenn man danach sucht, findet die Docs-intere Suche keinen Eintrag dazu...Ich habe so das Gefühl, es wurde einfach vergessen, den Eintrag komplett herauszunehmen.. Anders kann ich mir das zumindest nicht erklären.
-
Klon457 schrieb:
Was ich eigentlich sagen wollte:
Kann es sein, dass OnSelChange() veraltet ist?!
- Im event.h hier steht in Zeile 3383 nur "virtual void QueueEvent(wxEvent *event);"
- In den Docs zum wxNotebook wird die Funktion aber als Mitglied von wxNotebook angagaben: "void wxNotebook::OnSelChange(wxBookCtrlEvent &event)"
http://docs.wxwidgets.org/trunk/classwx_notebook.html#a24783577628b3da1537a9476629cc72b
- Und was mich tatsächlich am meisten wundert: Wenn man danach sucht, findet die Docs-intere Suche keinen Eintrag dazu...Ich habe so das Gefühl, es wurde einfach vergessen, den Eintrag komplett herauszunehmen.. Anders kann ich mir das zumindest nicht erklären.
Was genau ist denn das Problem? QueueEvent queued halt ein Event, wenn es sofort durch muss, benutz ProcessEvent().
-
Kein Problem! Ich frage mich nur, wo die OnSelChange-Funktion geblieben ist. Und selbst die Suchfunktion scheint das nicht zu wissen.
Ich finde es ... mysteriös.
-
nvm
-
np
-
Zu früh gefreut..
7. löst leider nicht die Probleme von 6..
Hier nochmal meine Situation in ASCII-art...
Fenster-Höhe bleibt gleich, wxStaticText und wxTextCtrl im vertikalen wxBoxSizer.Soll_1) Breites Fenster (init): __________________________________ | Ein langer Text im wxStaticText | |----------------------------------| | | | | | --wxTextCtrl-Bereich--- | | | |__________________________________| Soll_2: Schmales Fenster (user): __________________ | Ein langer Text | | im wxStaticText | |------------------| | | |wxTextCtrl-Bereich| | | |__________________| Ist (soll aber nicht): Abgeschnittener wxStaticText: __________________ | Ein langer Text | |------------------| | | | | |wxTextCtrl-Bereich| | | |__________________|
Ich kann mir nicht vorstellen, dass das nur über Umwege zu machen ist. Das würde allem, was ich von wxWidgets kenne widersprechen..
Ich hoffe aber, dass mehrere Wege zum Ziel führen. Also wer kenn den einen oder anderen - oder mehrere?
-
Ruf mal Layout() bzw Fit() auf, nachdem du den Text geändert hast. Das sollte das eigentlich lösen. Ich hab auch so meine Probleme mit wxSizer um ehrlich zu sein :D. Aber eigentlich konnte ich sie immer lösen.
http://docs.wxwidgets.org/trunk/overview_sizer.html
http://docs.wxwidgets.org/trunk/overview_windowsizing.html
-
Wow, du bist ja nicht nur 'wxKompetent', sondern auch noch schnell wie der Blitz.
Mit Layout() und Fit() habe ich's auch schon probiert - ohne Erfolg. Ich habe das allerdings noch nicht ganz überblickt: Die Funktionen gibt es ja einmal im Sizer und im Window.. ..Wo da der Unterschied liegt!?
Das schöne (bis jetzt), ist ja gerade, dass der Text nicht manuell geändert wird/ werden muss. Das Umsortieren in neue Zeilen geht ja schon automatisch, wenn man das Fenster verkleinert. Es sieht aber nicht so aus, als würde auch die wxStaticText-Größe automatisch aktualisiert..
-
Du musst das Fit() auf dem Eltern Element des wxStaticText aufrufen.
Minmales Beispiel das ich grade getestet habe:#include <wx/wx.h> class MainWindow : public wxFrame { wxBoxSizer* m_boxSizer; wxStaticText* m_text; wxButton* m_button; DECLARE_EVENT_TABLE(); public: MainWindow() : wxFrame(NULL, -1, "Test") { m_boxSizer = new wxBoxSizer(wxVERTICAL); m_text = new wxStaticText(this, wxID_ANY, "TEST LABEL"); m_button = new wxButton(this, wxID_ANY, "Test"); wxSizerFlags staticFlags; staticFlags.Border(wxALL, 10); m_boxSizer->Add(m_text, staticFlags); m_boxSizer->Add(m_button); SetSizerAndFit(m_boxSizer); } void OnButton(wxCommandEvent&) { m_text->SetLabel("really long text to test something with wxwidgets that probably gonna brake it and no idea how to solve it"); Fit(); } virtual ~MainWindow() {} }; BEGIN_EVENT_TABLE(MainWindow, wxFrame) EVT_BUTTON(wxID_ANY, MainWindow::OnButton) END_EVENT_TABLE() class Application : public wxApp { public: virtual bool OnInit() { MainWindow* f = new MainWindow(); SetTopWindow(f); f->CenterOnScreen(); f->Show(); return true; } }; IMPLEMENT_APP(Application);
edit: A bissl verschönert mit ner Border
-
Besser spät als nie... Mein treuer alter PC ist letztens geschmolzen und irgendwie bin ich hierdrüber hinweg gekommen.
Also kurzer Nachtrag: Mit Wrap() und Layout() scheint es zu gehen.. Fit() ändert mir ungewollte die Größen.
Ist aber nicht so, als hätte ich keine neuen Probleme (->neuer Beitrag).