Вторая программа на wxWidgets

2009-07-02T09:53:00+07:00

Blogger с утра не пускал меня, поэтому пишу пост немного позже ожидаемого.
Продолжаем tutorial, теперь пора добавить немного активности.
Прежде всего - добавить кнопку. Назовём её Pimpa.
Пусть при нажатии на эту кнопку меняется значение нашего текстового поля. Но тогда это поле должно тоже приобрести имя - пусть будет Warning.

1 #include <wx/wx.h>
2
3 class MainApp: public wxApp{
4 public:
5 virtual bool OnInit();
6 };
7
8 enum{
9 BUTTONPimpa = 1
10 };
11
12 class MainFrame: public wxFrame{
13 public:
14 MainFrame( const wxString &title, const wxPoint &pos, const wxSize &size );
15 wxButton *Pimpa;
16 wxStaticText * Warning;
17 void changeText(wxCommandEvent& event){Warning->SetLabel(
T(“А вы нажали на кнопку.”));}
18 private:
19 DECLAREEVENTTABLE()
20 };
21
22 BEGINEVENTTABLE ( MainFrame, wxFrame )
23 EVTBUTTON ( BUTTONPimpa, MainFrame::changeText)
24 ENDEVENTTABLE()
25
26 DECLAREAPP(MainApp)
27 IMPLEMENT
APP(MainApp)
28 bool MainApp::OnInit(){
29 MainFrame *MainWin = new MainFrame(_(“Заголовок окна”), wxDefaultPosition, wxSize(580, 200));
30 MainWin->Show(true);
31 SetTopWindow(MainWin);
32 return true;
33 }
34
35 MainFrame::MainFrame(const wxString& title, const wxPoint& pos, const wxSize& size):wxFrame((wxFrame *) NULL, -1, title, pos, size) {
36 Pimpa = new wxButton(this, BUTTON_Pimpa, _T(“Произвести вычисления”),wxDefaultPosition, wxDefaultSize, 0);
37 Warning = new wxStaticText (this, BUTTON_Pimpa + 1, _T(“Я написал что-то на wxWidgets!!”), wxPoint(10,100), wxDefaultSize,0,wxStaticTextNameStr);
38 }

Скомпилируйте и зацените.А теперь по строкам.
Строки 8-10 задают идентификатор для кнопки. Зачем нужны эти ID, я упоминал уже ранее; теперь же можете посмотреть на строку 23.У этой строки такой смысл: при вызове контрола с ID Button_Pimpa надо звать метод changeText. Обработка событий происходит в закрытой части класса, что логично,а вот метод закрывать необязательно.
Строка 37 даёт ещё одно понятие арифметики идентификаторов. В самом деле, мы же можем взять следующий после кнопки. Есть ещё один трюк - это когда вы пишете wxID_HIGHEST + 1„ это даёт наибольший свободный ID. Ну да не суть важно.
Возможно,у вас ещё давным-давно возник вопрос, почему строковые константы заключены в интересные _T(“”) и _(“”). Это макросы wxWidgets, которые конвертируют строки во внутренний тип wxString. Различие _T() и _ в том,что _T() позволяет включать интернационализацию строки - если вы вздумаете использовать gettext, то вам оно понадобится.
Кстати - здесь я также играю с позициями. Можно запросто поставить в тупик стандартный компоновщик, если прописать обоим контролам wxDefaultPosition. Но чем усложнять программу хаками, лучше сосредоточимся на действительно нужных вещах.

Итак,у нас есть уже кнопка и текстовый блок. Это уже кое-что. Но для какой-либо полезной программы не хватает ещё чего-то…текстового поля. Поля,куда вводятся числовые или строковые параметры.Этим мы и займёмся в следующем выпуске.