原文: http://zetcode.com/gui/wxwidgets/firstprograms/

在本章中,我们将介绍创建 wxWidgets 应用所需的基础知识。 我们将创建第一个简单示例,展示如何显示图标。 接下来,我们将创建一个简单的示例来演示事件的用法。 最后,我们将看到小部件如何在 wxWidgets 应用中进行通信。

一个简单的应用

首先,我们创建非常基本的 wxWidgets 程序。

simple.h

  1. #include <wx/wx.h>
  2. class Simple : public wxFrame
  3. {
  4. public:
  5. Simple(const wxString& title);
  6. };

simple.cpp

  1. #include "simple.h"
  2. Simple::Simple(const wxString& title)
  3. : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150))
  4. {
  5. Centre();
  6. }

main.h

  1. #include <wx/wx.h>
  2. class MyApp : public wxApp
  3. {
  4. public:
  5. virtual bool OnInit();
  6. };

main.cpp

  1. #include "main.h"
  2. #include "simple.h"
  3. IMPLEMENT_APP(MyApp)
  4. bool MyApp::OnInit()
  5. {
  6. Simple *simple = new Simple(wxT("Simple"));
  7. simple->Show(true);
  8. return true;
  9. }

这个非常基本的示例在屏幕上显示了一个小窗口。 窗口居中。

  1. Centre();

此方法使窗口在屏幕上水平和垂直居中。

  1. IMPLEMENT_APP(MyApp)

实现该应用的代码隐藏在此宏的后面。 这是复制和粘贴代码,我们通常不必关心。

  1. g++ main.cpp main.h simple.cpp simple.h `wx-config --cxxflags --libs` -o simple

要在 Unix 上编译示例,请运行以上命令。

wxWidgets 中的第一个程序 - 图1

图:简单

应用图标

在此示例中,我们为应用提供一个图标。 在窗口的左上角显示小图标已成为一种标准。 图标是程序的图形标识。

icon.h

  1. #include <wx/wx.h>
  2. class Icon : public wxFrame
  3. {
  4. public:
  5. Icon(const wxString& title);
  6. };

icon.cpp

  1. #include "icon.h"
  2. Icon::Icon(const wxString& title)
  3. : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150))
  4. {
  5. SetIcon(wxIcon(wxT("web.xpm")));
  6. Centre();
  7. }

main.h

  1. #include <wx/wx.h>
  2. class MyApp : public wxApp
  3. {
  4. public:
  5. virtual bool OnInit();
  6. };

main.cpp

  1. #include "main.h"
  2. #include "icon.h"
  3. IMPLEMENT_APP(MyApp)
  4. bool MyApp::OnInit()
  5. {
  6. Icon *icon = new Icon(wxT("Icon"));
  7. icon->Show(true);
  8. return true;
  9. }

在我们的示例中,我们显示了一个小的 Web 图标。

  1. SetIcon(wxIcon(wxT("web.xpm")));

显示应用图标仅需一行代码。 XPM(X PixMap)是 ASCII 图像格式。

wxWidgets 中的第一个程序 - 图2

图:图标

一个简单的按钮

在下面的示例中,我们在框架小部件上创建一个按钮。 我们将展示如何创建一个简单的事件处理器。

button.h

  1. #include <wx/wx.h>
  2. class Button : public wxFrame
  3. {
  4. public:
  5. Button(const wxString& title);
  6. void OnQuit(wxCommandEvent & event);
  7. };

button.cpp

  1. #include "button.h"
  2. Button::Button(const wxString& title)
  3. : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(270, 150))
  4. {
  5. wxPanel *panel = new wxPanel(this, wxID_ANY);
  6. wxButton *button = new wxButton(panel, wxID_EXIT, wxT("Quit"),
  7. wxPoint(20, 20));
  8. Connect(wxID_EXIT, wxEVT_COMMAND_BUTTON_CLICKED,
  9. wxCommandEventHandler(Button::OnQuit));
  10. button->SetFocus();
  11. Centre();
  12. }
  13. void Button::OnQuit(wxCommandEvent & WXUNUSED(event))
  14. {
  15. Close(true);
  16. }

main.h

  1. #include <wx/wx.h>
  2. class MyApp : public wxApp
  3. {
  4. public:
  5. virtual bool OnInit();
  6. };

main.cpp

  1. #include "main.h"
  2. #include "button.h"
  3. IMPLEMENT_APP(MyApp)
  4. bool MyApp::OnInit()
  5. {
  6. Button *btnapp = new Button(wxT("Button"));
  7. btnapp->Show(true);
  8. return true;
  9. }
  1. wxPanel *panel = new wxPanel(this, wxID_ANY);

首先,我们创建一个wxPanel小部件。 它将放置在wxFrame小部件内。

  1. wxButton *button = new wxButton(panel, wxID_EXIT, wxT("Quit"), wxPoint(20, 20));

我们创建一个wxButton小部件。 它放在面板上。 我们为按钮使用预定义的wxID_EXIT ID。 这将导致在按钮上显示一个小的退出图标。 按钮的标签为"Quit"。 手动将按钮定位在x = 20y = 20坐标处。 坐标系的起点在左上角。

  1. Connect(wxID_EXIT, wxEVT_COMMAND_BUTTON_CLICKED,
  2. wxCommandEventHandler(Button::OnQuit));

如果单击按钮,将生成wxEVT_COMMAND_BUTTON_CLICKED事件。 我们将事件连接到Button类的OnQuit()方法。 因此,当我们单击按钮时,将调用OnQuit()方法。

  1. button->SetFocus();

我们将键盘焦点设置为按钮。 因此,如果我们按Enter键,则单击该按钮。

  1. Close(true);

OnQuit()方法内部,我们称为Close()方法。 这将终止我们的应用。

wxWidgets 中的第一个程序 - 图3

图:按钮

小部件通信

了解小部件如何在应用中进行通信非常重要。 请遵循下一个示例。

Panels.h

  1. #include <wx/wx.h>
  2. #include <wx/panel.h>
  3. class LeftPanel : public wxPanel
  4. {
  5. public:
  6. LeftPanel(wxPanel *parent);
  7. void OnPlus(wxCommandEvent & event);
  8. void OnMinus(wxCommandEvent & event);
  9. wxButton *m_plus;
  10. wxButton *m_minus;
  11. wxPanel *m_parent;
  12. int count;
  13. };
  14. class RightPanel : public wxPanel
  15. {
  16. public:
  17. RightPanel(wxPanel *parent);
  18. void OnSetText(wxCommandEvent & event);
  19. wxStaticText *m_text;
  20. };
  21. const int ID_PLUS = 101;
  22. const int ID_MINUS = 102;

Panels.cpp

  1. #include <wx/stattext.h>
  2. #include "Communicate.h"
  3. LeftPanel::LeftPanel(wxPanel * parent)
  4. : wxPanel(parent, -1, wxPoint(-1, -1), wxSize(-1, -1), wxBORDER_SUNKEN)
  5. {
  6. count = 0;
  7. m_parent = parent;
  8. m_plus = new wxButton(this, ID_PLUS, wxT("+"),
  9. wxPoint(10, 10));
  10. m_minus = new wxButton(this, ID_MINUS, wxT("-"),
  11. wxPoint(10, 60));
  12. Connect(ID_PLUS, wxEVT_COMMAND_BUTTON_CLICKED,
  13. wxCommandEventHandler(LeftPanel::OnPlus));
  14. Connect(ID_MINUS, wxEVT_COMMAND_BUTTON_CLICKED,
  15. wxCommandEventHandler(LeftPanel::OnMinus));
  16. }
  17. void LeftPanel::OnPlus(wxCommandEvent & WXUNUSED(event))
  18. {
  19. count++;
  20. Communicate *comm = (Communicate *) m_parent->GetParent();
  21. comm->m_rp->m_text->SetLabel(wxString::Format(wxT("%d"), count));
  22. }
  23. void LeftPanel::OnMinus(wxCommandEvent & WXUNUSED(event))
  24. {
  25. count--;
  26. Communicate *comm = (Communicate *) m_parent->GetParent();
  27. comm->m_rp->m_text->SetLabel(wxString::Format(wxT("%d"), count));
  28. }
  29. RightPanel::RightPanel(wxPanel * parent)
  30. : wxPanel(parent, wxID_ANY, wxDefaultPosition,
  31. wxSize(270, 150), wxBORDER_SUNKEN)
  32. {
  33. m_text = new wxStaticText(this, -1, wxT("0"), wxPoint(40, 60));
  34. }

Communicate.h

  1. #include "Panels.h"
  2. #include <wx/wxprec.h>
  3. class Communicate : public wxFrame
  4. {
  5. public:
  6. Communicate(const wxString& title);
  7. LeftPanel *m_lp;
  8. RightPanel *m_rp;
  9. wxPanel *m_parent;
  10. };

Communicate.cpp

  1. #include "Communicate.h"
  2. Communicate::Communicate(const wxString& title)
  3. : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(290, 150))
  4. {
  5. m_parent = new wxPanel(this, wxID_ANY);
  6. wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL);
  7. m_lp = new LeftPanel(m_parent);
  8. m_rp = new RightPanel(m_parent);
  9. hbox->Add(m_lp, 1, wxEXPAND | wxALL, 5);
  10. hbox->Add(m_rp, 1, wxEXPAND | wxALL, 5);
  11. m_parent->SetSizer(hbox);
  12. this->Centre();
  13. }

main.h

  1. #include <wx/wx.h>
  2. class MyApp : public wxApp
  3. {
  4. public:
  5. virtual bool OnInit();
  6. };

main.cpp

  1. #include "main.h"
  2. #include "Communicate.h"
  3. IMPLEMENT_APP(MyApp)
  4. bool MyApp::OnInit()
  5. {
  6. Communicate *communicate = new Communicate(wxT("Widgets communicate"));
  7. communicate->Show(true);
  8. return true;
  9. }

在我们的示例中,我们有两个面板。 左右面板。 左侧面板有两个按钮。 右侧面板有一个静态文本。 这些按钮更改静态文本中显示的数字。 问题是,我们如何抓住指向静态文本的指针?

  1. m_parent = parent;

在这里,我们将指针保存到LeftPanel的父窗口小部件。 这是一个wxPanel小部件。

  1. Communicate *comm = (Communicate *) m_parent->GetParent();
  2. comm->m_rp->m_text->SetLabel(wxString::Format(wxT("%d"), count));

这两行是示例中最重要的行。 显示了如何访问放置在不同面板上的静态文本小部件。 首先,我们获得左右两个面板的父面板。 该父窗口小部件具有指向右侧面板的指针。 右面板上有一个指向静态文本的指针。

wxWidgets 中的第一个程序 - 图4

图:小部件通信

在 wxWidgets 教程的这一部分中,我们创建了一些简单的程序。