Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Die Artikel ::  wxWidgets Tutorial Part I: Einführung in wxWidgets     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
phlox81
Moderator

Benutzerprofil
Anmeldungsdatum: 21.04.2001
Beiträge: 7208
Beitrag phlox81 Moderator 21:56:28 10.09.2006   Titel:   wxWidgets Tutorial Part I: Einführung in wxWidgets            Zitieren

1 Vorbemerkungen

wxWidgets ist ein recht großes und zu Teilen komplexes Framework, welches ähnlich wie MFC oder Qt
versucht alle Bedürfnisse des Anwendungsentwicklers innerhalb des Frameworks gerecht zu werden.
wxWidgets verzichtet aber weitgehend auf das Zeichnen eigener Controls, sondern versucht die nativen Widgets
eines Betriebs/Desktopsystems (Win32/WinApi,GTK+ 1/2, Xlib)zu wrappen, und ermöglicht damit das Schreiben
plattformunabhängiger Programme, welche möglichst das Look & Feel der jeweiligen Plattform bieten.

1.1 Unterstütze Plattformen

wxWidgets unterstützt folgende Plattformen:
Zitat:
  • wxMSW: Win32/Win64/WinCE.
  • wxGTK: GTK+ 1 or 2 on Unix.
  • wxX11: Xlib on Unix.
  • wxMac: MacOS X/Carbon, MacOS Classic.
  • wxMGL: MGL on DOS, Linux and other platforms supported by MGL.
  • wxBase: non-GUI builds of the library.
  • wxCocoa: MacOS X/Cocoa (beta).
  • wxOS2: a Presentation Manager port (alpha).
  • wxPalmOS: a Palm OS port (alpha).

Quelle: wxwidgets.org

2 Die Library

Die aktuelle Version von wxWidgets kennt (leider) keine Namespaces, so das alle Klassen die zur Library gehören mit dem Präfix wx anfangen.
Vieler dieser Klassen verfügen über eine Onlinedokumentation, so dass man sich dort auch einen ganz guten Überblick über die Library verschaffen kann.

2.1 Die Library bauen

Es besteht die Option wxWidgets als eine große Library zu bauen (MONOLITHIC) oder jeweils für die verschiedenen Teile des Frameworks eine eigene Lib zu erhalten.
Die Libraries können als DLL oder als static Libs erstellt werden. wxWidgets lässt sich mit vielen Compilern übersetzen, z.b. GCC, MSVS 2005 oder MSVC6.0.
Für die Microsoft IDE sind schon einige entsprechende Projektdateien zum Bauen von wxWidgets vorhanden, diese finden sich unter %wxDir%/build/msw/.
Des Weiteren findet sich im wxWidgets Hauptverzeichnis auch eine Hilfedatei für das Bauen unter Windows ("INSTALL-MSW.txt"). Wer (wie ich) die GCC verwendet,
sollte um die Library zu bauen MSYS von der MinGW Webseite herunterladen und installieren. Damit lässt sich wxWidgets recht einfach und schnell bauen,
und wer später unter Linux das selbe tun muss, kennt den Vorgang bereits. Nach der Installation einfach MSYS starten und ins wxWidgets Verzeichnis wechseln.
Es ist zu empfehlen für den Buildprozess ein eigenes Unterverzeichnis zu erstellen, auch um bei Fehlern dies einfach wieder löschen zu können.

In der MSYS-Konsole folgende Befehle eintippen:
Code:
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
cd $WXWIN # ins wxWidgets verzeichnis wechseln
  mkdir build-debug # Build-Verzeichnis anlegen
  cd build-debug # in das Build-Verzeichnis wechseln
# configure mit den entsprechenden parametern ausführen. enable lässt sich durch disable ersetzen, wenn man z.b. keinen debugbuild machen möchte
  ../configure --with-msw --enable-debug --enable-debug_gdb --disable-shared
  make # startet das eigentliche bauen der Library
  make install % This step is optional, see note (8) below.
  cd samples/minimal # wchseln ins sample-Verzeichnis, um einen Testbuild zu machen
  make # minimal-Beispiel bauen lassen
  ./minimal.exe # ausführen, wenns geklappt hat, müsste jetzt ein Fenster erscheinen
Code:
1
2
3
4
5
6
7
8
9
10
cd $WXWIN # ins wxWidgets verzeichnis wechseln
mkdir build-debug # Build-Verzeichnis anlegen
cd build-debug # in das Build-Verzeichnis wechseln
# configure mit den entsprechenden parametern ausführen. enable lässt sich durch disable ersetzen, wenn man z.b. keinen debugbuild machen möchte
../configure --with-msw --enable-debug --enable-debug_gdb --disable-shared
make # startet das eigentliche bauen der Library
make install % This step is optional, see note (8) below.
cd samples/minimal # wchseln ins sample-Verzeichnis, um einen Testbuild zu machen
make # minimal-Beispiel bauen lassen
./minimal.exe # ausführen, wenns geklappt hat, müsste jetzt ein Fenster erscheinen
Code:
1
2
3
4
5
6
7
8
9
10
cd $WXWIN # ins wxWidgets verzeichnis wechseln
  mkdir build-debug # Build-Verzeichnis anlegen
  cd build-debug # in das Build-Verzeichnis wechseln
# configure mit den entsprechenden parametern ausführen. enable lässt sich durch disable ersetzen, wenn man z.b. keinen debugbuild machen möchte
  ../configure --with-msw --enable-debug --enable-debug_gdb --disable-shared
  make # startet das eigentliche bauen der Library
  make install % This step is optional, see note (8) below.
  cd samples/minimal # wchseln ins sample-Verzeichnis, um einen Testbuild zu machen
  make # minimal-Beispiel bauen lassen
  ./minimal.exe # ausführen, wenns geklappt hat, müsste jetzt ein Fenster erscheinen

Quelle: INSTALL-MSW.txt

2.1.1 wxWidgets und die IDEs

Wenn man die Library erfolgreich gebaut hat, und das minimal Beispiel läuft, muss man wxWidgets noch entsprechend für seine IDE einrichten,
wie man dies für jede andere Library auch muss. Dazu muss man bei den Compileroptionen die entsprechenden Pfade angeben,
für include, und für lib. Dann findet die IDE in der Regel die Dateien, nicht zu vergessen, das man natürlich die entsprechenden Libs
in seinem Projekt auch noch angeben muss.

2.2 wxPack

Wer sich den Aufwand sparen will, die Library selbst zu kompilieren, sollte sich wxPack anschauen.
wxPack enthält wxWidgets + die fertigen Libraries für den MingW (gcc 3.4.5) und den MSVC (7.1), sowie weitere Programme für wxWidgets, wie einen RAD Editor.
Für Visual Studio gibt es sogar einen Installer, welcher wxWidgets für VS installiert.


3 Hello World!

Um einen Eindruck von wxWidgets zu bekommen, habe ich ein kleines Hello World Programm geschrieben, welches einen Button besitzt, und eine TextCtrl.
Wenn man auf den Button klickt, bekommt man einen Eingabedialog, in den man Text eingeben kann, welcher dann an den Inhalt des TextCtrl angehängt wird.

Das Helloworld Programm besteht gerade mal aus 2 Klassen:
MyApp - Eine Applikationsklasse, welche u.a. auch den Einstiegspunkt für die main Funktion liefert.
MyFrame - Das eigentliche Hauptfenster, welches in der MyApp erstellt wird, und in der OnInit den Focus bekommt.

Dies geschieht in der MyApp::OnInit:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
// dieses Makro sorgt für die korrekte Implementierung von MyApp
IMPLEMENT_APP(MyApp);

bool MyApp::OnInit()
{
    //erstellen der MyFrame Instanz:
    MyFrame* frame = new MyFrame(0L, _("wxWidgets Hello World"));
    //Mit Show startet das Hauptfenster
    frame->Show();
    return true;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
// dieses Makro sorgt für die korrekte Implementierung von MyApp
IMPLEMENT_APP(MyApp);

bool MyApp::OnInit()
{
//erstellen der MyFrame Instanz:
MyFrame* frame = new MyFrame(0L, _("wxWidgets Hello World"));
//Mit Show startet das Hauptfenster
frame->Show();
return true;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
// dieses Makro sorgt für die korrekte Implementierung von MyApp
IMPLEMENT_APP(MyApp);

bool MyApp::OnInit()
{
    //erstellen der MyFrame Instanz:
    MyFrame* frame = new MyFrame(0L, _("wxWidgets Hello World"));
    //Mit Show startet das Hauptfenster
    frame->Show();
    return true;
}


Die MyFrame-Klasse ist dann schon etwas komplexer:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "app.h"

// wx Includes
#include
<wx/button.h>
#include
<wx/textctrl.h>

// Die Frameklasse für das Hauptfenster sollte immer von wxFrame oder einem seiner "Kinder" abgeleitet sein.
class MyFrame: public wxFrame
{
    public:
    // MyFrame Konstruktor
        MyFrame(wxFrame *frame, const wxString& title);
        ~MyFrame();
    private:
    // Ein paar Steuerelmente, damit unser Fenster nicht ganz so leer ist:
        wxButton* button;
        wxTextCtrl* txtctrl;
        // plus einige EventHandler
        void OnQuit(wxCommandEvent& event);
        void OnAbout(wxCommandEvent& event);
        void OnInsertText(wxCommandEvent& event);
        // Dieses Makro definiert den EventTable für MyFrame.
        DECLARE_EVENT_TABLE()
};
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "app.h"

// wx Includes
#include
<wx/button.h>
#include
<wx/textctrl.h>

// Die Frameklasse für das Hauptfenster sollte immer von wxFrame oder einem seiner "Kinder" abgeleitet sein.
class MyFrame: public wxFrame
{
public:
// MyFrame Konstruktor
MyFrame(wxFrame *frame, const wxString& title);
~MyFrame();
private:
// Ein paar Steuerelmente, damit unser Fenster nicht ganz so leer ist:
wxButton* button;
wxTextCtrl* txtctrl;
// plus einige EventHandler
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
void OnInsertText(wxCommandEvent& event);
// Dieses Makro definiert den EventTable für MyFrame.
DECLARE_EVENT_TABLE()
};
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "app.h"

// wx Includes
#include
<wx/button.h>
#include
<wx/textctrl.h>

// Die Frameklasse für das Hauptfenster sollte immer von wxFrame oder einem seiner "Kinder" abgeleitet sein.
class MyFrame: public wxFrame
{
    public:
    // MyFrame Konstruktor
        MyFrame(wxFrame *frame, const wxString& title);
        ~MyFrame();
    private:
    // Ein paar Steuerelmente, damit unser Fenster nicht ganz so leer ist:
        wxButton* button;
        wxTextCtrl* txtctrl;
        // plus einige EventHandler
        void OnQuit(wxCommandEvent& event);
        void OnAbout(wxCommandEvent& event);
        void OnInsertText(wxCommandEvent& event);
        // Dieses Makro definiert den EventTable für MyFrame.
        DECLARE_EVENT_TABLE()
};



Die Events lassen sich dann entsprechend im EventTable definieren:
C/C++ Code:
// wxEvent Table - Hier können EventMakros eingetragen werden
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
    EVT_MENU(idMenuQuit, MyFrame::OnQuit)
    EVT_MENU(idMenuAbout, MyFrame::OnAbout)
END_EVENT_TABLE()
C/C++ Code:
// wxEvent Table - Hier können EventMakros eingetragen werden
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(idMenuQuit, MyFrame::OnQuit)
EVT_MENU(idMenuAbout, MyFrame::OnAbout)
END_EVENT_TABLE()
C/C++ Code:
// wxEvent Table - Hier können EventMakros eingetragen werden
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
    EVT_MENU(idMenuQuit, MyFrame::OnQuit)
    EVT_MENU(idMenuAbout, MyFrame::OnAbout)
END_EVENT_TABLE()

In wxWidgets gibt es eine Vielzahl an Eventmakros, ähnlich wie in der MFC.
Man kann allerdings auch jeden Event manuell an ein Menu/Steuerelement binden, und auch wieder lösen.
Dies ist allerdings etwas komplizierter als ein EventMakro:
C/C++ Code:
Connect(button->GetId(),wxEVT_COMMAND_BUTTON_CLICKED,wxCommandEventHandler(MyFrame::OnInsertText));
C/C++ Code:
Connect(button->GetId(),wxEVT_COMMAND_BUTTON_CLICKED,wxCommandEventHandler(MyFrame::OnInsertText));
C/C++ Code:
Connect(button->GetId(),wxEVT_COMMAND_BUTTON_CLICKED,wxCommandEventHandler(MyFrame::OnInsertText));

  • Das erste Argument ist die Id an den der event geschickt werden soll, dies kann (wie hier)
    die ID eines Steuerelementes sein, aber auch z.B. aus einem Enum stammen.
  • Das zweite Argument ist die ID des Events, welcher verbunden werden soll.
  • Das 3. Argument ist der EventHandler, hier gibt es verschiedene (wxMouseEventHandler,wxCommandEventHandler etc.)
    Als Argument nimmt dieser Handler die Methode die bei diesem Event aufgerufen werden soll.


Aber bevor man irgendwelche Events an die Steuerelemente binden kann, muss man diese erstmal erzeugen.
Dies geschieht in wxWidgets in der Regel im Konstruktor, bzw. in einer Methode die dann von den verschiedenen Konstruktoren aufgerufen wird ("CreateGUIControls").
wxWidgets bietet die Möglichkeit, seine Steuerelmente nach Position auszurichten, wie man dies in der MFC auch machen kann.
Jedoch bietet wxWidgets auch die Möglichkeit, Sizer zu benutzen, welche die Positionierung der Steuerelemente dann automatisch übernehmen, und auch an evtl.
Größenveränderungen anpassen. Deswegen ist es sehr empfehlenswert die Sizer zu benutzen.

Der MyFrame-Konstruktor sieht dann so aus:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
MyFrame::MyFrame(wxFrame *frame, const wxString& title)
    : wxFrame(frame, -1, title)
{
#if
wxUSE_MENUS
    // diese Zeilen erstellen das Menü:
    // wxMenuBar ist die eigentliche Menükomponente, welche auch später im Programm angezeigt wird...

    wxMenuBar* mbar = new wxMenuBar();
    // wxMenu stellt dann ein Menu in diesem MenuBar da.
    wxMenu* fileMenu = new wxMenu(_T(""));
    // mit Append wird ein Menüeintrag erstellt, die ID wurde oben schon im EventTable mit OnQuit verbunden.
    fileMenu->Append(idMenuQuit, _("&Quit\tAlt-F4"), _("Quit the application"));
    // das Menü in den Menubar einhängen.
    mbar->Append(fileMenu, _("&File"));

    wxMenu* helpMenu = new wxMenu(_T(""));
    helpMenu->Append(idMenuAbout, _("&About\tF1"), _("Show info about this application"));
    mbar->Append(helpMenu, _("&Help"));

    // das Menü dem Fenster übergeben
    SetMenuBar(mbar);
#endif
// wxUSE_MENUS

    // Hier wird nun der eigentliche Fensterinhalt erstellt
    // Der Sizer wird als erstes erstellt, weil er später die Childfenster von MyFrame aufnimmt.
    // Die 4 Argumente sind Zeilen, Spalten, vertical gap und horizontal gap.

    wxFlexGridSizer* sizer = new wxFlexGridSizer(2,1,0,0);
    // Eine Besonderheit gibt es bei wxFlexGridSizer, man kann angeben,
    // welche Spalten oder Zeilen bei einer Grössenänderung wachsen/schrumpfen sollen.

    sizer->AddGrowableCol(0);
    sizer->AddGrowableRow(1);
    // Anlegen des wxButtons:
    // Das erste Argument ist das Parent-Fenster: wxWindow* parent
    // Das zweite Argument ist die ID des Steuerelementes: int id
    //  wxNewId() ist ein Makro welches die nächste gültige ID zurück gibt,
    //  alternativ kann man hier auch einen Wert aus einem Enum oder eine einfache Int variable angeben.
    // Das dritte Argument ist die Beschriftung des Buttons.

    button = new wxButton(this,wxNewId(),_("Append Text"));
    // Nach der Erzeugung wird den Button dem Sizer übergeben.
    sizer->Add(button, 0, wxALL, 5);
    // Anlegen des wxTextCtrls:
    // Erstes Argument ist wieder das Parent, das zweite die ID.
    //  -1 heisst hier, das es keine Event ID innerhalb von wxWidgets braucht,
    //  da keine Eventbindung (EventTable/Connect) vorliegt. Dies kann auch z.b. ID_DEFAULT sein, welches i.d.R. ein #define ID_DEFAULT -1 ist.

    txtctrl = new wxTextCtrl(this,-1,"",wxDefaultPosition,wxDefaultSize,wxTE_MULTILINE);
    // Das TextCtrl dem Sizer hinzufügen, die Argumente sind hierbei:
    // Als erstes das Steuerelement selber.
    // Das dritte Argument sind die Sizerflags, welche das Verhalten des Steuerelmentes bei Grössenveränderungen abbildet.
    //  wxALL stellt sicher das zu allen Seiten ein Abstand von 5 Pixeln vorhanden ist (4. Argument)
    //  wxEXPAND - Das Steuerelement passt sich den Grössenverändungen des Fensters an

    sizer->Add(txtctrl,0,wxALL|wxEXPAND, 5);
    // Sizer dem Hauptfenster übergeben.
    SetSizer(sizer);
    // korrektes Layout berechnen
    Layout();
    // Das Fenster bekommt eine Mindestgrösse
    SetMinSize(wxSize(300,200));
    // Fit stellt sicher das alle Steuerelmente ins Fenster passen, und pass notfalls diese an.
    Fit();
   
    // Mit Connect wird der Button-Click-Event mit der Methode OnInsertText verbunden, mit button als Event Sender.
    Connect(button->GetId(),wxEVT_COMMAND_BUTTON_CLICKED,wxCommandEventHandler(MyFrame::OnInsertText));

#if
wxUSE_STATUSBAR
    // create a status bar with some information about the used wxWidgets version
    CreateStatusBar(2);
    SetStatusText(_("Hello Code::Blocks user !"),0);
    SetStatusText(wxbuildinfo(short_f),1);
#endif
// wxUSE_STATUSBAR
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
MyFrame::MyFrame(wxFrame *frame, const wxString& title)
: wxFrame(frame, -1, title)
{
#if
wxUSE_MENUS
// diese Zeilen erstellen das Menü:
// wxMenuBar ist die eigentliche Menükomponente, welche auch später im Programm angezeigt wird...

wxMenuBar* mbar = new wxMenuBar();
// wxMenu stellt dann ein Menu in diesem MenuBar da.
wxMenu* fileMenu = new wxMenu(_T(""));
// mit Append wird ein Menüeintrag erstellt, die ID wurde oben schon im EventTable mit OnQuit verbunden.
fileMenu->Append(idMenuQuit, _("&Quit\tAlt-F4"), _("Quit the application"));
// das Menü in den Menubar einhängen.
mbar->Append(fileMenu, _("&File"));

wxMenu* helpMenu = new wxMenu(_T(""));
helpMenu->Append(idMenuAbout, _("&About\tF1"), _("Show info about this application"));
mbar->Append(helpMenu, _("&Help"));

// das Menü dem Fenster übergeben
SetMenuBar(mbar);
#endif
// wxUSE_MENUS

// Hier wird nun der eigentliche Fensterinhalt erstellt
// Der Sizer wird als erstes erstellt, weil er später die Childfenster von MyFrame aufnimmt.
// Die 4 Argumente sind Zeilen, Spalten, vertical gap und horizontal gap.

wxFlexGridSizer* sizer = new wxFlexGridSizer(2,1,0,0);
// Eine Besonderheit gibt es bei wxFlexGridSizer, man kann angeben,
// welche Spalten oder Zeilen bei einer Grössenänderung wachsen/schrumpfen sollen.

sizer->AddGrowableCol(0);
sizer->AddGrowableRow(1);
// Anlegen des wxButtons:
// Das erste Argument ist das Parent-Fenster: wxWindow* parent
// Das zweite Argument ist die ID des Steuerelementes: int id
// wxNewId() ist ein Makro welches die nächste gültige ID zurück gibt,
// alternativ kann man hier auch einen Wert aus einem Enum oder eine einfache Int variable angeben.
// Das dritte Argument ist die Beschriftung des Buttons.

button = new wxButton(this,wxNewId(),_("Append Text"));
// Nach der Erzeugung wird den Button dem Sizer übergeben.
sizer->Add(button, 0, wxALL, 5);
// Anlegen des wxTextCtrls:
// Erstes Argument ist wieder das Parent, das zweite die ID.
// -1 heisst hier, das es keine Event ID innerhalb von wxWidgets braucht,
// da keine Eventbindung (EventTable/Connect) vorliegt. Dies kann auch z.b. ID_DEFAULT sein, welches i.d.R. ein #define ID_DEFAULT -1 ist.

txtctrl = new wxTextCtrl(this,-1,"",wxDefaultPosition,wxDefaultSize,wxTE_MULTILINE);
// Das TextCtrl dem Sizer hinzufügen, die Argumente sind hierbei:
// Als erstes das Steuerelement selber.
// Das dritte Argument sind die Sizerflags, welche das Verhalten des Steuerelmentes bei Grössenveränderungen abbildet.
// wxALL stellt sicher das zu allen Seiten ein Abstand von 5 Pixeln vorhanden ist (4. Argument)
// wxEXPAND - Das Steuerelement passt sich den Grössenverändungen des Fensters an

sizer->Add(txtctrl,0,wxALL|wxEXPAND, 5);
// Sizer dem Hauptfenster übergeben.
SetSizer(sizer);
// korrektes Layout berechnen
Layout();
// Das Fenster bekommt eine Mindestgrösse
SetMinSize(wxSize(300,200));
// Fit stellt sicher das alle Steuerelmente ins Fenster passen, und pass notfalls diese an.
Fit();

// Mit Connect wird der Button-Click-Event mit der Methode OnInsertText verbunden, mit button als Event Sender.
Connect(button->GetId(),wxEVT_COMMAND_BUTTON_CLICKED,wxCommandEventHandler(MyFrame::OnInsertText));

#if
wxUSE_STATUSBAR
// create a status bar with some information about the used wxWidgets version
CreateStatusBar(2);
SetStatusText(_("Hello Code::Blocks user !"),0);
SetStatusText(wxbuildinfo(short_f),1);
#endif
// wxUSE_STATUSBAR
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
MyFrame::MyFrame(wxFrame *frame, const wxString& title)
    : wxFrame(frame, -1, title)
{
#if
wxUSE_MENUS
    // diese Zeilen erstellen das Menü:
    // wxMenuBar ist die eigentliche Menükomponente, welche auch später im Programm angezeigt wird...

    wxMenuBar* mbar = new wxMenuBar();
    // wxMenu stellt dann ein Menu in diesem MenuBar da.
    wxMenu* fileMenu = new wxMenu(_T(""));
    // mit Append wird ein Menüeintrag erstellt, die ID wurde oben schon im EventTable mit OnQuit verbunden.
    fileMenu->Append(idMenuQuit, _("&Quit\tAlt-F4"), _("Quit the application"));
    // das Menü in den Menubar einhängen.
    mbar->Append(fileMenu, _("&File"));

    wxMenu* helpMenu = new wxMenu(_T(""));
    helpMenu->Append(idMenuAbout, _("&About\tF1"), _("Show info about this application"));
    mbar->Append(helpMenu, _("&Help"));

    // das Menü dem Fenster übergeben
    SetMenuBar(mbar);
#endif
// wxUSE_MENUS

    // Hier wird nun der eigentliche Fensterinhalt erstellt
    // Der Sizer wird als erstes erstellt, weil er später die Childfenster von MyFrame aufnimmt.
    // Die 4 Argumente sind Zeilen, Spalten, vertical gap und horizontal gap.

    wxFlexGridSizer* sizer = new wxFlexGridSizer(2,1,0,0);
    // Eine Besonderheit gibt es bei wxFlexGridSizer, man kann angeben,
    // welche Spalten oder Zeilen bei einer Grössenänderung wachsen/schrumpfen sollen.

    sizer->AddGrowableCol(0);
    sizer->AddGrowableRow(1);
    // Anlegen des wxButtons:
    // Das erste Argument ist das Parent-Fenster: wxWindow* parent
    // Das zweite Argument ist die ID des Steuerelementes: int id
    //  wxNewId() ist ein Makro welches die nächste gültige ID zurück gibt,
    //  alternativ kann man hier auch einen Wert aus einem Enum oder eine einfache Int variable angeben.
    // Das dritte Argument ist die Beschriftung des Buttons.

    button = new wxButton(this,wxNewId(),_("Append Text"));
    // Nach der Erzeugung wird den Button dem Sizer übergeben.
    sizer->Add(button, 0, wxALL, 5);
    // Anlegen des wxTextCtrls:
    // Erstes Argument ist wieder das Parent, das zweite die ID.
    //  -1 heisst hier, das es keine Event ID innerhalb von wxWidgets braucht,
    //  da keine Eventbindung (EventTable/Connect) vorliegt. Dies kann auch z.b. ID_DEFAULT sein, welches i.d.R. ein #define ID_DEFAULT -1 ist.

    txtctrl = new wxTextCtrl(this,-1,"",wxDefaultPosition,wxDefaultSize,wxTE_MULTILINE);
    // Das TextCtrl dem Sizer hinzufügen, die Argumente sind hierbei:
    // Als erstes das Steuerelement selber.
    // Das dritte Argument sind die Sizerflags, welche das Verhalten des Steuerelmentes bei Grössenveränderungen abbildet.
    //  wxALL stellt sicher das zu allen Seiten ein Abstand von 5 Pixeln vorhanden ist (4. Argument)
    //  wxEXPAND - Das Steuerelement passt sich den Grössenverändungen des Fensters an

    sizer->Add(txtctrl,0,wxALL|wxEXPAND, 5);
    // Sizer dem Hauptfenster übergeben.
    SetSizer(sizer);
    // korrektes Layout berechnen
    Layout();
    // Das Fenster bekommt eine Mindestgrösse
    SetMinSize(wxSize(300,200));
    // Fit stellt sicher das alle Steuerelmente ins Fenster passen, und pass notfalls diese an.
    Fit();
   
    // Mit Connect wird der Button-Click-Event mit der Methode OnInsertText verbunden, mit button als Event Sender.
    Connect(button->GetId(),wxEVT_COMMAND_BUTTON_CLICKED,wxCommandEventHandler(MyFrame::OnInsertText));

#if
wxUSE_STATUSBAR
    // create a status bar with some information about the used wxWidgets version
    CreateStatusBar(2);
    SetStatusText(_("Hello Code::Blocks user !"),0);
    SetStatusText(wxbuildinfo(short_f),1);
#endif
// wxUSE_STATUSBAR
}

Eine Besonderheit von wxWidgets ist es, dass alle Komponenten die zu wxWidgets gehören, und mit new erzeugt werden,
von wxWidgets wieder gelöscht werden, wenn man sie an wxWidgets übergibt. Daher ist der Destruktor der MyFrame Klasse auch leer.

Im Konstruktor wurde der Button-Event mit Connect an die Methode OnInsertText gebunden:
C/C++ Code:
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
void MyFrame::OnInsertText(wxCommandEvent& event)
{
    // wxTextEntryDialog dient dazu eine Textzeile vom User abzufragen:
    wxTextEntryDialog dlg(this,_("enter some text"),_("enter some text"),_(""));
    // ShowModal gibt bei Erfolg wxID_OK zurück
    if(dlg.ShowModal() == wxID_OK)// AppendText fügt den Text in das TextCtrl ein. "\n" ist für den Zeilenumbruch.
        txtctrl->AppendText(dlg.GetValue()+"\n");
}
C/C++ Code:
1
2
3
4
5
6
7
8
void MyFrame::OnInsertText(wxCommandEvent& event)
{
// wxTextEntryDialog dient dazu eine Textzeile vom User abzufragen:
wxTextEntryDialog dlg(this,_("enter some text"),_("enter some text"),_(""));
// ShowModal gibt bei Erfolg wxID_OK zurück
if(dlg.ShowModal() == wxID_OK)// AppendText fügt den Text in das TextCtrl ein. "\n" ist für den Zeilenumbruch.
txtctrl->AppendText(dlg.GetValue()+"\n");
}
C/C++ Code:
1
2
3
4
5
6
7
8
void MyFrame::OnInsertText(wxCommandEvent& event)
{
    // wxTextEntryDialog dient dazu eine Textzeile vom User abzufragen:
    wxTextEntryDialog dlg(this,_("enter some text"),_("enter some text"),_(""));
    // ShowModal gibt bei Erfolg wxID_OK zurück
    if(dlg.ShowModal() == wxID_OK)// AppendText fügt den Text in das TextCtrl ein. "\n" ist für den Zeilenumbruch.
        txtctrl->AppendText(dlg.GetValue()+"\n");
}


Der gesamte Code des Hello World Beispiels kann hier herruntergeladen werden: wxHelloWorld

Weitere Links zum Thema wxWidgest:
http://www.wxwidgets.org
Die offizielle wxWidgets Klassenliste (englisch)
Das offizielle wxWidgets Forum (englisch)

_________________
Intelligenz ist eine Illusion des Menschen

phlox81.de | The Black Board | Code Node | Xing | Blog | Twitter


Zuletzt bearbeitet von phlox81 am 11:00:37 14.03.2007, insgesamt 5-mal bearbeitet
KasF
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.12.2004
Beiträge: 2378
Beitrag KasF Mitglied 13:38:53 13.09.2006   Titel:              Zitieren

:live: :live: Guter Artikel

Kannst du was zu dem zweiten Argument von wxSizer::Add(.,int proportion = 0,.,.) erzählen. Werde irgendwie nicht ganz schlau daraus, was es genau macht.

[flüster]... Soooo viele Präprozessordirektiven und diese Makros ...[/flüster]

_________________
Um C++ zu beherrschen muss man schon for( ;; ) fragen ob er genug Zeit für einen hat ...
phlox81
Moderator

Benutzerprofil
Anmeldungsdatum: 21.04.2001
Beiträge: 7208
Beitrag phlox81 Moderator 15:39:08 13.09.2006   Titel:              Zitieren

Freak_Coder schrieb:

Kannst du was zu dem zweiten Argument von wxSizer::Add(.,int proportion = 0,.,.) erzählen. Werde irgendwie nicht ganz schlau daraus, was es genau macht.


Das Argument bezieht sich nur auf wxBoxSizer. Es bedeutet dass das Childfenster seine Größe in einer gewissen Proportion
ändern kann, aber nur in die Ausrichtung des BoxSizers (wxHORIZONTAL/wxVERTICAL).

Die wxWidgets Dokumentation sagt folgendes darüber:

Zitat:
proportion

Although the meaning of this parameter is undefined in wxSizer, it is used in wxBoxSizer to indicate if a child of a sizer can change its size in the main orientation of the wxBoxSizer - where 0 stands for not changeable and a value of more than zero is interpreted relative to the value of other children of the same wxBoxSizer. For example, you might have a horizontal wxBoxSizer with three children, two of which are supposed to change their size with the sizer. Then the two stretchable windows would get a value of 1 each to make them grow and shrink equally with the sizer's horizontal dimension.

_________________
Intelligenz ist eine Illusion des Menschen

phlox81.de | The Black Board | Code Node | Xing | Blog | Twitter


Zuletzt bearbeitet von phlox81 am 15:39:44 13.09.2006, insgesamt 1-mal bearbeitet
kynarion
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.06.2006
Beiträge: 150
Beitrag kynarion Mitglied 16:33:54 13.09.2006   Titel:              Zitieren

Jupp, lesenswert. Ich hab auch noch ne Frage:

C/C++ Code:
#if wxUSE_MENUS
#if
wxUSE_STATUSBAR
...
C/C++ Code:
#if wxUSE_MENUS
#if
wxUSE_STATUSBAR
...
C/C++ Code:
#if wxUSE_MENUS
#if
wxUSE_STATUSBAR
...


Wozu sind diese Abfragen? Wenn ein OS z.B. keinen Statusbar darstellen kann, dann wird das doch automatisch ignoriert, oder?

_________________
Si tacuisses, philosophus mansisses.
KasF
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.12.2004
Beiträge: 2378
Beitrag KasF Mitglied 16:39:21 13.09.2006   Titel:              Zitieren

Ok ...
Noch ne Frage:

1.) Wie läuft das intern ab, wie ist das implementiert das wxWidgets ohne eine main()-Funktion auskommt und in OnInit() anfängt ???

_________________
Um C++ zu beherrschen muss man schon for( ;; ) fragen ob er genug Zeit für einen hat ...
evilissimo
Chefkoch

Benutzerprofil
Anmeldungsdatum: 12.11.2003
Beiträge: 2283
Beitrag evilissimo Chefkoch 16:46:51 13.09.2006   Titel:              Zitieren

Freak_Coder schrieb:
Ok ...
Noch ne Frage:

1.) Wie läuft das intern ab, wie ist das implementiert das wxWidgets ohne eine main()-Funktion auskommt und in OnInit() anfängt ???


Makromagie ;)

@phlox81 ich hatte dir doch gesagt das du das schreiben sollst ;) Hast wohl vergessen :)

BR
Vinzenz

_________________
evilissimo - R.I.P. dmr
< Moderator im C++/CLI Forum und im C++ Forum >
About Singletons: "Anyway, if our experts can make this mistake, you have made it and you don't even know about it."
phlox81
Moderator

Benutzerprofil
Anmeldungsdatum: 21.04.2001
Beiträge: 7208
Beitrag phlox81 Moderator 17:43:46 13.09.2006   Titel:              Zitieren

kynarion schrieb:
Jupp, lesenswert. Ich hab auch noch ne Frage:

C/C++ Code:
#if wxUSE_MENUS
#if
wxUSE_STATUSBAR
...
C/C++ Code:
#if wxUSE_MENUS
#if
wxUSE_STATUSBAR
...
C/C++ Code:
#if wxUSE_MENUS
#if
wxUSE_STATUSBAR
...


Wozu sind diese Abfragen? Wenn ein OS z.B. keinen Statusbar darstellen kann, dann wird das doch automatisch ignoriert, oder?


Genau dafür ist das da. Man kann diese Flags aber auch selber definieren, so das man diverse Einstellungen in wxWidgets vornehmen kann.

_________________
Intelligenz ist eine Illusion des Menschen

phlox81.de | The Black Board | Code Node | Xing | Blog | Twitter
~
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.08.2006
Beiträge: 8
Beitrag ~ Mitglied 21:24:03 18.09.2006   Titel:              Zitieren

Das Buch "Cross-Platform GUI Programming with wxWidgets" gibt es kostenlos und legal zum Download als PDF.

http://www.phptr.com/content/images/0131473816/downloads/0131473816_book.pdf
swunder
Mitglied

Benutzerprofil
Anmeldungsdatum: 24.11.2006
Beiträge: 124
Beitrag swunder Mitglied 17:12:43 24.11.2006   Titel:              Zitieren

Hallo,

ich habe dieses Programm Versuch in Code::Blocks zu starten leider funktioniert es nicht! Ich kriege SEHR viele Errors heraus!
Woran kann es liegen!

Ich habe die WX Libary in Projekt-> Build Options -> Costum variables -> add den Link zu der Bibleothek $(link) eingegeben.

Es kommen trotzdem vielle Fehler!

Gruss Stefan
kaina
Unregistrierter




Beitrag kaina Unregistrierter 07:45:46 05.12.2006   Titel:   nix geht            Zitieren

yo sieht bei mir ähnlich aus:

Linker-Vorgang läuft...
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _free bereits in LIBCD.lib(dbgheap.obj) definiert
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _exit bereits in LIBCD.lib(crt0dat.obj) definiert
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _malloc bereits in LIBCD.lib(dbgheap.obj) definiert
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _realloc bereits in LIBCD.lib(dbgheap.obj) definiert
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _memmove bereits in LIBCD.lib(memmove.obj) definiert
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _tolower bereits in LIBCD.lib(tolower.obj) definiert
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: __vsnprintf bereits in LIBCD.lib(vsnprint.obj) definiert
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _calloc bereits in LIBCD.lib(dbgheap.obj) definiert
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _strncpy bereits in LIBCD.lib(strncpy.obj) definiert
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _abort bereits in LIBCD.lib(abort.obj) definiert
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: __snprintf bereits in LIBCD.lib(snprintf.obj) definiert
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _fflush bereits in LIBCD.lib(fflush.obj) definiert
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _sprintf bereits in LIBCD.lib(sprintf.obj) definiert
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: __close bereits in LIBCD.lib(close.obj) definiert
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: __write bereits in LIBCD.lib(write.obj) definiert
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: __commit bereits in LIBCD.lib(commit.obj) definiert
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: __get_osfhandle bereits in LIBCD.lib(osfinfo.obj) definiert
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: __CrtSetDbgFlag bereits in LIBCD.lib(dbgheap.obj) definiert
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _fclose bereits in LIBCD.lib(fclose.obj) definiert
LINK : warning LNK4098: Standardbibliothek "MSVCRTD" steht in Konflikt mit anderen Bibliotheken; /NODEFAULT:Bibliothek verwenden
wxmsw26d_core.lib(app.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __imp__InitCommonControls@0
wxmsw26d_core.lib(window.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __imp___TrackMouseEvent@4
wxmsw26d_core.lib(statbr95.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __imp__CreateStatusWindowA@16
wxmsw26d_core.lib(spinbutt.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __imp__CreateUpDownControl@48
wxmsw26d_core.lib(imaglist.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __imp__ImageList_Create@20
wxmsw26d_core.lib(imaglist.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __imp__ImageList_Destroy@4
wxmsw26d_core.lib(imaglist.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __imp__ImageList_GetImageCount@4
wxmsw26d_core.lib(imaglist.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __imp__ImageList_GetIconSize@12
wxmsw26d_core.lib(imaglist.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __imp__ImageList_Add@12
wxmsw26d_core.lib(imaglist.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __imp__ImageList_AddMasked@12
wxmsw26d_core.lib(imaglist.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __imp__ImageList_ReplaceIcon@12
wxmsw26d_core.lib(imaglist.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __imp__ImageList_Replace@16
wxmsw26d_core.lib(imaglist.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __imp__ImageList_Remove@8
wxmsw26d_core.lib(imaglist.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __imp__ImageList_Draw@24
wxmsw26d_core.lib(imaglist.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __imp__ImageList_SetBkColor@8
wxmsw26d_core.lib(imaglist.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __imp__ImageList_GetIcon@12
wxmsw26d_core.lib(uuid.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __imp__UuidToStringA@8
wxmsw26d_core.lib(uuid.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __imp__RpcStringFreeA@4
wxmsw26d_core.lib(uuid.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __imp__UuidCreate@4
wxmsw26d_core.lib(uuid.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __imp__UuidFromStringA@8
Debug/moinse.exe : fatal error LNK1120: 20 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

tester.exe - 40 Fehler, 1 Warnung(en)
Owner
Unregistrierter




Beitrag Owner Unregistrierter 22:27:16 27.02.2007   Titel:              Zitieren

is es auch für Linux?

mfg
owner
phlox81
Moderator

Benutzerprofil
Anmeldungsdatum: 21.04.2001
Beiträge: 7208
Beitrag phlox81 Moderator 23:15:25 27.02.2007   Titel:              Zitieren

Owner schrieb:
is es auch für Linux?

mfg
owner


wxGTK läuft natürlich auch unter Linux.
Steht auch in Absatz 2.1

_________________
Intelligenz ist eine Illusion des Menschen

phlox81.de | The Black Board | Code Node | Xing | Blog | Twitter
Baseball
Mitglied

Benutzerprofil
Anmeldungsdatum: 10.03.2007
Beiträge: 38
Beitrag Baseball Mitglied 11:50:24 18.03.2007   Titel:              Zitieren

Guten Morgen,

ich versuche mich auch gerade in C++ (wegen dem Studium) und habe von wxWidgets gehört. Ich nutze den DevC++ und habe versucht eine "HelloWorld" Tutorial einzugeben. Es scheitert aber schon am

Code:
#include "wx/wx.h"
Code:
#include "wx/wx.h"
Code:
#include "wx/wx.h"


Ich habe leider noch keine Anleitung gefunden, wie und wo ich im Compiler die Verzeichnisse richtig einstelle. Kann mir da vielleicht jemand weiter helfen?

Vielen Dank im voraus

lg Baseball
Artchi
Autor

Benutzerprofil
Anmeldungsdatum: 16.03.2002
Beiträge: 8576
Beitrag Artchi Autor 14:11:35 18.03.2007   Titel:              Zitieren

Wenn es richtig eingerichtet ist, muß die Zeile
C/C++ Code:
#include <wx/wx.h>
C/C++ Code:
#include <wx/wx.h>
C/C++ Code:
#include <wx/wx.h>

heißen.
Und schmeiß DevCpp weg!!!!!!!!!!!!!!!!!!!! Es ist veraltet und wird nicht weiter entwickelt. Man, ladet euch doch mal aktuelle Entwicklungswerkzeuge runter! Z.B. VisualC++2005 Express plus PSDK.
http://www.c-plusplus.de/forum/viewtopic-var-t-is-143003.html Dann kannst du dich auch hier nach dem Artikel richten und wxPack downloaden, das richtet dir dann alles ein.
JakobF
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.07.2007
Beiträge: 7
Beitrag JakobF Mitglied 12:54:47 13.07.2007   Titel:              Zitieren

Gibt es das erwähnte eBook aus einem der vorangegangenen Beiträge noch?
Wenn das jemand noch hat und uppen würde, das wäre nett.
Der alte Link ist nämlich tot.

*** EDIT ***
Es gibt das erwähnte eBook aus einem der vorangegangenen Beiträge noch!
Wenn das jemand noch hat und uppen würde, das wäre unnötig.
Der alte Link ist nämlich i.O.


Zuletzt bearbeitet von JakobF am 14:16:14 14.07.2007, insgesamt 1-mal bearbeitet
linktester
Unregistrierter




Beitrag linktester Unregistrierter 14:52:58 13.07.2007   Titel:              Zitieren

Zitat:
Der alte Link ist nämlich tot.


Nööööö.
linktester
Unregistrierter




Beitrag linktester Unregistrierter 08:43:18 18.08.2007   Titel:              Zitieren

Jetzt ist es wirklich down. Habs hochgeladen:

http://rapidshare.com/files/49694550/Cross-Platform_GUI_Programming_with_wxWidgets.pdf.html
graetz
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.02.2009
Beiträge: 4
Beitrag graetz Mitglied 12:13:02 25.02.2009   Titel:              Zitieren

Hallo,

habs gerade auf meinem EeePC900A unter Ubuntu 8.04 mit g++ 4.2.4 und wx2.8
kompiliert und musste dafuer folgende zwei Zeilen in der main.cpp in Schoenschrift verfassen.

main.cpp:83
C/C++ Code:
txtctrl = new wxTextCtrl(this,-1,wxString((wxChar*)(""), size_t(0)),wxDefaultPosition,wxDefaultSize,wxTE_MULTILINE);
C/C++ Code:
txtctrl = new wxTextCtrl(this,-1,wxString((wxChar*)(""), size_t(0)),wxDefaultPosition,wxDefaultSize,wxTE_MULTILINE);
C/C++ Code:
txtctrl = new wxTextCtrl(this,-1,wxString((wxChar*)(""), size_t(0)),wxDefaultPosition,wxDefaultSize,wxTE_MULTILINE);


main.cpp:130
C/C++ Code:
txtctrl->AppendText(dlg.GetValue() + wxString( (wxChar*)("\n"), size_t(1)) );
C/C++ Code:
txtctrl->AppendText(dlg.GetValue() + wxString( (wxChar*)("\n"), size_t(1)) );
C/C++ Code:
txtctrl->AppendText(dlg.GetValue() + wxString( (wxChar*)("\n"), size_t(1)) );


Danach hat er es erst durchkompiliert und es lief.
btw; Schoener Artikel und gutes Beispiel, Danke :)

graetz :D
Wikinger75
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.01.2009
Beiträge: 376
Beitrag Wikinger75 Mitglied 15:56:17 14.03.2009   Titel:              Zitieren

Von Artchi
Zitat:
Wenn es richtig eingerichtet ist, muß die Zeile
C/C++ Code:
#include <wx/wx.h>
C/C++ Code:
#include <wx/wx.h>
C/C++ Code:
#include <wx/wx.h>


heißen.
Und schmeiß DevCpp weg!!!!!!!!!!!!!!!!!!!! Es ist veraltet und wird nicht weiter entwickelt. Man, ladet euch doch mal aktuelle Entwicklungswerkzeuge runter! Z.B. VisualC++2005 Express plus PSDK.
http://www.c-plusplus.de/forum/viewtopic-var-t-is-143003.html Dann kannst du dich auch hier nach dem Artikel richten und wxPack downloaden, das richtet dir dann alles ein.


Ich glaub ich greif auch wieder zu DevC++ zurück weil es keine vrnüptigen anleitungen oder so was gibt wie man das in Code::Blocks einfügen kann...
phlox81
Moderator

Benutzerprofil
Anmeldungsdatum: 21.04.2001
Beiträge: 7208
Beitrag phlox81 Moderator 16:37:59 14.03.2009   Titel:              Zitieren

Musst du halt mal selber suchen, bist ja nicht der erste der C::B für wx nutzt.
Eigentlich musst du nur die richtigen Pfade setzen, dann klappts auch.
Ansonsten musste halt mal im Compiler/IDE Forum nachfragen.
Oder unter forums.codeblocks.org

_________________
Intelligenz ist eine Illusion des Menschen

phlox81.de | The Black Board | Code Node | Xing | Blog | Twitter
newp
Unregistrierter




Beitrag newp Unregistrierter 22:54:30 14.03.2009   Titel:              Zitieren

http://wiki.wxwidgets.org/CodeBlocks_Setup_Guide
http://www.speakingx.com/blog/2008/04/24/codeblocks-wxwidgets-setup
http://wiki.codeblocks.org/index.php?title=Compiling_wxWidgets_2.6.1_to_develop_Code::Blocks_(MSW)

Ich weiß wirklich nicht wo das problem liegt? Es dauert nur paar sekunden wxWidgets mit Code::Blocks einzustellen. Ist ja in jeder IDE das selbe, include/lib dir zu wx ordner einstellen und fertig.
wxSkip
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.11.2009
Beiträge: 1848
Beitrag wxSkip Mitglied 22:05:26 26.11.2009   Titel:              Zitieren

Also wenn was in C::B nicht funktioniert, müsste es eigentlich an der wxWidgets-Kompilierung liegen, also warum nicht wxPack herunterladen?

_________________
Je mehr Käse, desto mehr Löcher. Je mehr Löcher, desto weniger Käse. Also: Je mehr Käse, desto weniger Käse!
FrageWxWidgets
Unregistrierter




Beitrag FrageWxWidgets Unregistrierter 13:36:16 02.05.2010   Titel:              Zitieren

Hallo,

Hab mal ne kurze Frage, leider konnte ich aus Google und der Onlinedokumentation nicht schlau werden und muss nun um Eure Hilfe bitten:

Wie kann ich den Textinhalt eines Buttons editieren?
daersc
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.05.2008
Beiträge: 398
Beitrag daersc Mitglied 14:30:10 02.05.2010   Titel:              Zitieren

FrageWxWidgets schrieb:
Wie kann ich den Textinhalt eines Buttons editieren?


Mit wxButton::SetLabel()
Hier der Link zur offiziellen wxWidgets-Doku: http://docs.wxwidgets.org/stable/

_________________
It's not a bug,
it's a feature!
C/C++ Forum :: Die Artikel ::  wxWidgets Tutorial Part I: Einführung in wxWidgets   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.