Третья программа на wxWidgets

2009-07-03T09:00:00+07:00

В прошлый раз мы остановились на простенькой программке в одну кнопку и один текстовый блок. Пора добавить одно текстовое поле.

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

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

wxEmptyString - это строка, которая стоит в текстовом поле по умолчанию - при запуске программы и при вызове метода Question->Clear().
wxSize(25,20) - это размер текстового поля.

Теперь - к усовершенствованиям.Добавьте после 40й строки ещё две:

Question -> SetMaxLength(2);
Question -> SetValidator(wxTextValidator(wxFILTER_NUMERIC));

Что это даёт? Это иллюстрирует ограничения на ввод. Первое ограничение говорит о том,что ввести можно лишь 2 символа. Второе ограничение - то,что эти символы могут быть только цифрами. Здесь необходимо сделать замечание: при обработке методом Question->GetValue() библиотека возвращает wxString - значение поля. Но числа можно задать разными способами: это может быть обычная нотация,как 1, 2, 3 и так далее, это может быть 3.14, или 3,14, или 3e+13. Таким образом, на деле в нашем текстовом поле может оказаться не только цифра.

Чтобы считать число из поля и записать его в переменную, удобно писать такую конструкцию: if (!(Question->GetValue()).ToLong(&variable,10)){…}, где на месте обрабатывается случай, когда значение Question не удалось преобразовать в десятичное число.

Но я отвлёкся к частному случаю. Если с maxLength всё более или менее понятно, про валидаторы можно рассказать подробнее. Валидаторы, как вы уже поняли, служат для разнообразных ограничений ввода.В базовом варианте они проверяют нажатия клавиш и блокируют недопустимые. Есть много стандартных валидаторов, которые используются в самых простых случаях; также можно описать свой, если, например, вам нужны только буквы А,В,С,Е,Н,Й,М и Ψ. Это уже отдельная тема, не буду отвлекаться настолько сильно.

Что же мы получили сейчас? Программу с одним текстовым блоком, одним текстовым полем и одной кнопкой. Помнится, я именно из такого набора составлял графическую версию ”Магического Шара”. Более того: до фига моих лабораторок за 3й курс сводились к приёму и обработке параметров, это реализуется так же просто. Ну, или этот набор годится для кроссплатформенного кейгена (ни разу не встречал ничего подобного, но это просто фантазии).

Поэтому пока что закончу серию. Простейшая программа готова и работоспособна.Что ещё осталось сказать? “Ура!”