Стандартні діалогові панелі

1. Введення

До складу бібліотеки MFC входить ряд класів, що представляють стандартні діалогові панелі. Ці класи дозволяють легко реалізувати такі часто використовувані операції, як відкриття і збереження файлу, вибір кольору, вибір шрифту і т.д. Всі ці класи успадковуються від CCommonDialog, який в свою чергу є похідним по відношенню до базового класу CDialog.

Наведемо класи стандартних діалогових панелей і їх призначення:

  • CColorDialog - Панель для вибору кольору
  • CFileDialog - Панель вибору файлів для відкриття і збереження на диску
  • CFindReplaceDialog - Панель для виконання операції пошуку і заміни
  • CFontDialog - Панель для вибору шрифту
  • CPrintDialog - Панель для виведення документа на друк
  • CPageSetupDialog - Панель вибору формату документа
  • COleDialog - Панель для управління технологією OLE

Класи, керуючі стандартними діалоговими панелями, визначені в файлі afxdlgs.h. Тому при використанні цих класів в додатку необхідно включити цей файл у вихідний текст за допомогою директиви #include.

2. Панель вибору кольору (клас CColorDialog)

Щоб відобразити на екрані стандартну діалогову панель вибору кольору, треба створити об'єкт класу CColorDialog, а потім викликати метод DoModal. При створенні об'єкта класу СColorDialog використовується наступний конструктор:

Всі параметри конструктора необов'язкові, проте в деяких випадках використання цих параметрів може допомогти.

Перший параметр clrInit дозволяє вказати колір, обраний за замовчуванням відразу після відкриття діалогової панелі. Якщо параметр не буде вказано, як колір, обраного за замовчуванням, буде використовуватися чорний колір.

Параметр dwFlags містить набір прапорів, керуючих діалогової панеллю вибору кольору. За допомогою нього блокувати або дозволяти роботу деяких елементів управління діалогової панелі вибору кольору. Якщо при створенні об'єкта класу CColorDialog й вказати параметр dwFlags, проте вона може змінювати діалогової панелі, звернувшись безпосередньо до елементу m_cc даного класу. Параметр dwFlags, вказаний в конструкторі, використовується для ініціалізації m_cc. Зміни в елемент m_cc повинні бути внесені до того, як панель буде відображатися на екрані.

Останній параметр pParentWnd можна використовувати, щоб вказати батьківське вікно діалогової панелі.

Методи класу CСolorDialog

Щоб вивести діалогову панель вибору кольору на екран, необхідно використовувати метод DoModal. Коли нарешті з'явиться панелі на екрані користувач може вибрати з неї колір і натиснути кнопки OK або Cancel для підтвердження вибору кольору або відмови від нього. Коли діалогова панель закривається, метод DoModal повертається значення IDOK і IDCANCEL, в залежності від того, яку кнопку натиснув користувач:

На екрані з'явиться стандартна діалогова панель вибору кольору Color. У верхній половині діалогової панелі розташовані 48 прямокутників, що мають різні кольори. Вони представляють так звані основні кольори (Basic colors). Можна вибрати один з цих кольорів і натиснути кнопку OK. Після того, як діалогова панель закрита (метод DoModal завершив свою роботу), можна скористатися методами класу CColorDialog, щоб дізнатися кольору, обрані користувачем.

Для визначення кольору, обраного користувачем, можна звернутися до методу GetColor класу CColorDialog. Даний метод повертає значення COLORREF, відповідне вибраному кольору.

Якщо користувачеві недостатньо основних кольорів, представлених в діалогової панелі Color, він може вибрати до 16 додаткових кольорів. Для цього він повинен натиснути кнопку DefineCustom Colors. Діалогова панель змінить свій зовнішній вигляд - з'являться додаткові органи управління, що дозволяють вибрати будь-який з 16 777 216 кольорів. Коли колір обраний, потрібно натиснути кнопку Add Custom Colors. Обраний колір буде додано до додаткових квітам (Custom colors) - один з вільних прямокутників забарвиться відповідним кольором.

За допомогою методу GetSavedCustomColors класу CColorDialog можна визначити додаткові кольори, вибрані користувачем в діалогової панелі Color. Цей метод повертає покажчик на масив з 16 елементів типу COLORREF. Кожен елемент масиву описує один додатковий колір.

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

3. Панель вибору файлів (клас CFileDialog)

Серед стандартних діалогових панелей, для яких в бібліотеці MFC створений спеціальний клас, є панелі для роботи з файловою системою - Open і Save As. Діалогова панель Open дозволяє вибрати один або кілька файлів і відкрити їх для подальшого використання. Діалогова панель Save As дозволяє вибрати ім'я файлу для запису в нього документа.

Для управління діалоговими панелями Open і Save As призначений один клас CFileDialog. Розглянемо конструктор класу CFileDialog більш докладно:

Об'єкти класу CFileDialog представляють діалогові панелі Open або Save As в залежності від параметра bOpenFileDialog. Якщо параметр bOpenFileDialog містить значення TRUE, то створюється об'єкт, керуючий діалогової панеллю Open, а якщо FALSE - діалогової панеллю Save As.

Параметр bOpenFileDialog є єдиним обов'язковим параметром, який необхідно вказати. Інші параметри конструктора класу CFileDialog задають різні режими роботи панелі і можуть не вказуватися.

Щоб створити об'єкт класу CFileDialog. представляє діалогову панель для відкриття файлів (mFileOpen), і об'єкт, який представляє діалогову панель для збереження файлів (mFileSaveAs), можна скористатися наступними викликами конструктора класу:

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

У деяких випадках потрібно, щоб діалогові панелі відображалися з уже обраним ім'ям файлу. Щоб вказати ім'я файлу, що використовується за умовчанням, застосовується параметр lpszFileName. Якщо параметр lpszFileName має значення NULL, дана можливість не реалізується.

За допомогою прапора dwFlags можна змінити зовнішній вигляд і деякі інші характеристики стандартних діалогових панелей класу CFileDialog. У нього можна записати комбінацію прапорів, які управляють різними характеристиками цих панелей. Наприклад, прапор OFN_HIDEREADONLY означає, що з діалогової панелі видаляється перемикач "Read Only", а прапор OFN_OVERWRITEPROMPT (використовуваний для панелі Save As) - що необхідно виводити діалогову панель з попередженням, якщо користувач вибирає для збереження ім'я вже існуючого файлу.

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

Список фільтрів можна вказати через параметр lpszFilter. Одночасно можна вказати кілька фільтрів. Кожен фільтр задається двома рядками - рядком, що містить ім'я фільтра, і рядком, в якій перераховані відповідні йому розширення імен файлів. Якщо одного типу відповідає кілька розширень, вони поділяються символом;. Рядок, що містить ім'я фільтра, відділяється від рядка з розширеннями файлів символом |. Якщо використовується кілька фільтрів, то вони також відокремлюються один від одного символом |. Наприклад, в якості рядка, яка задає фільтри, можна використовувати рядок виду:

Діалогові панелі, представлені об'єктами класу CFileDialog, можуть мати або не мати батьківського вікна. Щоб вказати батьківське вікно, потрібно передати конструктору CFileDialog покажчик на нього через параметр pParentWnd.

Методи класу CFileDialog

Створення об'єкта класу CFileDialog ще не викликає відображення відповідної діалогової панелі. Для цього необхідно скористатися методом DoModal класу CFileDialog.Прі виклику методу DoModal для раніше створеного об'єкта класу CFileDialog на екрані відкривається відповідна діалогова панель. Після того, як користувач завершує роботу з діалогової панеллю, метод DoModal поверне значення IDOK або IDCANCEL в разі успішного завершення і нуль - в разі виникнення помилок:

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

  • GetPathName - Визначає повний шлях до файлу
  • GetFileName - Визначає ім'я обраного файлу
  • GetFileExt - Визначає розширення імені обраного файлу
  • GetFileTitle - Дозволяє визначити заголовок обраного файлу
  • GetNextPathName - Якщо діалогова панель дозволяє вибрати відразу декілька файлів, то цей метод можна використовувати для визначення повного шляху наступного з вибраних файлів
  • GetReadOnlyPref - Дозволяє дізнатися стан атрибута "тільки для читання" (read-only) обраного файлу
  • GetStartPosition - Повертає положення першого елемента зі списку імен файлів

Найбільш важливий метод - GetPathName. Він отримує повний шлях до файлу, обраного з діалогових панелей Open або Save As. Якщо діалогова панель дозволяє вибрати відразу декілька файлів, тоді метод GetPathName повертає масив рядків, що складається з декількох рядків, що закінчуються двійковим нулем. Перша з цих рядків містить шлях до каталогу, в якому розташовані вибрані файли, інші рядки містять імена вибраних файлів. Виділення рядка, що містить шлях до каталогу, проблем не викликає, а щоб отримати імена вибраних файлів, необхідно скористатися методами GetStartPosition і GetNextPathName.

Метод GetStartPosition повертає значення типу POSITION. Воно призначене для передачі методу GetNextPathName і отримання чергового імені обраного файлу. Якщо користувач не вибрав жодного файлу, метод GetStartPosition повертає значення NULL. Значення, отримане цим методом, слід записати в тимчасову змінну типу POSITION і передати посилання на неї методу GetNextPathName. Метод GetNextPathName поверне повний шлях першого з обраних в діалогової панелі файлів і змінить значення змінної pos, переданої методу за посиланням. Нове значення pos можна використовувати для подальших викликів методу GetNextPathName і отримання шляхів всіх інших вибраних файлів. Коли метод GetNextPathName поверне імена всіх вибраних файлів, в змінну pos записується значення NULL.

У панелях Open і Save As є перемикач "ReadOnly". За замовчуванням цей преключатель не відображається. Якщо є необхідність скористатися цим перемикачем, то потрібно відмовитися від використання прапора OFN_HIDEREADONLY.

Метод GetReadOnlyPref дозволяє визначити положення перемикача "ReadOnly". Якщо перемикач включений, то метод GetReadOnlyPref повертає нульове значення. В іншому випадку GetReadOnlyPref повертає нуль.

4. Панель вибору шрифту (клас CFontDialog)

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

Для управління діалогової панеллю Font в бібліотеку класів MFC включений клас CFontDialog. Методи цього класу можна використовувати для відображення панелі Font і визначення характеристик шрифту, обраного користувачем. Конструктор класу CFontDialog:

Всі параметри конструктора є необов'язковими. Налаштування стандартної панелі вибору шрифту, яка виконується конструктором класу CFontDialog за замовчуванням, задовольняє більшості користувачів.

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

Параметр dwFlags задає набір прапорів, керуючий різними режимами роботи панелі. Наприклад, прапор CF_EFFECTS дозволяє користувачеві створювати підкреслені і перекреслені букви, визначати колір букв, а прапор CF_SCREENFONTS - дозволяє вибирати тільки екранні шрифти.

Через параметр pdcPrinter можна передати конструктору контекст відображення принтера, шрифти якого будуть представлені в діалогової панелі Font. Даний параметр використовується тільки в тому випадку, якщо в параметрі dwFlags вказані прапори CF_PRINTERFONTS або CF_BOTH.

Через параметр pParentWnd можна вказати батьківське вікно для діалогової панелі Font.

Методи класу CFontDialog

Для відображення діалогової панелі Font призначений віртуальний метод DoModal. Якщо користувач вибрав шрифт і натиснув кнопку OK, метод DoModal повертає ідентифікатор IDOK, якщо користувач скасував вибір шрифту, метод DoModal повертає ідентифікатор IDCANCEL:

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

Метод GetCurrentFont дозволяє відразу визначити всі характеристики обраного шрифту, записавши їх в структуру LOGFONT.

Решта методів класу дозволяють визначити тільки окремі характеристики обраного шрифту:

  • GetFaceName - Повертає ім'я обраного шрифту
  • GetStyleName - Повертає ім'я стилю обраного шрифту
  • GetSize - Повертає розмір вибраного шрифту
  • GetColor - Повертає колір обраного шрифту
  • GetWeight - Повертає щільність обраного шрифту
  • IsStrikeOut - Визначає, чи є шрифт виділеним перекресленою лінією
  • IsUnderline - Визначає, чи є шрифт виділеним підкресленням
  • IsBold - Визначає, чи є шрифт жирним
  • IsItalic - Визначає, чи є шрифт похилим

5. Панель для виведення документів на друк (клас CPrintDialog)

Клас CPrintDialog можна використовувати для створення двох видів діалогових панелей, призначених для друку документів і вибору форматів документів. Крім класу CPrintDialog можна також використовувати клас CPageSetupDialog. Він дозволяє створити діалогову панель для вибору формату документа, що має дещо інший вигляд.

У додатках, підготовлених з використанням засобів MFC AppWizard і побудовані за моделлю документ-вигляд, за замовчуванням вбудована можливість виведення редагованого документа на друк.

В меню File такого додатка знаходяться три рядки (Print, Print Preview і Print Setup), які керують процесом друку документів, підготовлених в додатку. Щоб роздрукувати документ, досить вибрати з меню File рядок Print. На екрані з'явиться діалогова панель Print. У ній можна вибрати принтер для друку документів (група Name), вказати, буде друкуватися весь документ або його частина (група Print range), а також скільки копій документа буде надруковано (група Copies). Також можна налаштувати різні характеристики друкувального пристрою, якщо натиснути кнопку Properties в групі Printer.

Якщо потрібно визначити тільки принтер і формат документа, з меню File слід вибрати рядок Printer Setup. У групі Printer можна вказати принтер і налаштувати його відповідним чином. Група Paper задає формат паперу і режим подачі паперу в принтер. Група Orientation включає тільки один перемикач, який визначає орієнтацію паперу. Він приймає положення Portrait для вертикальної орієнтації зображення на папері (режим "портрет") або Landscape для горизонтальної орієнтації ізобораженія на папері (режим "ландшафт").

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

6. Панель для виконання пошуку і заміни (клас CFindReplaceDialog)

Клас CFindReplaceDialog призначений для управління діалоговими вікнами Find і Replace. Діалогова панель Find використовується для пошуку відомих рядків в документі додатки, а панель Replace дозволяє заміну одного рядка на іншу.

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