Опубликован: 17.08.2010 | Доступ: свободный | Студентов: 999 / 59 | Оценка: 4.11 / 3.89 | Длительность: 29:38:00
Самостоятельная работа 6:

Диалоговые окна MFC

Общие (стандартные) диалоги

В библиотеки MFC предусмотрено несколько классов C++, предназначенных для поддержки общих (стандартных) диалогов

Классы стандартных диалогов
Класс Тип диалога
CFileDialog Выбор файла для чтения или записи
CFontDialog Выбор шрифта
CColorDialog Выбор цвета
CPageSetupDialog Установка параметров страницы для печати
CPrintDialog Печать
CFindReplaceDialog Поиск и замена

Все эти диалоговые окна используются одинаково, хотя отдельные свойства и функции класса отличаются в зависимости от назначения диалога.

Для использования конкретного диалога нужно выполнить следующее

  1. Объявить переменную типа заданного класса (создать объект на стеке). Иногда лучше создать указатель на экземпляр класса, а затем запросить у операционной системы память на куче оператором new, своевременно освободив ее оператором delete после закрытия диалога и выборки из него необходимой информации
  2. Перед отображением диалога установить все его необходимые свойства
  3. Для отображения диалога вызвать метод DoModal() класса. Класс CFindReplaceDialog создает немодальное окно, поэтому для него вместо метода DoModal() нужно вызывать метод Create()
  4. Получить возвращаемое методом DoModal() значение, чтобы определить на какой кнопке щелкнул пользователь - на OK или Cancel
  5. Если пользователь щелкнул на кнопке OK, то прочитать все необходимые для дальнейшей работы приложения свойства, которые могли быть установлены пользователем в окне диалога. Для этого имеются методы доступа к свойствам класса, которые имеет смыcл применять для чтения только после того, как завершиться выбор пользователя нажатием кнопки OK

Любое диалоговое окно может отображаться в двух режимах:

  1. Модальном ( modal ) - всякое иное взаимодействие пользователя с приложением приостанавливается до закрытия диалога. Модальные диалоговые окна применяются тогда, когда без завершения забора информации от пользователя продолжение работы приложения будет неопределенным. Пример - типовые окна сообщений
  2. Немодальном ( modeless ) - пользователь может переключиться на основное окно приложения, не завершив диалог. Пример - окно "Find and Replace" (Найти и Заменить)
Класс CFileDialog

Класс CFileDialog реализует содание двух типов диалогов, который зависит от того, с каким аргументом для конструктора класса создается экземпляр - окно диалога:

"	CFileDialog openFile(TRUE);  // создается окно Open File 
"	    
"	CFileDialog saveFile(FALSE); // создается окно Save File

Конструктору можно передать несколько аргументов, задав тем самым расширения отображаемых файлов (фильтры), маршрут, начальное имя файла и начальный путь по умолчанию. Все эти аргументы конструктора имеют значения по умолчанию, так что не обязательно указывать явно ни один из них.

Основные методы доступа класса CFileDialog
Функция Описание
GetPathName() Возвращает полный путь выбранного файла
GetFileName() Возвращает имя выбранного файла
GetFileExt() Вовращает расширение выбранного файла
GetFileTitle() Возвращает имя выбранного фвйла без расширения (например, если был выбран файл "MyFile.txt", то вернется "MyFile"

Примечание. Все перечисленные в таблице методы не могут вызываться до тех пор, пока не будет вызван метод DoModal() и пока он не вернет значение IDOK. Иначе в свойствах может храниться кодовый мусор.

Класс CFontDialog

Класс CFontDialog инкапсулирует встроенный в Windows стандартный диалог выбора шрифта. В таблице приводятся основные методы-члены класса CFontDialog.

Основные методы доступа класса CFontDialog
Функция Описание
GetFaceName() Возвращает имя выбранного шрифта.
GetStyleName() Возвращает начертание выбранного шрифта (вид шрифта, тип шрифта). К одному типу шрифта может относиться несколько различных шрифтов.
GetSize() Возвращает размер, указанный для выбранного шрифта.
GetColor() Возвращает цвет, указанный для выбранного шрифта.
GetWeight() Возвращает вес, указанный для выбранного шрифта.
IsStrikeOut() Возвращает логическое значение, позволяющее определить, был ли выбран атрибут "зачеркнутый" ( strike out ) для выбранного шрифта.
IsUnderline() Возвращает логическое значение, позволяющее определить, был ли выбран атрибут "подчеркнутый" ( underline ) для выбранного шрифта.
IsBold() Возвращает логическое значение, позволяющее определить, был ли выбран атрибут "полужирный" ( bold ) для выбранного шрифта.
IsItalic() Возвращает логическое значение, позволяющее определить, был ли выбран атрибут "курсив" ( italic ) для выбранного шрифта.
Класс CColorDialog

Класс CColorDialog инкапсулирует стандартный диалог выбора цвета, используемый во многих Windows -приложениях для получения значений координат модели цвета RGB (RedGreenBlue) , которые затем можно передать любому методу интерфейса графических устройств GDI (Graphic Device Interface) , требующему код цвета. В таблице приводятся основные методы-члены класса CColorDialog

Основные методы доступа класса CColorDialog
Функция Описание
GetColor() Возвращает выбранный цвет.
GetSavedCustomColor() Возвращает массив созданных пользователем цветов.
SetCurrentColor() Устанавливает текущий цвет. Вызывать данный метод следует перед вызовом метода DoModal().
Класс CPageSetupDialog

Класс CPageSetupDialog инкапсулирует диалог Page Setup (параметры страницы), который используется для настройки вывода на печать.Этот диалог позволяет выбрать принтер, размер и поля печатаемой страницы. В таблице приводятся основные методы-члены класса CPageSetupDialog

Основные методы доступа класса CPageSetupDialog
Функция Описание
CreatePrinterDC() Возвращает контекст устройства, используемого для печати
GetDeviceName() Возвращает имя выбранного принтера
GetDevMode() Возвращает структуру, содержащую информацию о выбранном принтере и его возможностях (цветной или черно-белый)
GetMargins() Этому методу в качестве аргументов передаются два указателя - либо на класс CRect, либо на структуру RECT, - а он заносит в класс или структуру размеры полей и области печати
GetPaperSize() Возвращает класс CSize, который определяет текущий размер бумаги
GetDriveName() Возвращает имя драйвера выбранного принтера
GetPortName() Возвращает имя выбранного порта вывода
Класс CPrintDialog

Класс CPrintDialog инкапсулирует стандартный диалог Print. Он содержит большинство методов класса CPageSetupDialog, за исключением методов GetMargins() и GetPaperSize(). Прочие важные функции класса CPrintDialog приведены в таблице

Прочие важные методы доступа класса CPrintDialog
Функция Описание
GetCopies() Возвращает количество печатаемых копий
GetFromPage() Возвращает номер начальной страницы (в случае, если был задан диапазон номеров печатаемых страниц)
GetToPage() Возвращает номер конечной страницы (в случае, если был задан диапазон номеров печатаемых страниц)
GetPrinterDC() Возвращает дескриптор контекста устройства для указанного принтера
PrintAll() Возвращает логическое значение, позволяющее определить, нужно ли печатать все страницы текущего документа
PrintCollate() Возвращает логическое значение, позволяющее определить, желает ли пользователь, чтобы страницы были разобраны по копиям
PrintRange() Возвращает логическое значение, позволяющее определить, задан ли диапазон номеров печатаемых страниц
PrintSelection() Возвращает логическое значение, позволяющее определить, нужно ли печатать только выбранные элементы или страницы целиком

В отличие от методов класса CPageSetupDialog, метод CreatePrinterDC() можно вызывать без предварительного вызова метода DoModal(). Отображать этот диалог перед печатью необязательно, но класс CPrintDialog можно использовать для получения информации о принтере и контексте устройства.

Класс CFindReplaceDialog

Класс CFindReplaceDialog инкапсулирует стандартный диалог поиска и замены. В отличии от других стандартных диалогов, это окно немодальное, поэтому для отображения данного диалога нужно вызывать вместо метода DoModal() метод Create(). Метод Create() может принимать пять параметров, два первых из которых обязательны:

  1. Первый параметр - это логическое значение, указывающее, предназначается ли диалог только для поиска ( TRUE ) или для поиска и замены ( FALSE )
  2. Второй параметр - строка, которую нужно искать
  3. Третий параметр - строка замены
  4. Четвертый параметр - направление поиска. По умолчанию задано направление "вперед" (обозначается константой FR_DOWN ). Направление "назад" устанавливается значением 0
  5. Пятый параметр - указатель на родительское окно приложения

Принципы работы с классом CFindReplaceDialog более сложные, чем с другими классами стандартных диалогов. Мы их здесь рассматривать не будем. В таблице приводятся основные методы-члены класса CFindReplaceDialog

Основные методы доступа класса CFindReplaceDialog
Функция Описание
FindNext() Возвращает логическое значение, указывающее, нужно ли найти следующее вхождение искомой строки
GetFindString() Возвращает введенную пользователем строку для поиска
GetReplaceString() Возвращает введенную пользователем строку для замены
IsTerminating() Возвращает логическое значение, позволяющее определить, решил ли пользователь закрыть этот диалог
MatchCase() Возвращает логическое значение, которое указывает, нужно ли в поиске строки учитывать регистр
MatchWholeWord() Возвращает логическое значение, которое указывает, нужно ли искать слово только целиком
ReplaceAll() Возвращает логическое значение, которое указывает, нужно ли заменить все вхождения искомой строки
ReplaceCurrent() Возвращает логическое значение, которое указывает, нужно ли заменить текущее найденное вхождение искомой строки
SearchDown() Возвращает логическое значение, которое указывает, нужно ли выполнить поиск вперед от текущей позиции
Подключение стандартного диалога File Open к приложению
  • Создайте обработчик для кнопки "Диалог File Open"
  • Заполните его кодом
    Обработчик для щелчка по кнопке "Диалог File Open"
    void CDialogsDlg::OnBnClickedBFileopen()
    {
    	CFileDialog openFile(TRUE); // Создать диалог
    	if(openFile.DoModal() == IDOK){ // Отобразить и получить результат
    		m_strResult = openFile.GetFileName(); // Сохранить имя файла
    		UpdateData(FALSE); // Передать на экран
    	}
    }
Александр Даниленко
Александр Даниленко
Стоит Windows 8 Pro, Visual Studio 2010 Express Edition .