Einstieg in wxWidgets

Dr.-Ing. Erhard Henkes, Stand: 19.03.2023

 

Der praktische Einstieg


Was braucht man eigentlich, um in die Windows-Programmierung mit C++ und wxWidgets praktisch einzusteigen?

Wir setzen unter Windows als IDE das bewährte Microsoft Visual Studio Community 2022 (64-Bit) ein.

Zunächst besorgen wir uns wxWidgets per Download:

Auf der Seite https://www.wxwidgets.org/downloads/ finden wir https://github.com/wxWidgets/wxWidgets/releases/download/v3.2.2.1/wxMSW-3.2.2.1-Setup.exe (Windows Installer). Es gibt auch gepackte Verzeichnisse im zip-oder 7z-Format.

Ich habe mir die wxWidgets Files nach F:\wxWidgets-3.2.2.1 installiert. Dort befindet sich dann der Sourcecode von wxWidget.

Diesen müssen wir zunächst kompilieren/linken.
Dafür existiert unter F:\wxWidgets-3.2.2.1\build\msw eine datei wx_vc17.sln, die wir mit VS 2022 öffnen.
In der entstehenden Projektmappe "wx_vc17" wählen wir "Release" und "x64" als Konfiguration und erstellen die Projektmappe (F7). Bitte etwas Geduld bewahren, denn nun werden viele Files verarbeitet. Zum Schluss finden wir ein neu erstelltes Verzeichnis F:\wxWidgets-3.2.2.1\lib\vc_x64_lib. Wir erstellen auf diese Weise statische Bibliotheken.

Damit steht uns nun wxWidgets zur Verfügung, und wir können unser erstes Windows-Programm mit wxWidgets und C++ erstellen:

Wir legen mit VS 2022 ein neues leeres C++-Projekt an. Ich lege Projektmappe und Projekt ins selbe Verzeichnis.
Der Name des Projektes: "wxWidgets001".
Mein Ort: Y:\Projects

Wir fügen nun unter Quelldateien eine neue Datei namens "main.cpp" ein.

Als kleines Lehrbeispiel verwenden wir: https://docs.wxwidgets.org/trunk/overview_helloworld.html

Der Inhalt dieses Programms, das man ganz unten auf der Website findet, lautet:

// wxWidgets "Hello World" Program

// For compilers that support precompilation, includes "wx/wx.h".
#include <wx/wxprec.h>

#ifndef WX_PRECOMP
    #include <wx/wx.h>
#endif

class MyApp : public wxApp
{
    public:
    virtual bool OnInit();
};

class MyFrame : public wxFrame
{
  public:   
    MyFrame();

  private:
    void OnHello(wxCommandEvent& event);
    void OnExit(wxCommandEvent& event);
    void OnAbout(wxCommandEvent& event);
};

enum
{
    ID_Hello = 1
};

wxIMPLEMENT_APP(MyApp);

bool MyApp::OnInit()
{
    MyFrame* frame = new MyFrame();
    frame->Show(true);
    return true;
}

MyFrame::MyFrame()
: wxFrame(nullptr, wxID_ANY, "Hello World")
{
    wxMenu* menuFile = new wxMenu;
    menuFile->Append(ID_Hello, "&Hello...\tCtrl-H",
    "Help string shown in status bar for this menu item");
    menuFile->AppendSeparator();
    menuFile->Append(wxID_EXIT);

    wxMenu* menuHelp = new wxMenu;
    menuHelp->Append(wxID_ABOUT);

    wxMenuBar* menuBar = new wxMenuBar;
    menuBar->Append(menuFile, "&File");
    menuBar->Append(menuHelp, "&Help");

    SetMenuBar(menuBar);

    CreateStatusBar();
    SetStatusText("Welcome to wxWidgets!");

    Bind(wxEVT_MENU, &MyFrame::OnHello, this, ID_Hello);
    Bind(wxEVT_MENU, &MyFrame::OnAbout, this, wxID_ABOUT);
    Bind(wxEVT_MENU, &MyFrame::OnExit, this, wxID_EXIT);
}

void MyFrame::OnExit(wxCommandEvent& event)
{
    Close(true);
}

void MyFrame::OnAbout(wxCommandEvent& event)
{
    wxMessageBox("This is a wxWidgets Hello World example",
    "About Hello World", wxOK | wxICON_INFORMATION);
}

void MyFrame::OnHello(wxCommandEvent& event)
{
    wxLogMessage("Hello world from wxWidgets!");
}

 

Nun binden wir die Include- und Bibliotheksverzeichnisse von wxWidgets ein.

Man rechts-klickt dazu auf wxWidgets001 (fett gedruckt) und wählt Eigenschaften.
Nun müssen wir an drei Stellen etwas eingeben/ändern:

1) VC++-Verzeichnisse - Externe Includeverzeichnisse: $(VC_IncludePath);$(WindowsSDK_IncludePath);F:\wxWidgets-3.2.2.1\include;F:\wxWidgets-3.2.2.1\include\msvc; 

2) VC++-Verzeichnisse - Bibliotheksverzeichnisse: $(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);F:\wxWidgets-3.2.2.1\lib\vc_x64_lib

3) Linker - System: Windows (/SUBSYSTEM:WINDOWS)

Bitte darauf achten, dass bei den Eingaben immer "Release" und "Aktiv(x64)" als Konfiguration eingestellt ist und dass die Eingaben mit OK bestätigt sind.

 

Nun kann man das Programm mit F7 erstellen:

Neuerstellen gestartet...
1>------ Neues Erstellen gestartet: Projekt: wxWidgets001, Konfiguration: Release x64 ------
1>main.cpp
1>Code wird generiert.
1>Previous IPDB not found, fall back to full compilation.
1>All 346 functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
1>Codegenerierung ist abgeschlossen.
1>wxWidgets001.vcxproj -> Y:\Projects\wxWidgets001\x64\Release\wxWidgets001.exe
========== Alle neu erstellen: 1 erfolgreich, 0 fehlgeschlagen, 0 übersprungen ==========
========== Neu erstellen wurde am ... gestartet und dauerte ... Sekunden ==========

Das erstellte Programm findet sich unter: Y:\Projects\wxWidgets001\x64\Release\wxWidgets001.exe und hat aufgrund des statischen Linkens eine Größe von 4229 KB. Als Vorteil benötigen wir keine passende DLL. Die berühmte DLL-Hölle bleibt uns erspart.

Hoffentlich ist auch in Ihrem Fall die exe entstanden und grüßt Sie mit dem Titel "Hello World".