Open Source im professionellen Einsatz
Linux-Magazin 03/2004
888

Das Layoutmanagement verstehen

Bei WX-Windows ist, wie bei den meisten Widget-Bibliotheken, das Pixel-genaue Positionieren der GUI-Elemente verpönt. Für GUI-Builder wären Pixel-genaue Platzierungen zwar einfacher, auch manch Programmierer zieht diese anschauliche Variante vor. Sie führt aber zu vielen Problemen, wenn die Applikation auf mehreren Plattformen laufen soll, die Beschriftungen der Widgets mehrsprachig sind oder der Benutzer die Fontgröße ändern will.

Bei WX-Windows sind die Sizer-Klassen für das Layout verantwortlich. Sie erfordern zwar eine gewisse Einarbeitungszeit, ermöglichen aber ein sehr flexibles Layout der Applikationsoberfläche. Statt genauer Pixel-Positionen verwenden die Sizer-Klassen Layoutregeln, die der Programmierer festlegt. In Zeile 93 (Listing 2) wird ein »BoxSizer« erstellt, der ein Textfeld und einen Button erhält. Der Sizer hat ein recht einfaches Layoutkonzept, er ordnet Elemente nebeneinander oder untereinander an.

Das Flag »wxVERTICAL« gibt an, dass der Box-Sizer die Komponenten untereinander positionieren soll. Per »Add()«-Methode erfährt der Sizer, um welche Elemente er sich kümmern muss. Der Aufruf in Zeile 94 fügt dem Sizer das Textfeld »about_txt« hinzu. Der zweite Parameter bestimmt, wie sich das eingefügte Element verhalten soll, wenn sich die Größe in Richtung Hauptorientierung ändert. Im Beispiel ist das die vertikale Ausrichtung. Der dritte Parameter bestimmt unterschiedliche Eigenschaften, die der Programmierer bei Bedarf verordnet. Der hier verwendete Parameter »wxALL« legt fest, dass das Element auf jeder Seite einen Rahmen haben soll. Der letzte Parameter bestimmt den Abstand um jedes Element in Pixeln.

Der Aufruf »SetSizer()« in Zeile 96 macht »ptr_sizer« zum Sizer von »AboutDialog«, die Sizer-Methode »SetSizeHints()« in der nächsten Zeile bestimmt, dass sich der Sizer an der Größe des About-Dialogs orientieren soll.

Alles zusammenbauen

Weil das Programm nur aus zwei Dateien besteht, lässt es sich auch ohne Makefile leicht übersetzen. Das Shellskript »wx-config«, das der WX-Bibliothek beiliegt, erleichtert den Umgang mit dem Toolkit und seinen Abhängigkeiten von anderen Bibliotheken. Um das Programm zu erstellen, genügt der folgende Aufruf:

g++ -Wall -g `wx-config --cflags --libs` hellowx.cc -o hellowx


WX-Windows ist ein modernes Werkzeug, das eine lange Entwicklungszeit hinter sich hat. Es wird von einer treuen Fangemeinde genutzt und gepflegt, die auch jedem Neuling gerne mit Rat und Tat zur Seite steht. Neben der Dokumentation stehen auf der Projektseite[1] auch noch hilfreiche Tutorials zum Download bereit.

WX-Windows ist nicht perfekt, die Entwicklergemeinde arbeitet jedoch permanent an seiner Verbesserung. Wer mit den leichten Einschränkungen leben kann, hat ein gut getestetes Werkzeug zur Hand, das seine Alltagstauglichkeit seit über zehn Jahren beweist. (fjl)

Listing 1: Header des
Editors

01 /**********
02  hellowx.h
03  **********/
04 
05 #include <wx/wx.h>
06 
07 class HelloApp:public wxApp
08 {
09 public:
10   virtual bool OnInit();
11 };
12 
13 DECLARE_APP(HelloApp);
14 
15 class AboutDialog:public wxDialog
16 {
17 public:
18   AboutDialog();
19 };
20 
21 class HelloFrame:public wxFrame
22 {
23 public:
24   HelloFrame();
25   void OnSave(wxCommandEvent &event);
26   void OnOpen(wxCommandEvent &event);
27   void OnQuit(wxCommandEvent &event);
28   void OnAbout(wxCommandEvent &event);
29 private:
30   wxMenuBar *m_ptrMenBar;
31   wxTextCtrl *m_ptrText;
32   wxMenu *m_ptrFileMenu, *m_ptrHelpMenu;
33 
34   enum {
35     OPEN_EVT_ID = wxID_HIGHEST + 1,
36     SAVE_EVT_ID,
37     NEW_EVT_ID,
38     QUIT_EVT_ID,
39     ABOUT_EVT_ID
40   };
41   DECLARE_EVENT_TABLE();
42 };

Listing 2: Implementierung des
Editors

01 /**********
02  hellowx.cc
03  **********/
04 
05 #include "hellowx.h"
06 
07 IMPLEMENT_APP(HelloApp);
08 
09 bool HelloApp::OnInit()
10 {
11   HelloFrame *ptr_main = new HelloFrame();
12   SetTopWindow(ptr_main);
13   ptr_main->Show(TRUE);
14   return TRUE;
15 }
16 
17 BEGIN_EVENT_TABLE(HelloFrame, wxFrame)
18   EVT_MENU(OPEN_EVT_ID, HelloFrame::OnOpen)
19   EVT_MENU(SAVE_EVT_ID, HelloFrame::OnSave)
20   EVT_MENU(QUIT_EVT_ID, HelloFrame::OnQuit)
21   EVT_MENU(ABOUT_EVT_ID, HelloFrame::OnAbout)
22 END_EVENT_TABLE()
23 
24 HelloFrame::HelloFrame()
25   :wxFrame(static_cast<wxFrame*>(NULL), -1, "Hello wxWindows")
26 {
27   m_ptrMenBar = new wxMenuBar();
28   m_ptrFileMenu = new wxMenu();
29   m_ptrFileMenu->Append(OPEN_EVT_ID, "&Oeffnen");
30   m_ptrFileMenu->Append(SAVE_EVT_ID, "&Speichern");
31   m_ptrFileMenu->Append(QUIT_EVT_ID, "&Beenden");
32   m_ptrMenBar->Append(m_ptrFileMenu, "&Datei");
33 
34   m_ptrHelpMenu = new wxMenu();
35   m_ptrHelpMenu->Append(ABOUT_EVT_ID, "&About");
36   m_ptrMenBar->Append(m_ptrHelpMenu, "&Hilfe");
37 
38   SetMenuBar(m_ptrMenBar);
39   m_ptrText = new wxTextCtrl(this, -1, "",
40     wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
41 }
42 
43 void HelloFrame::OnSave(wxCommandEvent &event)
44 {
45   wxFileDialog saveDialog(static_cast<wxWindow*>(NULL),
46     "Save", "", "", "*.txt", wxSAVE);
47   if(saveDialog.ShowModal() == wxID_OK) {
48     m_ptrText->SaveFile(saveDialog.GetPath());
49   }
50 }
51 
52 void HelloFrame::OnOpen(wxCommandEvent &event)
53 {
54   wxFileDialog openDialog(static_cast<wxWindow*>(NULL),
55     "Open", "", "", "*.txt", wxOPEN);
56   if(openDialog.ShowModal() == wxID_OK) {
57     m_ptrText->LoadFile(openDialog.GetPath());
58   }
59 }
60 
61 void HelloFrame::OnQuit(wxCommandEvent &event)
62 {
63   if(!m_ptrText->IsModified()) {
64     Close(TRUE);
65     return;
66   }
67 
68   wxMessageDialog msgDialog(static_cast<wxWindow*>(NULL),
69     "Datei wurde geaendert. Wirklich beenden?",
70     "Wirklich beenden?",
71     wxOK | wxCANCEL | wxICON_QUESTION);
72   if(msgDialog.ShowModal() == wxID_OK) {
73     Close(TRUE);
74   }
75 }
76 
77 void HelloFrame::OnAbout(wxCommandEvent &event)
78 {
79   AboutDialog aboutdlg;
80   aboutdlg.ShowModal();
81 }
82 
83 AboutDialog::AboutDialog()
84   :wxDialog(static_cast<wxWindow*>(NULL), -1, "About")
85 {
86   wxButton *ok_button = new wxButton(this, wxID_OK, "OK");
87 
88   wxTextCtrl *about_txt = new wxTextCtrl(this, -1,
89     "Nur eine nichtssagende Aboutbox :-)",
90     wxDefaultPosition, wxSize(200, 100),
91     wxTE_MULTILINE | wxTE_READONLY);
92 
93   wxBoxSizer *ptr_sizer = new wxBoxSizer(wxVERTICAL);
94   ptr_sizer->Add(about_txt, 0, wxALL, 5);
95   ptr_sizer->Add(ok_button, 0, wxALIGN_CENTER, 10);
96   SetSizer(ptr_sizer);
97   ptr_sizer->SetSizeHints(this);
98 }

Infos

[1] WX-Windows: [http://www.wxWindows.org]

[2] QT: [http://www.troll.no]

Copyright © 2002 Linux New Media AG

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Wir können auch anders

    Bisher vorgestellte Programme waren in funktionaler Weise implementiert. Schemes Stärken liegen zwar hauptsächlich in diesem Bereich, jedoch gibt es auch die Möglichkeit, objektorientiert vorzugehen.

  • Mit Schwung - ohne Swing

    Linux wird auf dem Desktop salonfähig, von Java ist dies leider nicht zu behaupten, zu gründlich wurde der Ruf schon vor Jahren ruiniert. Mit den Java-Language-Bindings ist aber eine performante und saubere Integration in das K Desktop Environment möglich.

  • Kleine Mahlzeit

    Es muss nicht immer ein ausgewachsenes Programm sein. Viele kleine Aufgaben lassen sich auch mit Applets erledigen, die im Panel residieren und nur darauf warten, aufgerufen zu werden.

  • Atom

    Githubs Editor Atom feierte kürzlich seinen ersten Geburtstag. Das Unternehmen bewirbt die extrem konfigurierbare freie Anwendung als Kompromiss zwischen Vi und Emacs auf der einen, Sublime und Textmate auf der anderen Seite. Auch im Rohzustand wirkt die Mischung schon vielversprechend.

  • Überall Punkte

    Microsofts Dotnet-Plattform steht Linux-Programmierern über die Projekte Mono und DotGNU zur Verfügung. Der Artikel untersucht, wie weit sich die alternativen Implementierungen für Projekte in der Praxis eignen. Im Mittelpunkt steht die Programmierung grafischer Benutzeroberflächen.

comments powered by Disqus

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.