Тема: введення і виведення даних, вікна повідомлень, їх використання, передавання значень між вікном повідомлення і змінними мовою С++.
Мета:
Обладнання: комп’ютери зі встановленими ОС та середовищем CodeBlocks для програмування мовою С++ разом з бібліотекою wxWigets.
Структура уроку
Хід уроку
1. Організаційний момент
Привітання з учнями. Перевірка присутності і готовності учнів до уроку. Перевірка виконання домашнього завдання. Оголошення теми й мети уроку.
2. Актуалізація опорних знань
Введення-виведення даних у мові С++ реалізовано з використанням концепції потоків. Під потоком розуміють процес уведення-виведення даних (як послідовності символів) у файл.
Периферійні пристрої введення-виведення клавіатура і монітор розглядають як текстові файли. Під час виконання будь-якої програми автоматично підключають стандартні потоки для введення даних з клавіатури та виведення на монітор. При бажанні потоки можна перенаправити на інший пристрій, наприклад, файл жорсткого диску чи флеш-накопичувача.
Вказівки введення-виведення даних для стандартних пристроїв (клавіатури й монітора) описано у бібліотеці iostream (Input / Output Stream — потік введення / виведення), яку необхідно підключати майже в кожній програмі. Цю бібліотеку включено у стандартну бібліотеку C++.
Текстові повідомлення записують у подвійних лапках, але самі лапки на екран не буде виведено.
У мові С++ є набір керівних послідовностей (символів), які записують у вказівках введення-виведення. Наприклад, керівну послідовність "\n" використовують для переходу на новий рядок перед або після потоку виведення даних.
Робота з файлами засобами С++ передбачає використання специальнних типів даних — потоків:
При работі с текстовими файлами потрібно під'єднувати бібліотеку fstream.
Алгоритм зчитування з (текстового) файлу:
Алгоритм запису у (текстовий) файл:
Відкриття файлу можна здійснити за допомогою функції 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. Вивчення нового матеріалу й
вироблення практичних навичок
Зміст
Примітка Для задоволення вимог Державної навчальної програми для закладів загальної середньої освіти на мінімальному рівні станом на травень 2020 року достатньо здобути знання, уміння й навички щодо виконання лише завдання 1 (введення й виведення числових даних на формі).
Завдання 1. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, платформа якого містить:
Завантажити й розпакувати архів проекту, що є результатом виконання завдання попередньо виконаної практичної роботи.
Відкрити файл dialog.cbp у середовищі CodeBlocks.
На вкладенні Resources (ресурси) панелі Management клацнути по зображенні теки dialogFrame і відкрити файл dialogframe.wxs.
Форма містить контейнер wxBoxSizer для розташування об'єктів керування по горизонталі, взятий зі вкладення Layout, а сам контейнер містить кнопку wxButton, взяту зі вкладення Standard.
Запозичивши зі вкладення Standard елементи wxTextCtrl і wxStaticText, розташувати їх у контейнері wxBoxSizer так, як показано на малюнку нижче.
Для кожного з двох елементів wxTextCtrl змінити значення властивостей на такі:
Для трьох елементів wxStaticText змінити значення властивостей на такі:
Пересвідчитися, що виконання проекту (після натискання кнопки Build and run — зібрати й запустити) призводить до появи вікна такого вигляду.
Перейшовши на вкладення 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(); // Оновити на формі }
Проаналізувати код обробника. У тому числі й закоментовану частину, призначену для опрацювання дійсних чисел. Щодо конвертації інших типів для допитливих є поради в Інтернеті.
Перевірити роботу проекту, отримавши такий результат
після введення відповідних чисел у поля введення й натискання кнопки. При бажанні перевірити коректність роботи програми на довільних 4-цифрових числах.
Закоментувати ту частину обробника події натискання кнопки, що опрацьовує ввенення десяткових записів цілих чисел, і зняти коментування з відповідної частини для дійсних чисел. Перевірити роботу проекту, отримавши такий результат
після введення відповідних чисел у поля введення й натискання кнопки. При бажанні перевірити коректність роботи програми для довільних числах, запис яких містить до 4 цифр і не більше 2 цифр після десяткової крапки.
Зберегти проект, натиснувши кнопку Save all files (зберегти усі файли) і вийти з середовища CodeBlocks.
Теку з проектом записати з назвою Ваше_прізвище_1 у вказане учителем місце.
Клас wxMessageDialog — вікно інформаційного діалогу бібліотеки wxWidgets з вибором кнопок ОК, Yes, No, Cancel.
Цей клас підтримує такі стилі:
wxOK — є кнопка OК, можна поєднуватися з wxCANCEL;
wxCANCEL — є кнопка Скасувати, необхідно поєднувати або з wxOK, або з wxYES_NO;
wxYES_NO — є кнопки Так, Ні, бажано поєднувати з wxCANCEL;
wxHELP — є кнопка довідки, яка може мати особливий вигляд або особливе розташування. Її використання не підтримано, коли поле повідомлень відображено з не головного потоку в wxOSX/Cocoa. Воно взагалі не підтримано у wxOSX/Carbon. Наявне з wxWidgets 2.9.3;
wxNO_DEFAULT — кнопка Ні як усталено, використовують лише з wxYES_NO;
wxCANCEL_DEFAULT — кнопка Скасувати як усталено, використовують лише з wxCANCEL. Наразі цей стиль не підтримано (проігноровано) у wxOSX;
wxYES_DEFAULT — кнопка Так як усталено, використовують лише з wxYES_NO;
wxOK_DEFAULT — кнопка ОК як усталено;
wxICON_EXCLAMATION — знак оклику або попередження у вікні діалогу;
wxICON_ERROR — знак помилки у вікні діалогу;
wxICON_HAND — знак помилки у вікні діалогу, синонім wxICON_ERROR;
wxICON_NONE — без відображення піктограми у вікні діалогу. Піктограму буде відображено, якщо поточна платформа вимагає її використання;
wxICON_QUESTION — знак запитання, автоматично буде вжито разом із wxYES_NO. Цей стиль не підтримано для вікон діалогу під wxMSW, коли для їх реалізації використано вікно діалогу завдань. Наприклад, під час роботи під Windows Vista або новішими версіями, бо в інструкціях Microsoft вказано, що жоден значок не повинен бути використаний для звичайних підтверджень: якщо його вказано, жодну піктограму не буде відображено;
wxICON_INFORMATION — символ інформаційного повідомлення, який використовують як усталено, якщо wxYES_NO не вказано;
wxICON_AUTH_NEEDED — символ автентифікації. Цей стиль підтримано лише для вікон повідомлень під wxMSW, коли для їх реалізації використтано вікно діалогу завдань (тобто під час роботи під Windows Vista або новішими версіями). В інших випадках буде використана логіка вибору значків як усталено (для операційної системи). Цей стиль можна поєднувати з іншими, щоб забезпечити запасний варіант. Наприклад, використання wxICON_AUTH_NEEDED | wxICON_QUESTION покаже символ щита у Windows Vista й вище та символ запитання на інших платформах. Досяжно з wxWidgets 2.9.5;
wxSTAY_ON_TOP — поле повідомлень залишає над усіма іншими вікнами, а не лише з його батьківським. Наразі реалізовано лише в MSW та GTK;
wxCENTRE — відцентроване поле повідомлень на його батьківському екрані або на екрані, якщо батька не вказано. Встановлення цього стилю під MSW зайве, бо у цьому випадку вікно діалогу завжди центровано на батьківському.
Завдання 2. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що викликає такі вікна діалогу з усіма переліченими кнопками і значнами, а вигляд останнього вікна залежить від того, яку кнопку з Yes, No, Cancel було натиснуто у передостаньому вікні.
Вказівки до виконання
Завантажити й розпакувати архів проекту, що є результатом виконання завдання попередньо виконаної практичної роботи.
Відкрити файл dialog.cbp у середовищі CodeBlocks.
На вкладенні Resources (ресурси) панелі Management клацнути по зображенні теки dialogFrame і відкрити файл dialogframe.wxs.
Форма містить контейнер wxBoxSizer для розташування об'єктів керування по горизонталі, взятий зі вкладення Layout, а сам контейнер містить кнопку wxButton, взяту зі вкладення Standard.
Перейшовши на вкладення 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) показують, як отримати дані про те, яку кнопку натиснуто.
Запустити проект на виконання і послідовно закривати вікна діалогу, натискаючи на їхні кнопки. Для теми Mint-X операційної системи Linux Mint 18.1 ці вікна мають такий вигляд:
Пересвідчитися, що залежно від того, яку кнопку буде натиснено в останньому вікні, відображеному вище, у відповідь буде отримано одне з таких вікон:
Зауважте, що закриття вікна без натискання кнопки еквівалентне натисканню кнопки Cancel.
Якщо зовнішній вигляд останніх 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
wxPD_APP_MODAL — модальний діалог. Якщо не вказано цей стиль, то буде заблоковано введення у батьківське вікно. Якщо вказано цей стить, то недосяжними стають також всі інші вікна програми.
wxPD_AUTO_HIDE — діалог буде приховано з екрану, але не знищено, щойно буде досягнуто максимальне значення індикатора поступу. Застосунок має знищити діалог самостійно.
wxPD_CAN_ABORT — діалог матиме кнопку для скасування. Після її натискання наступний виклик методу Update поверне false.
wxPD_ELAPSED_TIME — буде показано час, що минув з його створення.
wxPD_ESTIMATED_TIME — буде показано очікуваний час виконання операції.
wxPD_REMAINING_TIME — буде показано очікуваний час до завершення виконання операції.
Застосунок має викликати метод Update з деяким значенням (від нуля до максимального, визначеного в конструкторі) і, можливо, новим повідомленням, яке потрібно
показати у вінкі діалогу. Щоб показати діалог знову, потрібно викликати Resume.
Примітка. У кожному наступному завданні кроки 1-3 і область виконання кроку 4 збігаються з тими, що є у вказівках до завдання 2, якщо їх виконувати "з нуля". Тому їх не описано далі. А різниця у коді обробника події натискання кнопки та вказівках до перевірки коректності коду (кроки, починаючи з 4-го). Після виконання одного завдання доцільно пропускати кроки 1-3 наступного завдання й одразу переходити до 4-го кроку.
Завдання 3. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що викликає такі вікна діалогу з усіма переліченими кнопками і значнами, а вигляд останнього вікна залежить від того, яку кнопку з Yes, No, Cancel було натиснуто у передостаньому вікні.
Вказівки до виконання
Змінити код обробника події натискання кнопки форми на такий:
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();} }
На початку коду dialogMain.cpp вказати таку директиву препроцесора:
#include <wx/progdlg.h>
Запустити проект на виконання і пересвідчитися у коректності роботи, спостерігаючи відстеження процесу відліку:
Вікно діалогу з порадами на початку або навіть у процесі роботи — риса, притаманна багатьом застосункам. Такі поради, на думку розробників, допомагають користувачу-початківцю навчитися ефективно використовувати застосунок. Поради сприяють вивченню застосунку маленькими шматками, що легко сприймаються. Такий підхід здається привабливими й корисними тим, хто не люблять читати документацію.
Для виклику вікна діалогу з порадами необхідно викликати функцію wxShowTip з такими аргументами: батьківське вікно, покажчик на об'єкт wxTipProvider і необов'язкове логічне значення, яке визначає, чи показувати прапорець «Show Tips at Startup» (показувати поради спочатку). Діалог повертає значення цього прапорця.
Щоб використати власне джерело порад, необхідно успадкувати властивості від wxTipProvider і перевизначити метод GetTip, який повинен повертати рядок wxString, що містить пораду. Бібліотека wxWidgets вже містить одну таку реалізацію wxCreateFileTipProvider, яка приймає на вхід назву файлу з порадами (по одній у рядку) і номер рядка в цьому файлі (нумерацію починають з нуля). Застосунок має видалити об'єкт класу wxTipProvider самостійно, коли той стане не потрібним.
Для роботи з переліченими вище функціями на початку коду необхідно вказати таку директиву препроцесора:
#include <wx/tipdlg.h>
Завдання 4. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що викликає вікно діалогу з порадами, записаними у файлі input.txt.
Вказівки до виконання
Змінити код обробника події натискання кнопки форми на такий:
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; }
На початку коду dialogMain.cpp вказати таку директиву препроцесора:
#include <wx/tipdlg.h>
Скопіювати файл input.txt у теку, що містить файл проекту dialog.cbp.
Запустити проект на виконання і пересвідчитися у коректності роботи:
Діалог для роботи з файлами wxFileDialog надає можливість користувачеві вибрати один або кілька файлів. Існують також варіанти для відкриття і збереження файлу. При створенні wxFileDialog йому необхідно передати батьківське вікно, повідомлення для користувача, каталог як усталено, назву файлу як усталено, маску, стиль, розташування і розмір (останні два параметри можуть ігноруватися реалізацією). Далі необхідно викликати ShowModal і порівняти повернуте значення з wxID_OK. Рівність означає, що користувач
підтвердив свій вибір.
Теку й назву файлу розглядають як окремі елементи повного шляху до файлу. Якщо тека порожня, то буде використано поточну теку. Якщо назва файлу порожня, то користувачеві не буде запропоновано назву файлу як усталено.
Маска визначає, які файли потрібно показати. Маска може містити визначення для декількох типів файлів з описом кожного з них. Наприклад,
"JPEG files (*.jpeg)|*.jpeg|GIF files (*.gif)|*.gif|PNG files (*.png)|*.png"
Якщо користувач напише назву файлу з груповими символами («*», «?») у поле для назви й натисне «OK», то буде показано лише файли, які задовольняють такому шаблону.
Стилі wxFileDialog
Для діалогу з множинним вибором GetPaths дозволяє отримати масив wxArrayString вибраних файлів, включаючи шлях до них.
Для вибору файлу на початку коду необхідно вказати таку директиву препроцесора:
#include <wx/filedlg.h>
Завдання 5. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що викликає два вікна діалогу для роботи з файлами: одне для вибору одного файлу, інше для вибору кількох файлів. Після вибору організувати виведення повного шляху до файлу (файлів).
Вказівки до виконання
Змінити код обробника події натискання кнопки форми на такий:
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("с:").
На початку коду dialogMain.cpp вказати таку директиву препроцесора:
#include <wx/filedlg.h>
Запустити проект на виконання і пересвідчитися у коректності роботи:
Діалог для вибору тек wxDirDialog надає можливість вибрати локальну або мережеву теку.
При створенні діалогу йому необхідно передати батьківське вікно, повідомлення для користувача, теку як усталено, стиль, розташування і розмір. Останні два параметри можуть ігноруватися реалізацією. Далі необходно викликати ShowModal. Рівність повернутого значення і wxID_OK означає, що користувач підтвердив свій вибір.
Стиль wxDD_NEW_DIR_BUTTON передбачає можливість створювати нову теку.
Методи wxDirDialog
Для вибору теки на початку коду необхідно вказати таку директиву препроцесора:
#include <wx/dirdlg.h>
Завдання 6. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що викликає вікно діалогу для вибору теки. Після вибору організувати виведення назви теки у повідомлення.
Вказівки до виконання
Змінити код обробника події натискання кнопки форми на такий:
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("с:").
На початку коду dialogMain.cpp вказати таку директиву препроцесора:
#include <wx/dirdlg.h>
Запустити проект на виконання і пересвідчитися у коректності роботи:
Діалог для вибору кольору wxColourDialog надає можливість вибрати колір із запропонованої палітри або з усього різноманіття кольорів.
Вигляд вікна діалогу для вибору кольору залежить від використовуваної операційної системи. Але у будь-якому випадку на ньому подано палітру з 16 налаштовуваних кольорів, яку можна змінювати як програмно, так і під час діалогу. Створений колір можна додати у палітру налаштовуваних кольорів. При цьому новий колір замінює вибраний колір або самий перший, якщо жоден із кольорів палітри не вибрано.
При використанні ОС Windows вікно діалогу містить додатково: в лівому верхньому куті — палітру з 48 часто використовуваних кольорів, а праворуч — 3 повзунки, які визначають червону, зелену і синю компоненти кольору. При інших ОС замість повзунків можуть бути інші елементи інтерфейсу.
Для використання діалогу потрібно створити об'єкт класу wxColourDialog, передати йому батьківське вікно і покажчик wxColourData на палітру налаштовуваних кольорів. Інформацію з wxColourData буде використано для заповнення діалогу значеннями кольорів. Далі необхідно викликати метод ShowModal для діалогу. Коли керування повернеться у код, можна отримати вибір користувача, викликавши GetColourData.
Методи wxColourData
GetChooseFull — повертає значення висловлювання: «діалог повністю розкрито»;
GetColour — повертає колір, вибраний користувачем;
GetCustomColour — повертає налаштований колір, який може змінити користувач;
SetChooseFull — діалог повністю розкритий (наразі працює лише під Windows);
SetColour — встановлює колір як усталено, що буде показано у діалозі;
SetCustomColour — отримує індекс (число від 0 до 15) і об'єкт класу wxColour і встановлює один з 16 налаштовуваних кольорів палітри.
Для можливості вибору кольору на початку коду необхідно вказати таку директиву препроцесора:
#include <wx/colordlg.h>
Завдання 7. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що задає нові значення 16 налаштовуваних кольорів, викликає вікно діалогу для вибору нового кольору напису кнопки і тла вікна та змінює ці кольори.
Вказівки до виконання
Змінити код обробника події натискання кнопки форми на такий:
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>
Запустити проект на виконання і пересвідчитися у коректності роботи, зробивши копію вікна діалогу для вибору кольору Choose colour (вона необхідна для виконання останнього кроку):
Переконатися, що незважаючи на наявність вказівки:
Button1->SetBackgroundColour(c);
колір кнопки не буде змінено — див останній малюнок угорі. Це пояснюють тим, що кнопку відносять до так званих корінних елементів керування, для яких не завжди є можливість змінювати колір тла під час виконання проекту.
Закоментувати або видалити рядки:
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);
Відкомпілювати проект і запустити його на виконання, щоб побачити налаштовувані кольори палітри як усталено, тобто без втручання користувача. Пересвідчитися, що палітра налаштовуваних кольорів як усталено (малюнок ліворуч нижче) відрізняється від того, якою вона була при першому виконанні проекту (малюнок праворуч нижче).
Діалог для вибору шрифту wxFontDialog надає можливість визначити гарнітуру і розмір шрифту, а на деяких платформах також і колір шрифту.
При операційній системі Windows використовують стандартний діалог вибору шрифту. Цей діалог дозволяє задати для шрифту гарнітуру (назву), розмір, написання, підкреслення / закреслення, колір шрифту й тла за ним. Внизу діалогу буде показано зразок одержуваного шрифту. Зауважимо: при конвертації шрифту з Windows у wxWidgets закреслення буде проігноровано, а гарнітуру (таку як Arial або Courier) буде замінено на відповідну (таку як Swiss або Modern).
В GTK+ використовують системний діалог вибору шрифту, який не дозволяє вибрати колір.
Для використання wxFontDialog потрібнго створити цей об'єкт та передати йому батьківське вікно й об'єкт класу wxFontData. Потім викликати метод ShowModal і порівняти повернуте значення з wxID_OK (рівність означає підтвердження вибору). Далі можна викликати GetChosenFont або GetChosenColour залежно від того, що
(гарнітуру й розмір чи колір) потрібно змінити.
Методи wxFontData
GetAllowSymbols — повертає істинність висловлювання про можливість вибрати шрифт для символу;
GetChosenFont — отримує гарнітуру wxFont, обрану користувачем;
GetColour — повертає колір, вибраний користувачем;
GetEnableEffectss — повертає істинність висловлювання про можливість ефектів;
GetShowHelp — повертає істинність висловлювання: «кнопку допомоги показано»;
EnableEffects — надає можливість ефектів — вибору кольору і підкреслення в системі Windows (не має ефекту в GTK+, при вимкнених ефектах поточний колір шрифту буде збережено;
SetAllowSymbols — надає можливість вибрати шрифт для символу (лише при при Windows);
SetColour — встановлює колір шрифта;
SetInitialFont — встановлює гарнітуру як усталено — якою вона буде на початку діалогу;
SetShowHelp — показує кнопку допомоги (лише під Windows);
SetRange — встановлює мінімальний і максимальний розміри шрифту, який користувач може вибрати. Як усталено значення (0, 0). Це означає, що будь-які обмеження відсутні. Цей метод має ефект лише в системі Windows.
Для можливості вибору гарнітури й розміру шрифта на початку коду необхідно вказати таку директиву препроцесора:
#include <wx/fontdlg.h>
Завдання 8. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що натисканням кнопки викликає вікно діалогу для вибору гарнітури й розміру шрифту і змінює відповідним чином властивості напису на кнопці.
Вказівки до виконання
Змінити код обробника події натискання кнопки форми на такий:
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) . } }
На початку коду dialogMain.cpp вказати таку директиву препроцесора:
#include <wx/fontdlg.h>
Запустити проект на виконання і пересвідчитися у коректності роботи з використанням шрифту, істотно відмінного від початкового. Наприклад, готичного.
Діалог для вибору рядка тексту wxSingleChoiceDialog показує користувачеві список рядків і пропонує йому вибрати один з них.
У конструктор діалогу передають батьківське вікно, повідомлення для показу у діалозі, заголовок і змінну wxArrayString, що містить рядки, з яких діалог робить список. Замість останнього параметра можна передати розмір масиву та масив рядків wxChar**.
Метод SetSelection дозволяє встановити вибір як усталено. Після того як діалог буде закрито, можна отримати вибір користувача за допомогою методів:
Для можливості вибору рядка на початку коду необхідно вказати таку директиву препроцесора:
#include <wx/choicdlg.h>
Завдання 9. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що натисканням кнопки викликає вікно діалогу для вибору рядка тексту виводить його у вікні повідомлення.
Вказівки до виконання
Змінити код обробника події натискання кнопки форми на такий:
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("Вибір"));// повідомлення про результат вибору }
На початку коду dialogMain.cpp вказати таку директиву препроцесора:
#include <wx/choicdlg.h>
Запустити проект на виконання і пересвідчитися у коректності роботи.
Діалог для вибору кількох рядків тексту wxMultiChoiceDialog показує користувачу список рядків і пропонує йому вибрати кілька з них.
Цей діалог схожий на wxSingleChoiceDialog: він також відображає користувачеві список рядків, але дозволяє вибрати відразу декілька з них. При створенні в конструктор діалогу передають батьківське вікно, повідомлення для показу в діалозі, заголовок і масив тину wxArrayString, що містить рядки для діалогу.
Для встановлення початкового вибору необхідно викликати метод SetSelections, передавши йому масив типу wxArrayInt, де кожен елемент визначає індекс у переданому масиві рядків.
Отримання вибору користувача з діалогу робиться за допомогою методу GetSelections, який повертає wxArrayInt з індексами обраних елементів.
Для можливості вибору рядка на початку коду необхідно вказати таку директиву препроцесора:
#include <wx/choicdlg.h>
Завдання 10. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що натисканням кнопки викликає вікно діалогу для вибору кількох рядків тексту і виводить їх у вікні повідомлення.
Вказівки до виконання
Змінити код обробника події натискання кнопки форми на такий:
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("Результат вибору")); } }
На початку коду dialogMain.cpp вказати таку директиву препроцесора:
#include <wx/choicdlg.h>
Запустити проект на виконання і пересвідчитися у коректності роботи.
Діалог для введення цілого значення wxNumberEntryDialog робить запит користувачу про ціле значення з деякого діапазону.
Число можна ввести безпосередньо або за допомогою натискань на стрілочку вгору чи вниз. При створенні діалогу йому передають батьківське вікно, текст повідомлення, текст запиту, заголовок,
початкове, мінімальне і максимальне значення, розташування. Після цього необхідно викликати метод ShowDialog. Якщо він поверне wxID_OK (буде здійснено вибір), то отримати
дані з допомогу методу GetValue.
Для можливості введення цілого числа таким чином на початку коду необхідно вказати таку директиву препроцесора:
#include <wx/numdlg.h>
Завдання 11. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що натисканням кнопки викликає вікно діалогу для вибору кількох рядків тексту і виводить їх у вікні повідомлення.
Вказівки до виконання
Змінити код обробника події натискання кнопки форми на такий:
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("Результат")); } }
На початку коду dialogMain.cpp вказати таку директиву препроцесора:
#include <wx/numdlg.h>
Запустити проект на виконання і пересвідчитися у коректності роботи.
Діалоги для введення рядка тексту wxTextEntryDialog і wxPasswordEntryDialog — це діалоги з одним полем для редагування і повідомленням.
Їхні методи повністю ідентичні, за винятком того, що текст, набраний у wxPasswordEntryDialog, буде приховано. У конструктор передають батьківське вікно, повідомлення, заголовок, початкове значення і стиль. Стиль є комбінацією wxOK, wxCANCEL і wxCENTRE (або wxCENTER), а також специфічних для wxTextCtrl стилів, таких як
wxTE_CENTRE (або wxTE_CENTER). Значення як усталено можна встановити за допомогою методу SetValue. Метод GetValue дозволяє отримати введене користувачем значення.
Для можливості введення цілого числа таким чином на початку коду необхідно вказати таку директиву препроцесора:
#include <wx/textdlg.h>
Завдання 12. Cтворити проект у середовищі CodeBlocks з використанням бібліотеки wxWigets, що натисканням кнопки викликає вікно діалогу для вибору кількох рядків тексту і виводить їх у вікні повідомлення.
Вказівки до виконання
Змінити код обробника події натискання кнопки форми на такий:
void dialogFrame::OnButton1Click(wxCommandEvent& event) { wxTextEntryDialog d(this, wxT("Рядок коментаря,\n") wxT("продовжений у наступному рядку"), wxT("Введення рядка тексту"), wxT("текст як усталено"), wxOK | wxCANCEL); if (d.ShowModal() == wxID_OK) wxMessageBox(d.GetValue(), wxT("Ведений рядок")); }
На початку коду dialogMain.cpp вказати таку директиву препроцесора:
#include <wx/textdlg.h>
Запустити проект на виконання і пересвідчитися у коректності роботи.
У внесеному коді замінити wxTextEntryDialog на wxPasswordEntryDialog, запустити проект на виконання і пересвідчитися у коректності роботи.
Примітка Додатково до перелічених вище діалогів бібліотека wxWidgets містить не описані тут такі діалоги:
6. Підведення підсумків уроку
Виставлення оцінок.
7. Домашня робота.
або виводить форму для анкети з трьома написами-заголовками, трьома полями для введення і кнопкою, натискання на яку призводить до дописування введених значень, розділених крапкою з комою, у файл input.txt;
або імітує роботу примітивного калькулятора для виконання арифметичних дій (додавання, віднімання, множення і ділення) з десятковими дробами. Аматори біблітеки Qt можуть використати Qt замість wxWidgets, керуючись настановами російською мовою для створення калькулятора.
Текст упорядкував Олександр Рудик.