wxFormbuilder Tutorial als pdf-Datei?



  • Hallo zusammen,

    hat vielleicht jemand ein wxFormbuilder Tutorial als pdf-Datei?

    Der Link: "http://wiki.wxformbuilder.org/Tutorials/UsingWxFormBuilder" funktioniert nicht. Error 404...

    Mal blöd gefragt:

    Warum funktioniert wxFormbuilder nicht wie ein GUI-Builder den man aus anderen IDE's kennt? Z.B. C++ Builder, Delphi, VBA, Lazarus usw...

    Man platziert seine Buttons, Labels, TextBoxen und gibt über den Objektinspektor Position und Größe usw. vor. Mit diesem Sizer-Gewurschtel komme ich nicht wirklich zurecht. Oder funktioniert das mit Sizern besser als "konventionell", sofern man den Bogen mal raus hat?
    Deshalb wollte ich mal in ein Tutorial reingucken...

    Weshalb gibt es für C++ kein OpenSource-Projekt zur GUI-Entwicklung ähnlich
    Lazarus für FreePascal? Ich glaube keiner der Pascal-Szene nutzt wxPascal.

    Gruß

    zarathus



  • Ja der wxFormbuilder kann nur mit Sizer arbeiten, es gibt aber auch Editoren die eine freie Platzierung ermöglichen, aber die waren nach meinem Kenntnisstand (2009) alle nicht so gut wie wxFormbuilder.

    Aber das mit den Sizern ist schon eine gute Sache und man sollte sie nutzen.
    Ich hatte auch erst Probleme damit, man muss sich halt reinarbeiten und viel probieren um die Sache zu verstehen.

    OpenSource-Projekte zur GUI-Entwicklung gibts einige (also IDE mit GUI-Editor):
    Ultimate++, Anjuta, ...

    Aber im Zusammenhang mit wxWidgets fand ich es damals auch "blöd", für GUI und Code zwei getrennte Programme zu nutzen.

    Ich arbeite heute mit Qt und dem Qt-Creator (SDK nehmen), ist genau das richtige für mich.



  • Danke für den Tipp mit Ultimate++

    Das habe ich mir mal angesehen. Werde ich heute Abend mal ausprobieren.
    Qt ist vermutlich am elegantesten. Mir gefällt aber die Lizensierung nicht.

    Ist eigentlich bei Ultimate++ oder auch Qt so etwas wie "ZedGraph" dabei?
    Sprich die Möglichkeit x-y-Diagramme usw. zu Plotten. Evtl. mit Zoom-Funktion...

    MfG

    zarathus



  • Wenn die GUI API einfach ist, braucht man keinen visuellen Designer. Finde ich zumindest so. Wir machen hier auf Arbeit mit Java Swing alles ohne visuellen Designer. Das wird alles mit Java Code "designed". Wenn man sowas wir JGoodies hat und man sich damit etwas auseinander setzt, geht das auch super.

    In C++ sind leider die meisten GUI APIs nicht so komfortabel. In Algierlib versuche ich die API so aufzubauen, das man z.B. sowas mit C++ Code machen kann:

    http://algierlib.tigris.org/wiki/HowTo/LayoutSendMessage

    Man muß natürlich die Doku zu der API dazu lesen, aber in ein paar Minuten hat man es verstanden. Und Spicken ist ja erlaubt.





  • wxFormBuilder nutze ich nur mit XRC Dateien.
    Das ist ein großartiges Tool.

    Hintergrund:
    wxRC Dateien sind XML Resourcen-Dateien. Mit diesen kann man Elemente zur Laufzeit laden, ausserdem werden vorhandene Icons etc mit in die Datei gepackt.
    Im Prinzip ist es eine zip Datei, welche das xml und die Icons enthält. So spart man sich lästiges management der Dateien als bsp im Setup Script später.

    Vorgehensweise:
    1.) In der wxWidgets installation nach Utils/wxrc/. Dieses Projekt kompilieren. Am besten im Release Mode.

    2.) Das kompilat von Schritt 1 im Path platzieren mit den evtl benötigten .dll. Ich hab für sowas einen eigenen Ordner der im Path liegt und hau das nicht nach Windows rein.

    Jetzt kannst Du mit wxFormBuilder loslegen.
    Wichtig zu wisen:
    Jeder Anfang braucht eine Form, das ist der letzte Reiter oben im Menü. Will man wie ich den Mainframe selbst managen und nur einzelne Panels etc laden, empfiehlt sich auch ein Panel als Parent zu nehmen.
    Danach brauchst du mindestens einen Sizer. Du kannst Sizer auch verschachteln.
    Ich hoffe dass dieser Screen meines aktuellen Projektes dir hilft eine Idee davon zu bekommen:
    http://h-4.abload.de/img/wxformfrk0.png

    Menüs und Toolbars brauchen ebenfalls eine "Form", allerdings heissen die dann auch wxMenubar und wxToolbar. Gibts aber auch unter einem anderen Reiter, das kann missverständlich sein. Eventuell verwendete Icons bitte in einen Ordner relativ zur Projektdatei legen, damit wxrc die besser findet.
    Die Elemente brauchen mindestens einen Namen. Auch internationalisierung geht mit wxRC. Doch dazu gleich.

    Hat man nun seine GUI zusammengeklickt, stellt man im Projekt bei Code Generation nur wxRC ein. Mit F8 kann man den Code kompilieren.
    Das erstellt die wxrc Datei. Diese kann man auch direkt verwenden, aber ich raten davon ab. Das ist nur die Hälfte der Mächtigkeit des Tools :).

    Als nächstes rufen wir den Compiler für wxRC auf:

    @echo off
    echo Regenerating Gettext and wrs File
    wxrc.exe -g -o NightShadeResources_gettext.cpp NightShadeResources.xrc 
    wxrc.exe -o NightShadeResources.xrs NightShadeResources.xrc
    move /Y NightShadeResources.xrs ..\bin\wxrc\NightShadeResources.xrs
    

    Das ist ein Live-Beispiel aus meinem Projekt. Dieses Script erstellt die xrc Datei und verschiebt sie in den Ordner wo das Programm ausgeführt wird.
    Die zweite Zeile (mit wxrc drin) erstellt die Resourcen Datei, die erste Zeile erstellt eine Datei für GNU Gettext, welches in wxWidgets enthalten ist. Diese Datei wird nicht mit kompiliert, sie heisst nur .cpp damit gettext sie auch verwendet. Sie enthält sämtliche Strings die in der Datei vorkommen.

    Wie lädt man den ganzen Schmodder jetzt?
    Sehr easy:

    // Add Image Support
    	wxInitAllImageHandlers();
    
    	// XRC and WRS Support
    	wxXmlResource::Get()->InitAllHandlers();
    	wxFileSystem::AddHandler(new wxZipFSHandler);
    	wxFileSystem::AddHandler(new wxArchiveFSHandler);
    

    Dieser Code initialisiert die XML Resourcen und fügt die entsprechenden Handler zu wxWidgets hinzu. wxZip und Archive für die zip-Datei und die Image Handler für Icons in Toolbar etc.

    Das hier lädt die Datei in der Klasse Application bevor der Mainframe erzeugt wird:

    // Load Resources
    	if ( wxXmlResource::Get()->LoadFile(wxFileName("wxrc/NightShadeResources.xrs")) == false )
    	{
    		wxMessageBox(_("Cannot load Resource File! Please reinstall the Application!"), wxMessageBoxCaptionStr, wxOK|wxICON_ERROR);
    		return false;
    	}
    

    Beachte, dass strings in _("") gesetzt wurden. Das sorgt für die nötige i18n Unterstzütung.

    Nun laden wir einfach mal das Panel aus diesem Projekt in unseren Code:

    wxPanel* panel = wxXmlResource::Get()->LoadPanel(this, "rcShaderPanel");
    

    Der erste Parameter ist das zukünftige Parent dieses Elements, das zweite der Name den wir dem Element im Formbuilder gegeben haben.

    Beachte auch, dass die XRC Elemente keine "richtigen" ID's haben, sprich kein Enum. Aber hier gibts eine bessere Variante um Events zu erstellen etc:

    BEGIN_EVENT_TABLE(Mainframe, wxFrame)
    	EVT_MENU(XRCID("rcMenuItemNewShader"), Mainframe::OnNewShader)
    	EVT_MENU(XRCID("rcMenuItemSaveShader"), Mainframe::OnSave)
    	EVT_MENU(XRCID("rcMenuItemSaveShaderAs"), Mainframe::OnSaveAs)
    	EVT_MENU(XRCID("rcMenuItemLoad"), Mainframe::OnLoad)
    END_EVENT_TABLE()
    

    Das ist eine kleine, aber schnelle Einführung in das xrc System.
    Ich finde es besser als sich Code generieren zu lassen, da es dynamisch ist und man Kleinigkeiten ändern kann ohne den ganzen Code neu generieren zu lassen.
    Hoffe es hilft.



  • Warum funktioniert wxFormbuilder nicht wie ein GUI-Builder den man aus anderen IDE's kennt? Z.B. C++ Builder, Delphi, VBA, Lazarus usw...

    Man platziert seine Buttons, Labels, TextBoxen und gibt über den Objektinspektor Position und Größe usw. vor. Mit diesem Sizer-Gewurschtel komme ich nicht wirklich zurecht. Oder funktioniert das mit Sizern besser als "konventionell", sofern man den Bogen mal raus hat?

    Das funktioniert besser, sobald du den Bogen raus hast. Weil du damit unabhängig in der Platzierung bist wenn sich die Fenstergröße ändert. Das ist dann deutlich einfacher.
    http://wiki.wxwidgets.org/WxSizer
    Eventuell hier mal noch lesen.
    Und hier:
    http://neume.sourceforge.net/sizerdemo/

    ps.: wxWidgets ist OpenSource.


Log in to reply