Розробка уроку

Тема: введення і виведення даних, вікна повідомлень, їх використання, передавання значень між вікном повідомлення і змінними мовою С++.

Мета:

По завершенню вивчення учень:

Обладнання: комп’ютери зі встановленими ОС та середовищем CodeBlocks для програмування мовою С++ разом з бібліотекою wxWigets.

Структура уроку

  1. Організаційний момент.
  2. Актуалізація опорних знань.
  3. Інструктаж з ТБ.
  4. Вивчення нового матеріалу й вироблення практичних навичок.
  5. Підведення підсумків уроку.
  6. Домашнє завдання.

Хід уроку

1. Організаційний момент
Привітання з учнями. Перевірка присутності і готовності учнів до уроку. Перевірка виконання домашнього завдання. Оголошення теми й мети уроку.

2. Актуалізація опорних знань

Введення-виведення даних у мові С++ реалізовано з використанням концепції потоків. Під потоком розуміють процес уведення-виведення даних (як послідовності символів) у файл.

Периферійні пристрої введення-виведення клавіатура і монітор розглядають як текстові файли. Під час виконання будь-якої програми автоматично підключають стандартні потоки для введення даних з клавіатури та виведення на монітор. При бажанні потоки можна перенаправити на інший пристрій, наприклад, файл жорсткого диску чи флеш-накопичувача.

Вказівки введення-виведення даних для стандартних пристроїв (клавіатури й монітора) описано у бібліотеці iostream (Input / Output Stream — потік введення / виведення), яку необхідно підключати майже в кожній програмі. Цю бібліотеку включено у стандартну бібліотеку C++.

cin >>
вказівка введення даних із клавіатури — дає змогу вводити величину однієї або величини декількох змінних. Вказівку >> застосовують перед кожною змінною. Значення змінних вводяться через пропуск або натисненням клавіші Enter. Наприклад, таким чином зчитують значення двох змінних a, b:

cin >> a >> b;

cout <<
вказівка виведення даних на монітор — має ті самі правила використання, що й cin >>.

Текстові повідомлення записують у подвійних лапках, але самі лапки на екран не буде виведено.

У мові С++ є набір керівних послідовностей (символів), які записують у вказівках введення-виведення. Наприклад, керівну послідовність "\n" викорис­товують для переходу на новий рядок перед або після потоку виведення даних.

Робота з файлами засобами С++ передбачає використання специальнних типів даних — потоків:

При работі с текстовими файлами потрібно під'єднувати бібліотеку fstream.

Алгоритм зчитування з (текстового) файлу:

Алгоритм запису у (текстовий) файл:

  1. Описати змінну типу ofstream.
  2. Відкрити файл з допомогою функції open.
  3. Вивести інформацію у файл.
  4. Закрити файл.

Відкриття файлу можна здійснити за допомогою функції fopen(), яка повертає покажчик на структуру типу FILE, який можна використовувати для подальших операцій з файлом.

FILE * fopen (назва файлу, тип);

Тут тип визначає доступу до файлу при його відкритті:

Режим відкриття файлу встановлює характер використання файлу. Для визначення режиму у класі ios_base передбачені такі сталі:

Параметр режим можна не вказувати. У цьому випадку файл буде відкрито в режимі як усталено для даного потоку. Після вдалого відкриття файлу у файловій змінній буде збережено значення true, після невдалого — false. Це дає можливість перевірити коректність відкриття файлу.

Подамо три еквівалентні за результатом приклади здійснення кроків 1 і 2 для потоку F:

Примітка. Зверніть увагу на потребу писати додаткову косу риску в записі шляху до файлу.

Після відкриття файлу в режимі запису в нього можна виводити дані так само, як как и на экран. Але замість стандартного пристрою виведення cout необхідно вказати файлову змінну. Наприклад, F<<a; або F<<b<<c<<d;

Закриття потоку здійснюють оператором close. Наприклад, F.close();

Зчитування інформації з текстового файлу задають аналогічно запису, але з використанням типу ifstream (замість ofstream) і >> замість << — див. наступний приклад.

#include <iostream>
#include <fstream>
using namespace std;
int main()
{ int a,b;
  ifstream fi; //Оголошення потоку зчтитування з файлу fi
  ofstream fo; //Оголошення потоку запису у файл fo
  fi.open("input.txt");  //Прив'язування назви файлу до fi
  fo.open("output.txt"); //Прив'язування назви файлу до fo
  fi >> a >> b;         //Зчитування з файлу
  fo << a*b << endl;    //Запис у файл
  cout << a << " * " << b << " = " << a*b;
  fi.close();
  fo.close();
  return 0;
}

Якщо відомо лише тип, але не кількість величин у файлі, потрібно перед кожним зчитуванням перевіряти, чи досягнуто кінець файлу за допомогою булевої функції F.eof(), де F — назва потоку. Функція повертає true або false відповідно до того, досягнуто кінець файлу чи ні.

3. Інструктаж з ТБ
4. Вивчення нового матеріалу й
вироблення практичних навичок


Зміст

  1. Введення й виведення числових даних на формі
  2. Вікно інформаційного діалогу wxMessageDialog
  3. Вікно відображення виконання процесу wxProgressDialog
  4. Виклик вікна діалогу з порадами функцією wxShowTip
  5. Діалог для роботи з файлами wxFileDialog
  6. Діалог для вибору тек wxDirDialog
  7. Діалог для вибору кольору wxColourDialog
  8. Діалог для вибору шрифту wxFontDialog
  9. Діалог для вибору рядка тексту wxSingleChoiceDialog
  10. Діалог для вибору кількох рядків тексту wxMultiChoiceDialog
  11. Діалог для введення цілого значення wxNumberEntryDialog
  12. Діалоги для введення рядка тексту wxTextEntryDialog і wxPasswordEntryDialog
  13. Діалоги для заміни тексту wxFindReplaceDialog

Примітка Для задоволення вимог Державної навчальної програми для закладів загальної середньої освіти на мінімальному рівні станом на травень 2020 року достатньо здобути знання, уміння й навички щодо виконання лише завдання 1 (введення й виведення числових даних на формі).

Завдання 1. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, платформа якого містить:

Закриття вікна діалогу має привести до появи вікна повідомлення зі значенням добутку чисел, значення яких введено у вікні діалогу.

Вказівки до виконання

  1. Завантажити й розпакувати архів проекту, що є результатом виконання завдання попередньо виконаної практичної роботи.

  2. Відкрити файл dialog.cbp у середовищі CodeBlocks.

  3. На вкладенні Resources (ресурси) панелі Management клацнути по зображенні теки dialogFrame і відкрити файл dialogframe.wxs.

    Форма містить контейнер wxBoxSizer для розташування об'єктів керування по горизонталі, взятий зі вкладення Layout, а сам контейнер містить кнопку wxButton, взяту зі вкладення Standard.

  4. Запозичивши зі вкладення Standard елементи wxTextCtrl і wxStaticText, розташувати їх у контейнері wxBoxSizer так, як показано на малюнку нижче.

  5. Для кожного з двох елементів wxTextCtrl змінити значення властивостей на такі:

    • Text — (порожній рядок);
    • Width — 60;
    • Height — 24;
    • Font (розмір) — 16;
  6. Для трьох елементів wxStaticText змінити значення властивостей на такі:

    • Text — + | = | (порожній рядок) — перелік зліва направо;
    • Width — 24 | 24 | 60;
    • Height — 24;
    • Font (розмір) — 16;
  7. Пересвідчитися, що виконання проекту (після натискання кнопки Build and run — зібрати й запустити) призводить до появи вікна такого вигляду.

  8. Перейшовши на вкладення dialogMain.cpp вбудованого редактора,

    змінити код обробника події натискання кнопки форми на такий:

    void dialogFrame::OnButton1Click(wxCommandEvent& event)
    
    {// Збереження у змінній Text* значення
     // властивості Text поля TextCtrl*
      wxString Text1 = TextCtrl1->GetValue();
      wxString Text2 = TextCtrl2->GetValue();
    
      long a1,a2;
      Text1.ToLong(&a1);// Перетворення значення Text* у ціле число
      Text2.ToLong(&a2);// i збереження його значення у змінній a*
    
      // Збереження у змінній Text3 результату
      // перетворення суми a1+a2 у змінну типу wxString
      wxString Text3;  Text3 << a1+a2;
    
    /*
      double a1,a2;
      Text1.ToDouble(&a1);// Перетворення значення Text* у десятковий
      Text2.ToDouble(&a2);// дріб i збереження його значення у змінній a*
    
      // Збереження у змінній Text3 результату
      // перетворення суми a1+a2 у змінну типу wxString
      wxString Text3 = wxString::Format(wxT("%6.2f"), a1+a2);
    */
      StaticText3->SetLabel(Text3); // Надати нове значення напису
      StaticText3->Refresh();       // Оновити на формі
    }
  9. Проаналізувати код обробника. У тому числі й закоментовану частину, призначену для опрацювання дійсних чисел. Щодо конвертації інших типів для допитливих є поради в Інтернеті.

  10. Перевірити роботу проекту, отримавши такий результат

    після введення відповідних чисел у поля введення й натискання кнопки. При бажанні перевірити коректність роботи програми на довільних 4-цифрових числах.

  11. Закоментувати ту частину обробника події натискання кнопки, що опрацьовує ввенення десяткових записів цілих чисел, і зняти коментування з відповідної частини для дійсних чисел. Перевірити роботу проекту, отримавши такий результат

    після введення відповідних чисел у поля введення й натискання кнопки. При бажанні перевірити коректність роботи програми для довільних числах, запис яких містить до 4 цифр і не більше 2 цифр після десяткової крапки.

  12. Зберегти проект, натиснувши кнопку Save all files (зберегти усі файли) і вийти з середовища CodeBlocks.

  13. Теку з проектом записати з назвою Ваше_прізвище_1 у вказане учителем місце.

Клас wxMessageDialogвікно інформаційного діалогу бібліотеки wxWidgets з вибором кнопок ОК, Yes, No, Cancel.

Цей клас підтримує такі стилі:

Завдання 2. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що викликає такі вікна діалогу з усіма переліченими кнопками і значнами, а вигляд останнього вікна залежить від того, яку кнопку з Yes, No, Cancel було натиснуто у передостаньому вікні.

Вказівки до виконання

  1. Завантажити й розпакувати архів проекту, що є результатом виконання завдання попередньо виконаної практичної роботи.

  2. Відкрити файл dialog.cbp у середовищі CodeBlocks.

  3. На вкладенні Resources (ресурси) панелі Management клацнути по зображенні теки dialogFrame і відкрити файл dialogframe.wxs.

    Форма містить контейнер wxBoxSizer для розташування об'єктів керування по горизонталі, взятий зі вкладення Layout, а сам контейнер містить кнопку wxButton, взяту зі вкладення Standard.

  4. Перейшовши на вкладення dialogMain.cpp вбудованого редактора,

    змінити код обробника події натискання кнопки форми на такий:

    void dialogFrame::OnButton1Click(wxCommandEvent& event)
    { wxMessageDialog *d0 = new wxMessageDialog(NULL,wxT("wxICON_* не задано"), wxT("0"),wxOK);                     d0->ShowModal();
      wxMessageDialog *d1 = new wxMessageDialog(NULL,wxT("wxICON_INFORMATION"), wxT("1"),wxOK|wxICON_INFORMATION);  d1->ShowModal();
      wxMessageDialog *d2 = new wxMessageDialog(NULL,wxT("wxICON_ERROR"),       wxT("2"),wxOK|wxICON_ERROR);        d2->ShowModal();
      wxMessageDialog *d3 = new wxMessageDialog(NULL,wxT("wxICON_EXCLAMATION"), wxT("3"),wxOK|wxICON_EXCLAMATION);  d3->ShowModal();
      wxMessageDialog *d4 = new wxMessageDialog(NULL,wxT("wxICON_AUTH_NEEDED"), wxT("4"),wxOK|wxICON_AUTH_NEEDED);  d4->ShowModal();
      wxMessageDialog                        d5(NULL,wxT("wxICON_QUESTION"),    wxT("5"),wxYES_NO|wxCANCEL|wxNO_DEFAULT|wxICON_QUESTION);
      switch ( d5.ShowModal() )
      { case wxID_YES:   {wxMessageDialog *c1 = new wxMessageDialog(NULL,wxT("Натисли Yes"),   wxT("Що натисли?"),wxOK|wxICON_INFORMATION);  c1->ShowModal();}  break;
        case wxID_NO:    {wxMessageDialog *c2 = new wxMessageDialog(NULL,wxT("Натисли No"),    wxT("Що натисли?"),wxOK|wxICON_INFORMATION);  c2->ShowModal();}  break;
        case wxID_CANCEL:{wxMessageDialog *c3 = new wxMessageDialog(NULL,wxT("Натисли Cancel"),wxT("Що натисли?"),wxOK|wxICON_INFORMATION);  c3->ShowModal();}  break;
        default:         {wxMessageDialog *c4 = new wxMessageDialog(NULL,wxT("Неочікуваний код повернення wxMessageDialog"),
                                                                                               wxT("Що натисли?"),wxOK|wxICON_INFORMATION);  c4->ShowModal();}  break;
      }
    }

    Усі вікна діалогу зроблено модальними, тобто верхніми, з предком NULL. Наступні два параметри-рядки задають текст повідомлення й заголовок. Для відображення вікна діалогу на екрані використано метод ShowModal. Останні рядки внесеного коду (оператор switch) показують, як отримати дані про те, яку кнопку натиснуто.

  5. Запустити проект на виконання і послідовно закривати вікна діалогу, натискаючи на їхні кнопки. Для теми Mint-X операційної системи Linux Mint 18.1 ці вікна мають такий вигляд:

  6. Пересвідчитися, що залежно від того, яку кнопку буде натиснено в останньому вікні, відображеному вище, у відповідь буде отримано одне з таких вікон:

    Зауважте, що закриття вікна без натискання кнопки еквівалентне натисканню кнопки Cancel.

  7. Якщо зовнішній вигляд останніх 9 ілюстрацій відрізняється виглядом значків від поданого виже, надіслати відповідні ілюстрації упоряднику тексту з вказанням теми оформлення й операційної системи.

Примітка Замість wxMessageDialog можна використати функцію wxMessageBox з такими аргументами: рядок з повідомленням, заголовок, стиль і батьківське вікно. Наприклад, вікно

можна викликати, якщо замінити у заготовці для завдань 1 і 2 код обробника події натискання на кнопку на такий:

void dialogFrame::OnButton1Click(wxCommandEvent& event)
{ if (wxYES == wxMessageBox(wxT("wxICON_QUESTION"),wxT("5"),wxNO_DEFAULT|wxYES_NO|wxCANCEL|wxICON_QUESTION,NULL)){}
}

На відміну від QT і GTK+ (GIMP ToolKit — багатоплатформний набір інструментів для створення графічних інтерфейсів користувача) бібліотека wxWidgets використовує елементи тієї операційної системи, під якою її зібрано. Завдяки цьому вона споживає порівняно мало ресурсів, а результат її роботи не відрізняється від роботи рідних застосунків системи.

При цьому wxMessageBox повертає значення, відмінні від тих, які повертає метод wxMessageDialog::ShowModal, а саме wxOK, wxCANCEL, wxYES, wxNO відповідно замість wxID_OK, wxID_CANCEL, wxID_YES, wxID_NO.

Клас wxProgressDialogвікно діалогу бібліотеки wxWidgets для виведення короткого повідомлення й індикатора виконання певного процесу.

Для використання wxProgressDialog необхідно на початку коду вказати таку директиву препроцесора:

#include <wx/progdlg.h>

Діалог може містити кнопку для скасування виконуваної операції, показувати час, що минув від початку, очікуваний час виконання і очікуваний час до завершення процесу. При створенні діалогу передають такі параметри: рядок заголовку, рядок повідом­лення, максимальне значення для індикатора, батьківське вікно і стиль.

Стилі wxProgressDialog

Застосунок має викликати метод Update з деяким значенням (від нуля до максимального, визначеного в конструкторі) і, можливо, новим повідомленням, яке потрібно показати у вінкі діалогу. Щоб показати діалог знову, потрібно викликати Resume.

Примітка. У кожному наступному завданні кроки 1-3 і область виконання кроку 4 збігаються з тими, що є у вказівках до завдання 2, якщо їх виконувати "з нуля". Тому їх не описано далі. А різниця у коді обробника події натискання кнопки та вказівках до перевірки коректності коду (кроки, починаючи з 4-го). Після виконання одного завдання доцільно пропускати кроки 1-3 наступного завдання й одразу переходити до 4-го кроку.

Завдання 3. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що викликає такі вікна діалогу з усіма переліченими кнопками і значнами, а вигляд останнього вікна залежить від того, яку кнопку з Yes, No, Cancel було натиснуто у передостаньому вікні.

Вказівки до виконання

...
  1. Змінити код обробника події натискання кнопки форми на такий:

    void dialogFrame::OnButton1Click(wxCommandEvent& event)
    { static const int imax = 20;
      wxProgressDialog d(
      wxT("Поступ процесу"),
      wxT("Інформаційне повідомлення"),
      imax,  // діапазон
      this,  // батьківське вікно
      wxPD_CAN_ABORT | // cтилі
      wxPD_APP_MODAL |
      wxPD_ELAPSED_TIME |
      wxPD_ESTIMATED_TIME |
      wxPD_REMAINING_TIME);
      bool c = true;      // Чи потрібно продовжувати?
      for ( int i = 0; i <= imax; i++ )
      { wxSleep(1);
        switch (4*i/imax)
        { case 0: c = d.Update(i, wxT("")); break;
          case 1: c = d.Update(i, wxT("Зроблено 25%")); break;
          case 2: c = d.Update(i, wxT("Зроблено 50%")); break;
          case 3: c = d.Update(i, wxT("Зроблено 75%")); break;
          case 4: c = d.Update(i, wxT("Зроблено 100%")); break;
        }
        if (!c)
        { if ( wxMessageBox(wxT("Ви справді бажаєте скасувати дію?"),wxT("Запитання щодо діалогу поступу"),wxYES_NO|wxICON_QUESTION) == wxYES) break;
          d.Resume();
        }
      }
      if (!c) {wxMessageDialog *b = new wxMessageDialog(NULL,wxT("Діалог поступу вилучено!"), wxT("Стан"),wxOK);  b->ShowModal();}
      else    {wxMessageDialog *b = new wxMessageDialog(NULL,wxT("Відлік завершено"),         wxT("Стан"),wxOK);  b->ShowModal();}
    }
  2. На початку коду dialogMain.cpp вказати таку директиву препроцесора:

    #include <wx/progdlg.h>

  3. Запустити проект на виконання і пересвідчитися у коректності роботи, спостерігаючи відстеження процесу відліку:

Вікно діалогу з порадами на початку або навіть у процесі роботи — риса, притаманна багатьом застосункам. Такі поради, на думку розробників, допомагають користувачу-початківцю навчитися ефективно використовувати застосунок. Поради сприяють вивченню застосунку маленькими шматками, що легко сприймаються. Такий підхід здається привабливими й корисними тим, хто не люблять читати документацію.

Для виклику вікна діалогу з порадами необхідно викликати функцію wxShowTip з такими аргументами: батьківське вікно, покажчик на об'єкт wxTipProvider і необов'язкове логічне значення, яке визначає, чи показувати прапорець «Show Tips at Startup» (показувати поради спочатку). Діалог повертає значення цього прапорця.

Щоб використати власне джерело порад, необхідно успадкувати властивості від wxTipProvider і перевизначити метод GetTip, який повинен повертати рядок wxString, що містить пораду. Бібліотека wxWidgets вже містить одну таку реалізацію wxCreateFileTipProvider, яка приймає на вхід назву файлу з порадами (по одній у рядку) і номер рядка в цьому файлі (нумерацію починають з нуля). Застосунок має видалити об'єкт класу wxTipProvider самостійно, коли той стане не потрібним.

Для роботи з переліченими вище функціями на початку коду необхідно вказати таку директиву препроцесора:

#include <wx/tipdlg.h>

  • Завдання 4. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що викликає вікно діалогу з порадами, записаними у файлі input.txt.

    Вказівки до виконання

    ...
    1. Змінити код обробника події натискання кнопки форми на такий:

      void dialogFrame::OnButton1Click(wxCommandEvent& event)
      { srand(time(NULL)); // ініціалізація генератора випадкових чисел
        int j = rand()%4;  // випадковий номер поради від 0 до 3 включно
        wxTipProvider  *t = wxCreateFileTipProvider(wxT("input.txt"), j); // призначення файлу (input.txt) і номера поради
        wxShowTip(this, t, true); // показ поради
        delete t;
      }
      
    2. На початку коду dialogMain.cpp вказати таку директиву препроцесора:

      #include <wx/tipdlg.h>

    3. Скопіювати файл input.txt у теку, що містить файл проекту dialog.cbp.

    4. Запустити проект на виконання і пересвідчитися у коректності роботи:

    Діалог для роботи з файлами wxFileDialog надає можливість користувачеві вибрати один або кілька файлів. Існують також варіанти для відкриття і збереження файлу. При створенні wxFileDialog йому необхідно передати батьківське вікно, повідомлення для користувача, каталог як усталено, назву файлу як усталено, маску, стиль, розташування і розмір (останні два параметри можуть ігноруватися реалізацією). Далі необхідно викликати ShowModal і порівняти повернуте значення з wxID_OK. Рівність означає, що користувач підтвердив свій вибір.

    Теку й назву файлу розглядають як окремі елементи повного шляху до файлу. Якщо тека порожня, то буде використано поточну теку. Якщо назва файлу порожня, то користувачеві не буде запропоновано назву файлу як усталено.

    Маска визначає, які файли потрібно показати. Маска може містити визначення для декількох типів файлів з описом кожного з них. Наприклад,

    "JPEG files (*.jpeg)|*.jpeg|GIF files (*.gif)|*.gif|PNG files (*.png)|*.png"

    Якщо користувач напише назву файлу з груповими символами («*», «?») у поле для назви й натисне «OK», то буде показано лише файли, які задовольняють такому шаблону.

    Стилі wxFileDialog

    Методи wxFileDialog

    Для діалогу з множинним вибором GetPaths дозволяє отримати масив wxArrayString вибраних файлів, включаючи шлях до них.

    Для вибору файлу на початку коду необхідно вказати таку директиву препроцесора:

    #include <wx/filedlg.h>

  • Завдання 5. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що викликає два вікна діалогу для роботи з файлами: одне для вибору одного файлу, інше для вибору кількох файлів. Після вибору організувати виведення повного шляху до файлу (файлів).

    Вказівки до виконання

    ...
    1. Змінити код обробника події натискання кнопки форми на такий:

      void dialogFrame::OnButton1Click(wxCommandEvent& event)
      {                                // вибір одного файлу
        wxFileDialog d(                // d - назва діалогу
        this,                          // батьківське вікно
        wxT("Виберіть один файл"),     // заголовок
        wxT("/home"),                  // тека як усталено
        wxEmptyString,                 // назва файлу як усталено
        wxT("PNG files (*.png)|*.png|JPEG files (*.jpeg)|*.jpeg|GIF files (*.gif)|*.gif"),// маска
        wxFD_OPEN,                     // стиль діалогу для відкриття файлу
        wxDefaultPosition);
        if (d.ShowModal() == wxID_OK)  // якщо обрано файл
        { wxMessageDialog *f = new wxMessageDialog(NULL,d.GetPath(),wxT("GetPath"),wxOK);
          f->ShowModal();
        }
                                       // вибір кількох файлів
        wxFileDialog g(                // g - назва діалогу
        this,                          // батьківське вікно
        wxT("Виберіть кілька файлів"), // заголовок
        wxT("/home"),                  // тека як усталено
        wxEmptyString,                 // назва файлу як усталено
        wxT("PNG files (*.png)|*.png|JPEG files (*.jpeg)|*.jpeg|GIF files (*.gif)|*.gif"),//);// маска
        wxFD_OPEN|wxFD_MULTIPLE,       // стиль діалогу для відкриття файлу
        wxDefaultPosition);
        if (g.ShowModal() == wxID_OK)  // якщо обрано файл
        { wxArrayString paths,         // повні шляхи до вибраних файлів.
                    filenames;         // назви файлів
          g.GetPaths(paths);           // отримання шляхів
          g.GetFilenames(filenames);   // отримання назв файлів
          wxString m,                  // дані про усі файли
                   s;                  // дані про один файл
          size_t count = paths.GetCount();     // кількість вибраних файлів
          for (size_t n = 0; n<count; n++)     // перебір вибраних файлів
          { s.Printf("File %d: \n %s \n %s\n\n",
            (int)n, paths[n], filenames[n]);
            m += s;
          }
          wxMessageDialog h(this, m,wxT("Вибрані файли"));
          h.ShowModal();
        }
      }

      У разі потреби (наприклад, при роботі на ПК під керуванням ОС Windows) змінити теку як усталено. Наприклад, на wxT("с:").

    2. На початку коду dialogMain.cpp вказати таку директиву препроцесора:

      #include <wx/filedlg.h>

    3. Запустити проект на виконання і пересвідчитися у коректності роботи:



    Діалог для вибору тек wxDirDialog надає можливість вибрати локальну або мережеву теку.

    При створенні діалогу йому необхідно передати батьківське вікно, повідомлення для користувача, теку як усталено, стиль, розташування і розмір. Останні два параметри можуть ігноруватися реалізацією. Далі необходно викликати ShowModal. Рівність повернутого значення і wxID_OK означає, що користувач підтвердив свій вибір.

    Стиль wxDD_NEW_DIR_BUTTON передбачає можливість створювати нову теку.

    Методи wxDirDialog

    Для вибору теки на початку коду необхідно вказати таку директиву препроцесора:

    #include <wx/dirdlg.h>

  • Завдання 6. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що викликає вікно діалогу для вибору теки. Після вибору організувати виведення назви теки у повідомлення.

    Вказівки до виконання

    ...
    1. Змінити код обробника події натискання кнопки форми на такий:

      void dialogFrame::OnButton1Click(wxCommandEvent& event)
      { wxDirDialog d(
        this,                         // батьківське вікно
        wxT("Перевірка вибору теки"), // заголовок
        wxT("/"),                     // тека як усталено
        wxDD_NEW_DIR_BUTTON);         // надано можливість створення нової теки
        if (d.ShowModal() == wxID_OK)
        { wxString path = d.GetPath();
          wxMessageBox(path);
        }
      }

      У разі потреби (наприклад, при роботі на ПК під керуванням ОС Windows) змінити теку як усталено. Наприклад, на wxT("с:").

    2. На початку коду dialogMain.cpp вказати таку директиву препроцесора:

      #include <wx/dirdlg.h>

    3. Запустити проект на виконання і пересвідчитися у коректності роботи:

    Діалог для вибору кольору wxColourDialog надає можливість вибрати колір із запропонованої палітри або з усього різноманіття кольорів.

    Вигляд вікна діалогу для вибору кольору залежить від використовуваної операційної системи. Але у будь-якому випадку на ньому подано палітру з 16 налаштовуваних кольорів, яку можна змінювати як програмно, так і під час діалогу. Створений колір можна додати у палітру налаштовуваних кольорів. При цьому новий колір замінює вибраний колір або самий перший, якщо жоден із кольорів палітри не вибрано.

    При використанні ОС Windows вікно діалогу містить додатково: в лівому верхньому куті — палітру з 48 часто використовуваних кольорів, а праворуч — 3 повзунки, які визначають червону, зелену і синю компоненти кольору. При інших ОС замість повзунків можуть бути інші елементи інтерфейсу.

    Для використання діалогу потрібно створити об'єкт класу wxColourDialog, передати йому батьківське вікно і покажчик wxColourData на палітру налаштовуваних кольорів. Інформацію з wxColourData буде використано для заповнення діалогу значеннями кольорів. Далі необхідно викликати метод ShowModal для діалогу. Коли керування повернеться у код, можна отримати вибір користувача, викликавши GetColourData.

    Методи wxColourData

    Для можливості вибору кольору на початку коду необхідно вказати таку директиву препроцесора:

    #include <wx/colordlg.h>

  • Завдання 7. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що задає нові значення 16 налаштовуваних кольорів, викликає вікно діалогу для вибору нового кольору напису кнопки і тла вікна та змінює ці кольори.

    Вказівки до виконання

    ...
    1. Змінити код обробника події натискання кнопки форми на такий:

      void dialogFrame::OnButton1Click(wxCommandEvent& event)
      { wxColourData p; // палітра налаштовуваних кольорів до можливої зміни
        p.SetChooseFull(true);
        // заповнення панелі налаштовуваних кольорів своїми кольорами
        wxColour c0 (255, 255, 255);  p.SetCustomColour( 0,  c0);
        wxColour c1 (255,   0,   0);  p.SetCustomColour( 1,  c1);
        wxColour c2 (  0, 255,   0);  p.SetCustomColour( 2,  c2);
        wxColour c3 (  0,   0, 255);  p.SetCustomColour( 3,  c3);
        wxColour c4 (255, 255,   0);  p.SetCustomColour( 4,  c4);
        wxColour c5 (255,   0, 255);  p.SetCustomColour( 5,  c5);
        wxColour c6 (  0, 255, 255);  p.SetCustomColour( 6,  c6);
        wxColour c7 (127,   0,   0);  p.SetCustomColour( 7,  c7);
        wxColour c8 (  0, 127,   0);  p.SetCustomColour( 8,  c8);
        wxColour c9 (  0,   0, 127);  p.SetCustomColour( 9,  c9);
        wxColour c10(127, 127,   0);  p.SetCustomColour(10, c10);
        wxColour c11(127,   0, 127);  p.SetCustomColour(11, c11);
        wxColour c12(  0, 127, 255);  p.SetCustomColour(12, c12);
        wxColour c13(255, 127, 127);  p.SetCustomColour(13, c13);
        wxColour c14(127, 127, 255);  p.SetCustomColour(14, c14);
        wxColour c15(127, 255, 127);  p.SetCustomColour(15, c15);
      
        wxColourDialog d(this, &p);
        if (d.ShowModal() == wxID_OK)
        { wxColourData r = d.GetColourData(); // панель кольорів, можливо, змінена
          wxColour     c = r.GetColour();     // вибраний колір
          Button1->SetForegroundColour(c);    // зміна кольору напису на кнопці
          Button1->SetBackgroundColour(c);    // спроба змінити колір тла кнопки
          this   ->SetBackgroundColour(c);    // змінита кольору тла вікна
        }
      }

      На початку коду dialogMain.cpp вказати таку директиву препроцесора:

      #include <wx/colordlg.h>

    2. Запустити проект на виконання і пересвідчитися у коректності роботи, зробивши копію вікна діалогу для вибору кольору Choose colour (вона необхідна для виконання останнього кроку):





    3. Переконатися, що незважаючи на наявність вказівки:

      Button1->SetBackgroundColour(c);

      колір кнопки не буде змінено — див останній малюнок угорі. Це пояснюють тим, що кнопку відносять до так званих корінних елементів керування, для яких не завжди є можливість змінювати колір тла під час виконання проекту.

    4. Закоментувати або видалити рядки:

      wxColour c0 (255, 255, 255);  p.SetCustomColour( 0,  c0);
      wxColour c1 (255,   0,   0);  p.SetCustomColour( 1,  c1);
      …
      wxColour c15(127, 255, 127);  p.SetCustomColour(15, c15);
    5. Відкомпілювати проект і запустити його на виконання, щоб побачити налаштовувані кольори палітри як усталено, тобто без втручання користувача. Пересвідчитися, що палітра налаштовуваних кольорів як усталено (малюнок ліворуч нижче) відрізняється від того, якою вона була при першому виконанні проекту (малюнок праворуч нижче).



    Діалог для вибору шрифту wxFontDialog надає можливість визначити гарнітуру і розмір шрифту, а на деяких платформах також і колір шрифту.

    При операційній системі Windows використовують стандартний діалог вибору шрифту. Цей діалог дозволяє задати для шрифту гарнітуру (назву), розмір, написання, підкреслення / закреслення, колір шрифту й тла за ним. Внизу діалогу буде показано зразок одержуваного шрифту. Зауважимо: при конвертації шрифту з Windows у wxWidgets закреслення буде проігноровано, а гарнітуру (таку як Arial або Courier) буде замінено на відповідну (таку як Swiss або Modern).

    В GTK+ використовують системний діалог вибору шрифту, який не дозволяє вибрати колір.

    Для використання wxFontDialog потрібнго створити цей об'єкт та передати йому батьківське вікно й об'єкт класу wxFontData. Потім викликати метод ShowModal і порівняти повернуте значення з wxID_OK (рівність означає підтвердження вибору). Далі можна викликати GetChosenFont або GetChosenColour залежно від того, що (гарнітуру й розмір чи колір) потрібно змінити.

    Методи wxFontData

    Для можливості вибору гарнітури й розміру шрифта на початку коду необхідно вказати таку директиву препроцесора:

    #include <wx/fontdlg.h>

  • Завдання 8. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що натисканням кнопки викликає вікно діалогу для вибору гарнітури й розміру шрифту і змінює відповідним чином властивості напису на кнопці.

    Вказівки до виконання

    ...
    1. Змінити код обробника події натискання кнопки форми на такий:

      void dialogFrame::OnButton1Click(wxCommandEvent& event)
      { wxFontData data;                                // оголосити змінну типу.wxFontData для даних до діалогу
        data.SetInitialFont(Button1->GetFont());        // отримати шрифт Button1 
        data.SetColour(Button1->GetForegroundColour()); // отримати колір напису на Button1 
        wxFontDialog d(Button1, data);                  // відкрити вікно діалогу.
        if (d.ShowModal() == wxID_OK)                   // якщо вибір зроблено
        { wxFontData retData = d.GetFontData();         // оголосити змінну типу.wxFontData для результату діалогу
          Button1->SetFont(retData.GetChosenFont());    // змінити гарнітуру й розмір напису на Button1  .
          Button1->SetForegroundColour(retData.GetColour());// змінити колір напису на Button1 (лише при ОС Windows) .
        }
      }
    2. На початку коду dialogMain.cpp вказати таку директиву препроцесора:

      #include <wx/fontdlg.h>

    3. Запустити проект на виконання і пересвідчитися у коректності роботи з використанням шрифту, істотно відмінного від початкового. Наприклад, готичного.



    Діалог для вибору рядка тексту wxSingleChoiceDialog показує користувачеві список рядків і пропонує йому вибрати один з них.

    У конструктор діалогу передають батьківське вікно, повідомлення для показу у діалозі, заголовок і змінну wxArrayString, що містить рядки, з яких діалог робить список. Замість останнього параметра можна передати розмір масиву та масив рядків wxChar**.

    Метод SetSelection дозволяє встановити вибір як усталено. Після того як діалог буде закрито, можна отримати вибір користувача за допомогою методів:

    Для можливості вибору рядка на початку коду необхідно вказати таку директиву препроцесора:

    #include <wx/choicdlg.h>

  • Завдання 9. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що натисканням кнопки викликає вікно діалогу для вибору рядка тексту виводить його у вікні повідомлення.

    Вказівки до виконання

    ...
    1. Змінити код обробника події натискання кнопки форми на такий:

      void dialogFrame::OnButton1Click(wxCommandEvent& event)
      { wxArrayString c;         // масив варіантів вибору
        c.Add(wxT("Іменник"));   // долучення нових елементів до масиву
        c.Add(wxT("Дієслово"));  // нумерація з нуля
        c.Add(wxT("Займенник"));
        c.Add(wxT("Прикметник"));
        c.Add(wxT("Прислівник"));
        c.Add(wxT("Числівник"));
        c.Add(wxT("Прийменник"));
        c.Add(wxT("Сполучник"));
        c.Add(wxT("Частка"));
        c.Add(wxT("Вигук"));
        wxSingleChoiceDialog d(  // опис діалогу вибору
        this,                    // батьківський об'єкт
        wxT("Виберіть частиту мови:\n одну з десяти."),// повідомлення
        wxT("Вибір рядка"),                            // заголовок
        c);
        d.SetSelection(2);                             // призначення номеру вибраного рядка як усталено
        if (d.ShowModal() == wxID_OK)
        wxMessageBox(d.GetStringSelection(),wxT("Вибір"));// повідомлення про результат вибору
      }
    2. На початку коду dialogMain.cpp вказати таку директиву препроцесора:

      #include <wx/choicdlg.h>

    3. Запустити проект на виконання і пересвідчитися у коректності роботи.



    Діалог для вибору кількох рядків тексту wxMultiChoiceDialog показує користувачу список рядків і пропонує йому вибрати кілька з них.

    Цей діалог схожий на wxSingleChoiceDialog: він також відображає користувачеві список рядків, але дозволяє вибрати відразу декілька з них. При створенні в конструктор діалогу передають батьківське вікно, повідомлення для показу в діалозі, заголовок і масив тину wxArrayString, що містить рядки для діалогу.

    Для встановлення початкового вибору необхідно викликати метод SetSelections, передавши йому масив типу wxArrayInt, де кожен елемент визначає індекс у переданому масиві рядків.

    Отримання вибору користувача з діалогу робиться за допомогою методу GetSelections, який повертає wxArrayInt з індексами обраних елементів.

    Для можливості вибору рядка на початку коду необхідно вказати таку директиву препроцесора:

    #include <wx/choicdlg.h>

  • Завдання 10. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що натисканням кнопки викликає вікно діалогу для вибору кількох рядків тексту і виводить їх у вікні повідомлення.

    Вказівки до виконання

    ...
    1. Змінити код обробника події натискання кнопки форми на такий:

      void dialogFrame::OnButton1Click(wxCommandEvent& event)
      { wxArrayString c;         // масив варіантів вибору
        c.Add(wxT("Іменник"));   // долучення нових елементів до масиву
        c.Add(wxT("Дієслово"));  // нумерація з нуля
        c.Add(wxT("Займенник"));
        c.Add(wxT("Прикметник"));
        c.Add(wxT("Прислівник"));
        c.Add(wxT("Числівник"));
        c.Add(wxT("Прийменник"));
        c.Add(wxT("Сполучник"));
        c.Add(wxT("Частка"));
        c.Add(wxT("Вигук"));
        wxMultiChoiceDialog d(this,
        wxT("Виберіть службові частини мови"), // повідомлення
        wxT("Вибір кількох рядків"),           // заголовок
        c);
        if (d.ShowModal() == wxID_OK)
        { wxArrayInt s = d.GetSelections();
          int ns=s.GetCount();// кількість вибраних рядків
          wxString m,         // дані про усі вибрані рядки
                   t;         // дані про один вибраний рядок
          m=wxT("Вибрано такі частини мови:\n");
          for (int n=0; n<ns; n++)  // перебір вибраного
          { t.Printf("%d  %d  %s\n",n,s[n],c[s[n]].c_str());
            m += t;
          }
          wxMessageBox(m, wxT("Результат вибору"));
        }
      }
    2. На початку коду dialogMain.cpp вказати таку директиву препроцесора:

      #include <wx/choicdlg.h>

    3. Запустити проект на виконання і пересвідчитися у коректності роботи.



    Діалог для введення цілого значення wxNumberEntryDialog робить запит користувачу про ціле значення з деякого діапазону.

    Число можна ввести безпосередньо або за допомогою натискань на стрілочку вгору чи вниз. При створенні діалогу йому передають батьківське вікно, текст повідомлення, текст запиту, заголовок, початкове, мінімальне і максимальне значення, розташування. Після цього необхідно викликати метод ShowDialog. Якщо він поверне wxID_OK (буде здійснено вибір), то отримати дані з допомогу методу GetValue.

    Для можливості введення цілого числа таким чином на початку коду необхідно вказати таку директиву препроцесора:

    #include <wx/numdlg.h>

  • Завдання 11. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що натисканням кнопки викликає вікно діалогу для вибору кількох рядків тексту і виводить їх у вікні повідомлення.

    Вказівки до виконання

    ...
    1. Змінити код обробника події натискання кнопки форми на такий:

      void dialogFrame::OnButton1Click(wxCommandEvent& event)
      { wxNumberEntryDialog d(
        this,                          // батьківське вікно..
        wxT("Повідомлення одним рядком\nабо навіть кількома"), // повідомлення
        wxT("Введіть ціле значення"),  // напис біля поля введення
        wxT("Діалог введення цілого"), // заголовок
        34,                            // значення як усталено
        0, 100);                       // межі значень
        if (d.ShowModal() == wxID_OK)
        { long v = d.GetValue();       // введене значення
          wxString s;                  // рядок для виведення v
          s<<v;
          wxMessageBox(s+wxT("           "), wxT("Результат"));
        }
      }
    2. На початку коду dialogMain.cpp вказати таку директиву препроцесора:

      #include <wx/numdlg.h>

    3. Запустити проект на виконання і пересвідчитися у коректності роботи.

    Діалоги для введення рядка тексту wxTextEntryDialog і wxPasswordEntryDialog — це діалоги з одним полем для редагування і повідомленням.

    Їхні методи повністю ідентичні, за винятком того, що текст, набраний у wxPasswordEntryDialog, буде приховано. У конструктор передають батьківське вікно, повідомлення, заголовок, початкове значення і стиль. Стиль є комбінацією wxOK, wxCANCEL і wxCENTRE (або wxCENTER), а також специфічних для wxTextCtrl стилів, таких як wxTE_CENTRE (або wxTE_CENTER). Значення як усталено можна встановити за допомогою методу SetValue. Метод GetValue дозволяє отримати введене користувачем значення.

    Для можливості введення цілого числа таким чином на початку коду необхідно вказати таку директиву препроцесора:

    #include <wx/textdlg.h>

  • Завдання 12. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що натисканням кнопки викликає вікно діалогу для вибору кількох рядків тексту і виводить їх у вікні повідомлення.

    Вказівки до виконання

    ...
    1. Змінити код обробника події натискання кнопки форми на такий:

      void dialogFrame::OnButton1Click(wxCommandEvent& event)
      { wxTextEntryDialog d(this,
        wxT("Рядок коментаря,\n")
        wxT("продовжений у наступному рядку"),
        wxT("Введення рядка тексту"),
        wxT("текст як усталено"),
        wxOK | wxCANCEL);
        if (d.ShowModal() == wxID_OK)
        wxMessageBox(d.GetValue(), wxT("Ведений рядок"));
      }
    2. На початку коду dialogMain.cpp вказати таку директиву препроцесора:

      #include <wx/textdlg.h>

    3. Запустити проект на виконання і пересвідчитися у коректності роботи.





    4. У внесеному коді замінити wxTextEntryDialog на wxPasswordEntryDialog, запустити проект на виконання і пересвідчитися у коректності роботи.





    Примітка Додатково до перелічених вище діалогів бібліотека wxWidgets містить не описані тут такі діалоги:

    6. Підведення підсумків уроку
    Виставлення оцінок.

    7. Домашня робота.

    1. Повторити матеріал уроку.
    2. Створити програму, яка :
      • або виводить форму для анкети з трьома написами-заголовками, трьома полями для введення і кнопкою, натискання на яку призводить до дописування введених значень, розділених крапкою з комою, у файл input.txt;

      • або імітує роботу примітивного калькулятора для виконання арифметичних дій (додавання, віднімання, множення і ділення) з десятковими дробами. Аматори біблітеки Qt можуть використати Qt замість wxWidgets, керуючись настановами російською мовою для створення калькулятора.


    Текст упорядкував Олександр Рудик.