Редактирование: WxWidgets FAQ First Programs

Материал из Wiki.crossplatform.ru

Перейти к: навигация, поиск
Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
 +
In this chapter, we will cover the basics needed to create wxWidgets applications.
 +
We will create our first simple example, show how to display an icon. Next we will create a simple example demonstrating usage of an event. Finally, we will see, how widgets communicate in wxWidgets applications.
 +
== A simple application ==
 +
First we create the very basic wxWidgets program.
 +
<source lang="cpp">
 +
#include &lt;wx/wx.h&gt;
 +
 +
class Simple : public wxFrame
 +
{
 +
public:
 +
    Simple(const wxString&amp; title);
 +
 +
};
 +
</source>
 +
 +
<source lang="cpp">
 +
#include "simple.h"
 +
 +
Simple::Simple(const wxString&amp; title)
 +
      : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150))
 +
{
 +
  Centre();
 +
}
 +
</source>
 +
 +
<source lang="cpp">
 +
#include &lt;wx/wx.h&gt;
 +
 +
class MyApp : public wxApp
 +
{
 +
  public:
 +
    virtual bool OnInit();
 +
};
 +
 +
</source>
 +
 +
<source lang="cpp">
 +
#include "main.h"
 +
#include "simple.h"
 +
 +
IMPLEMENT_APP(MyApp)
 +
 +
bool MyApp::OnInit()
 +
{
 +
    Simple *simple = new Simple(wxT("Simple"));
 +
    simple->Show(true);
 +
 +
    return true;
 +
}
 +
 +
</source>
 +
 +
This very basic example shows a small window on the screen. The window is centered.
 +
 +
<source lang="cpp">
 +
Centre();
 +
</source>
 +
 +
This method centers the window on the screen. Both horizontally and vertically.
 +
 +
<source lang="cpp">
 +
IMPLEMENT_APP(MyApp)
 +
</source>
 +
 +
The code that implements the application is hidden behind this macro. This is copy and paste code, we usually don't have to care about.
 +
 +
To compile the example, run the following command. (On Unix).
 +
 +
<source lang="cpp">
 +
g++ main.cpp main.h simple.cpp simple.h  `wx-config --cxxflags --libs` -o simple
 +
</source>
 +
 +
[[image: wxwidgets_faq_simple.png | center]]
 +
 +
== Showing an application icon ==
 +
In this example, we provide an icon for our application. It became a standard to display a small icon in the upper left corner of the window. The icon is a graphical identity of the program.
 +
 +
<source lang="cpp">
 +
#include &lt;wx/wx.h&gt;
 +
 +
class Icon : public wxFrame
 +
{
 +
public:
 +
    Icon(const wxString& title);
 +
 +
};
 +
 +
</source>
 +
 +
<source lang="cpp">
 +
 +
#include "icon.h"
 +
 +
Icon::Icon(const wxString& title)
 +
      : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150))
 +
{
 +
  SetIcon(wxIcon(wxT("web.xpm")));
 +
  Centre();
 +
}
 +
 +
</source>
 +
 +
<source lang="cpp">
 +
#include &lt;wx/wx.h&gt;
 +
 +
class MyApp : public wxApp
 +
{
 +
  public:
 +
    virtual bool OnInit();
 +
};
 +
 +
</source>
 +
 +
<source lang="cpp">
 +
 +
#include "main.h"
 +
#include "icon.h"
 +
 +
IMPLEMENT_APP(MyApp)
 +
 +
bool MyApp::OnInit()
 +
{
 +
    Icon *icon = new Icon(wxT("Icon"));
 +
    icon->Show(true);
 +
 +
    return true;
 +
}
 +
 +
</source>
 +
 +
In our example we show a small web icon.
 +
 +
<source lang="cpp">
 +
  SetIcon(wxIcon(wxT("web.xpm")));
 +
</source>
 +
 +
To display an application icon is a matter of one code line.
 +
XPM (X PixMap) is an ASCII image format.
 +
 +
[[image: wxwidgets_faq_icon.jpg | center]]
 +
 +
== A simple button ==
 +
In the following example, we create a button on the frame widget. We will show, how to create a simple event handler.
 +
<source lang="cpp">
 +
 +
#include &lt;wx/wx.h&gt;
 +
 +
class Button : public wxFrame
 +
{
 +
public:
 +
    Button(const wxString& title);
 +
 +
    void OnQuit(wxCommandEvent & event);
 +
};
 +
 +
</source>
 +
 +
<source lang="cpp">
 +
#include "button.h"
 +
 +
Button::Button(const wxString& title)
 +
      : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(270, 150))
 +
{
 +
  wxPanel *panel = new wxPanel(this, wxID_ANY);
 +
 +
  wxButton *button = new wxButton(panel, wxID_EXIT, wxT("Quit"),
 +
      wxPoint(20, 20));
 +
  Connect(wxID_EXIT, wxEVT_COMMAND_BUTTON_CLICKED,
 +
      wxCommandEventHandler(Button::OnQuit));
 +
  button->SetFocus();
 +
  Centre();
 +
}
 +
 +
void Button::OnQuit(wxCommandEvent & WXUNUSED(event))
 +
{
 +
    Close(true);
 +
}
 +
 +
</source>
 +
 +
<source lang="cpp">
 +
#include &lt;wx/wx.h&gt;
 +
 +
class MyApp : public wxApp
 +
{
 +
  public:
 +
    virtual bool OnInit();
 +
};
 +
 +
</source>
 +
 +
<source lang="cpp">
 +
#include "main.h"
 +
#include "button.h"
 +
 +
IMPLEMENT_APP(MyApp)
 +
 +
bool MyApp::OnInit()
 +
{
 +
 +
    Button *btnapp = new Button(wxT("Button"));
 +
    btnapp->Show(true);
 +
 +
    return true;
 +
}
 +
 +
</source>
 +
 +
<source lang="cpp">
 +
wxPanel *panel = new wxPanel(this, wxID_ANY);
 +
</source>
 +
 +
First we create a <i>wxPanel</i> widget. It will be placed inside a <i>wxFrame</i> widget.
 +
 +
<source lang="cpp">
 +
wxButton *button = new wxButton(panel, wxID_EXIT, wxT("Quit"), wxPoint(20, 20));
 +
 +
</source>
 +
 +
We create a <i>wxButton</i> widget. It is placed on the panel. We use the predefined <i>wxID_EXIT</i> id for the button.
 +
It will cause to display a small exit icon on the button. The label of the button is "Quit". The button is positioned manually at x=20, y=20 coordinates. The beginning of the coordinate system is at the upper left hand corner.
 +
 +
<source lang="cpp">
 +
Connect(wxID_EXIT, wxEVT_COMMAND_BUTTON_CLICKED,
 +
    wxCommandEventHandler(Button::OnQuit));
 +
</source>
 +
 +
If we click on the button, a <i>wxEVT_COMMAND_BUTTON_CLICKED</i> event is generated. We connect the event to the <i>OnQuit()</i> method of the Button class. So when we click on the button, the OnQuit() method is called.
 +
 +
<source lang="cpp">
 +
button->SetFocus();
 +
</source>
 +
 +
We set the keyboard focus to the button. So if we press the enter key, the button is being clicked.
 +
 +
<source lang="cpp">
 +
Close(true);
 +
</source>
 +
 +
Inside the OnQuit() method, we call the <i>Close()</i> method. This will terminate our application.
 +
 +
[[image: wxwidgets_faq_button.jpg | center]]
 +
 +
== Widgets communicate ==
 +
It is important to know, how widgets can communicate in application. Follow the next example.
 +
<source lang="cpp">
 +
#include &lt;wx/wx.h&gt;
 +
 +
#include &lt;wx/panel.h&gt;
 +
 +
class LeftPanel : public wxPanel
 +
{
 +
public:
 +
    LeftPanel(wxPanel *parent);
 +
 +
    void OnPlus(wxCommandEvent & event);
 +
    void OnMinus(wxCommandEvent & event);
 +
 +
    wxButton *m_plus;
 +
    wxButton *m_minus;
 +
    wxPanel *m_parent;
 +
    int count;
 +
 +
};
 +
 +
class RightPanel : public wxPanel
 +
{
 +
public:
 +
    RightPanel(wxPanel *parent);
 +
 +
    void OnSetText(wxCommandEvent & event);
 +
 +
    wxStaticText *m_text;
 +
 +
};
 +
 +
const int ID_PLUS = 101;
 +
const int ID_MINUS = 102;
 +
 +
</source>
 +
 +
<source lang="cpp">
 +
#include &lt;wx/stattext.h&gt;
 +
#include "Communicate.h"
 +
 +
LeftPanel::LeftPanel(wxPanel * parent)
 +
      : wxPanel(parent, -1, wxPoint(-1, -1), wxSize(-1, -1), wxBORDER_SUNKEN)
 +
{
 +
  count = 0;
 +
  m_parent = parent;
 +
  m_plus = new wxButton(this, ID_PLUS, wxT("+"),
 +
      wxPoint(10, 10));
 +
  m_minus = new wxButton(this, ID_MINUS, wxT("-"),
 +
      wxPoint(10, 60));
 +
  Connect(ID_PLUS, wxEVT_COMMAND_BUTTON_CLICKED,
 +
      wxCommandEventHandler(LeftPanel::OnPlus));
 +
  Connect(ID_MINUS, wxEVT_COMMAND_BUTTON_CLICKED,
 +
      wxCommandEventHandler(LeftPanel::OnMinus));
 +
}
 +
 +
void LeftPanel::OnPlus(wxCommandEvent & WXUNUSED(event))
 +
{
 +
  count++;
 +
 +
  Communicate *comm = (Communicate *) m_parent->GetParent();
 +
  comm->m_rp->m_text->SetLabel(wxString::Format(wxT("%d"), count));
 +
}
 +
 +
void LeftPanel::OnMinus(wxCommandEvent & WXUNUSED(event))
 +
{
 +
  count--;
 +
 +
  Communicate *comm = (Communicate *) m_parent->GetParent();
 +
  comm->m_rp->m_text->SetLabel(wxString::Format(wxT("%d"), count));
 +
}
 +
 +
 +
RightPanel::RightPanel(wxPanel * parent)
 +
      : wxPanel(parent, wxID_ANY, wxDefaultPosition,
 +
        wxSize(270, 150), wxBORDER_SUNKEN)
 +
{
 +
    m_text = new wxStaticText(this, -1, wxT("0"), wxPoint(40, 60));
 +
}
 +
 +
 +
</source>
 +
 +
 +
<source lang="cpp">
 +
#include "Panels.h"
 +
#include &lt;wx/wxprec.h&gt;
 +
 +
 +
class Communicate : public wxFrame
 +
{
 +
public:
 +
    Communicate(const wxString& title);
 +
 +
 +
    LeftPanel *m_lp;
 +
    RightPanel *m_rp;
 +
    wxPanel *m_parent;
 +
 +
};
 +
 +
</source>
 +
 +
 +
<source lang="cpp">
 +
 +
#include "Communicate.h"
 +
 +
 +
Communicate::Communicate(const wxString& title)
 +
      : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(290, 150))
 +
{
 +
  m_parent = new wxPanel(this, wxID_ANY);
 +
 +
  wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL);
 +
 +
  m_lp = new LeftPanel(m_parent);
 +
  m_rp = new RightPanel(m_parent);
 +
 +
  hbox->Add(m_lp, 1, wxEXPAND | wxALL, 5);
 +
  hbox->Add(m_rp, 1, wxEXPAND | wxALL, 5);
 +
 +
  m_parent->SetSizer(hbox);
 +
 +
  this->Centre();
 +
}
 +
 +
</source>
 +
 +
<source lang="cpp">
 +
#include &lt;wx/wx.h&gt;
 +
 +
class MyApp : public wxApp
 +
{
 +
  public:
 +
    virtual bool OnInit();
 +
};
 +
 +
</source>
 +
 +
<source lang="cpp">
 +
 +
#include "main.h"
 +
#include "Communicate.h"
 +
 +
IMPLEMENT_APP(MyApp)
 +
 +
bool MyApp::OnInit()
 +
{
 +
 +
    Communicate *communicate = new Communicate(wxT("Widgets communicate"));
 +
    communicate->Show(true);
 +
 +
    return true;
 +
}
 +
 +
</source>
 +
 +
In our example we have two panels. A left and right panel. The left panel has two buttons. The right panel has one static text. The buttons change the number displayed in the static text. The question is, how do we grab the pointer to the static text?
 +
 +
<source lang="cpp">
 +
m_parent = parent;
 +
</source>
 +
 +
Here we save the pointer to the parent widget of the LeftPanel. It is a wxPanel widget.
 +
 +
<source lang="cpp">
 +
Communicate *comm = (Communicate *) m_parent->GetParent();
 +
comm->m_rp->m_text->SetLabel(wxString::Format(wxT("%d"), count));
 +
</source>
 +
 +
These two lines are the most important lines of the example. It is shown, how we get access to the static text widget, which is placed on a different panel. First we get the parent of the both left and right panels. This parent widget has a pointer to the right panel. And the right panel has a pointer to the static text.
 +
 +
[[image: wxwidgets_faq_widgetscommunicate.jpg | center]]
 +
 +
 +
[[Категория:WxWidgets]]

Пожалуйста, обратите внимание, что все ваши добавления могут быть отредактированы или удалены другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Wiki.crossplatform.ru:Авторское право). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!