Skip to main content

wxWidgets: Adding menu and status bar

Steps to add menu:

  1. Define IDs for our menu items
    enum
    {
    ID_QUIT,
    ID_ABOUT,
    ID_POPUP
    };

  2. Create instances of wxMenu inside the constructor of the main windows
    wxMenu *MenuFile = new wxMenu;
    MenuFile->Append( ID_ABOUT , _T("&About"));
    MenuFile->Append( ID_QUIT , _T("&Quit"));

    wxMenu *MenuData = new wxMenu;
    MenuData->Append( ID_POPUP , _T( "Another &Form"));

  3. Create an instance of wxMenuBar
    wxMenuBar *MenuBar = new wxMenuBar;

  4. Add our instances of wxMenus to the menubar
    MenuBar->Append( MenuFile , _T("&File") );
    MenuBar->Append( MenuData , _T("&Data") );

  5. Assign the menubar to the main windows
    this->SetMenuBar( MenuBar);
  6. Declare event function in our main windows class declaration
    class MainWindow: public wxFrame
    {
    public:
    MainWindow(const wxString& title , const wxPoint& pos , const wxSize& size );
    void MenuClickQuit( wxCommandEvent& event);
    void MenuClickAbout( wxCommandEvent& event);
    void MenuClickPopup( wxCommandEvent& event);

    DECLARE_EVENT_TABLE()
    };
    Don't forget to put the magic macro: DECLARE_EVENT_TABLE()
  7. Write implementation of the event functions.
    void MainWindow::MenuClickQuit( wxCommandEvent& event)
    {
    cout << "Quit\n"; this->Close( TRUE );
    }

    void MainWindow::MenuClickAbout( wxCommandEvent& event)
    {
    wxMessageBox( _T("Learning wxWidgets") , _T( "About" ), wxOK | wxCANCEL | wxICON_INFORMATION , this );
    }

    void MainWindow::MenuClickPopup( wxCommandEvent& event)
    {
    FormData *f = new FormData( this , _T("FormData"), wxPoint(-1,-1) , wxSize(-1,-1) );
    f->Show( TRUE);
    }
    ...and again a magic macro which glues our event to the system:
    BEGIN_EVENT_TABLE( MainWindow , wxFrame)
    EVT_MENU( ID_QUIT , MainWindow::MenuClickQuit)
    EVT_MENU( ID_ABOUT , MainWindow::MenuClickAbout )
    EVT_MENU( ID_POPUP , MainWindow::MenuClickPopup )
    END_EVENT_TABLE()

In our MenuClickPopup event we create a child form. We pass the main window as it's parent in the first parameter. By doing so, if the main window is closed, the child windows will be all closed to.

Here is the complete source:

#include <wx/wx.h>
#include <iostream>
using namespace std;

enum
{
ID_QUIT,
ID_ABOUT,
ID_POPUP
};

// Create our Application class derived from wxApp
class MyApp: public wxApp
{
public:
bool OnInit(); // have to override onInit
};

class MainWindow: public wxFrame
{
public:
MainWindow(const wxString& title , const wxPoint& pos , const wxSize& size );
void MenuClickQuit( wxCommandEvent& event);
void MenuClickAbout( wxCommandEvent& event);
void MenuClickPopup( wxCommandEvent& event);

DECLARE_EVENT_TABLE()
};

class FormData : public wxFrame
{
public:
FormData( wxWindow* Parent,const wxString& Title , const wxPoint& Pos , const wxSize& size);
};


MainWindow::MainWindow(const wxString& title , const wxPoint& pos , const wxSize& size )
: wxFrame( NULL, -1, title, pos, size)
{
this->Show( TRUE);
wxMenu *MenuFile = new wxMenu;
MenuFile->Append( ID_ABOUT , _T("&About"));
MenuFile->Append( ID_QUIT , _T("&Quit"));

wxMenu *MenuData = new wxMenu;
MenuData->Append( ID_POPUP , _T( "Another &Form"));

wxMenuBar *MenuBar = new wxMenuBar;
MenuBar->Append( MenuFile , _T("&File") );
MenuBar->Append( MenuData , _T("&Data") );
this->SetMenuBar( MenuBar);

// status bar
this->CreateStatusBar();
this->SetStatusText( _T("Bambang is learning wxWidgets") );
};

bool MyApp::OnInit()
{
cout << "start\n";
MainWindow *mainFrame = new MainWindow( _T("Hello empty world"),wxPoint(-1,-1),wxSize(-1,-1));
this->SetTopWindow( mainFrame);
//mainFrame->Show( TRUE);
return TRUE;
};

void MainWindow::MenuClickQuit( wxCommandEvent& event)
{
cout << "Quit\n";
this->Close( TRUE );
}

void MainWindow::MenuClickAbout( wxCommandEvent& event)
{
wxMessageBox( _T("Learning wxWidgets") , _T( "About" ), wxOK | wxCANCEL | wxICON_INFORMATION , this );
}

void MainWindow::MenuClickPopup( wxCommandEvent& event)
{
FormData *f = new FormData( this , _T("FormData"), wxPoint(-1,-1) , wxSize(-1,-1) );
f->Show( TRUE);
}



FormData::FormData( wxWindow* Parent,const wxString& Title , const wxPoint& Pos , const wxSize& Size)
: wxFrame( Parent , -1, Title , Pos, Size)
{
};

IMPLEMENT_APP(MyApp);

BEGIN_EVENT_TABLE( MainWindow , wxFrame)
EVT_MENU( ID_QUIT , MainWindow::MenuClickQuit)
EVT_MENU( ID_ABOUT , MainWindow::MenuClickAbout )
EVT_MENU( ID_POPUP , MainWindow::MenuClickPopup )
END_EVENT_TABLE()

Comments

  1. Previewnya om... biar ada semangat ikut mencobaaaa

    ReplyDelete
  2. Maksudnya, screenshotnya? ini masih windows kosong dengan menu bar.... masih belum menarik

    ReplyDelete

Post a Comment

Popular posts from this blog

Program timbangan elektronik, sebuah program Windows yang dijalankan di Linux.

Kemarin, mumpung hari libur aku setup program timbangan digital baru di kantor. Program yang lama merupakan program DOS yang aku tulis dengan menggunakan Clipper, program ini berjalan dengan baik di linux dengan bantuan dosemu. Program baru merupakan program Windows. Salah satu improvement dalam program ini adalah support untuk beberapa jenis indikator. Program diinstall di linux dengan wine versi 1.1.20. Beberapa catatan dalam instalasi program ini di wine: Pencetakan slip bukti timbangan dan laporan-2 menggunakan printer Dot Matrix. Apabila pencetakan dilakukan lewat printer driver, pencetakan dengan printer dot matrix akan menjadi sangat lambat plus hasil buruk plus boros pita... :) Oleh karena itu, program ini melakukan pencetakan langsung melalui printer port lpt1. Di windows, hal ini tidak menjadi suatu permasalahan, di linux dengan wine, maka lpt1 akan dimap ke /dev/lp0. Masalahnya, owner dari device ini adalah root dan group lp. Secara default user-user di Ubuntu (..nggak tahu...

Menjalankan e-spt di linux.

Dirjen pajak belakangan ini mensosialisasikan e-spt yaitu program aplikasi komputer yang dipergunakan untuk pelaporan pajak (spt). Namun salah satu kendala besar bagi perusahaan-perusahaan menggunakan linux adalah bahwa program-program e-spt ini didesign hanya untuk komputer-komputer dengan O/S windows. Apakah kita harus mengorbankan sebuah komputer khusus plus o/s Windows hanya khusus untuk aplikasi e-spt ini? Untungnya, jawabannya adalah tidak, Wine (http://www.winehq.org) adalah sahabat anda. Bagaimana langkah-langkahnya? Install wine. Install komponen-komponen windows dengan bantuan winetricks Download dan install program e-spt Set format tanggal Wine sesuai dengan format tanggal Indonesia Detail langkah-langkah di atas adalah sbb: Install wine. Secara garis besar ada 2 cara untuk menginstall Wine: Install package binary Install dari source Cara paling mudah dan cepat adalah dengan menginstall package binary. Namun, metode ini mempunyai beberapa kelemahan: Package yang terinstall s...

Install Windows Printer Fuji Xerox DocuPrint P205 b di Ubuntu

Kemarin ada yang baik hati memberikan aku printer laser Fuji Xerox type DocPrint P205b. Masalahnya, printing system di Ubuntu (CUPS) tidak ada driver untuk printer ini. Situs Fuji Xerox pun ( http://www.fujixeroxprinters.com.au/en/Downloads.aspx?product=9933 ) tidak menyediakan printer driver untuk linux, karena ternyata printer ini adalah GDI printer. GDI printer biasanya merupakan printer murah meriah, karena dia tidak mempunyai 'otak' untuk memproses image (rasterize). Pemrosesan image diserahkan ke operating system. Oleh karena itu printer-printer semacam ini biasanya hanya bisa dipakai di Windows saja. Namun, dunia linux benar-benar menakjubkan – hampir tidak ada yang mustahil di linux. Setelah searching di internet, akhirnya aku menemukan sebuah situs yang menyediakan driver untuk printer ini, namun untuk menginstallnya tidak sekedar mengcopy file drivernya (.ppd) saja. Silahkan cek http://foo2hbpl.rkkda.com/ . Di bawah ini adalah langkah-langkah untuk mengi...