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

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

Аннотация: Использование существующих (системных) диалоговых окон. Окна сообщений. Параметры функции MessageBox(). Создание переменных элементов управления (Edit Control и Button "Какая опция?"), а также обработчиков первых двух кнопок. Общие (стандартные) диалоги. Класс CFileDialog. Класс CFontDialog. Класс CColorDialog. Класс CPageSetupDialog. Класс CPrintDialog. Подключение стандартного диалога File Open к приложению. Добавление собственного диалогового окна. Создание макета диалогового окна. Создание управляющего класса. Подключение собственного диалога к приложению. Подключение диалога с прямым доступом к данным-членам класса CMsgDlg из класса-клиента CDialogsMsg. Подключение диалога с доступом к данным-членам класса CMsgDlg из класса-клиента CDialogsMsg через функции доступа. Изменение конфигурации проекта для его автономной работы.
Файлы к данной лабораторной работе, Вы можете скачать здесь.

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

Цель работы

  1. Более гибко использовать диалоговые окна
  2. Вызывать другие диалоговые окна и получать введенную в них пользователем информацию, а затем использовать ее в главном окне приложения
  3. Использовать стандартные диалоговые окна и конструируемые диалоги

Использование существующих (системных) диалоговых окон

В библиотеке MFC (как и в других подобных библиотеках) заготовлены некоторые виды типовых диалоговых окон для взаимодействия с пользователем:

  1. Окна сообщений
  2. Общие и стандартные диалоги

Окна сообщений

Простые диалоговые окна сообщений реализуются двумя функциями

  1. MessageBox() - является членом класса CWnd, поэтому доступна только для потомков этого класса. Это означает, что ее можно вызывать только из оконного класса или класса элемента управления. Имеет три параметра, которые можно передавать по порядку один, два или три
  2. AfxMessageBox() - применяется тогда, когда нужно открыть окно сообщения из класса, не являющегося потомком CWnd. Имеет два параметра. Ее можно вызывать и из класса-потомка CWnd

Назначение параметров по порядку:

  1. Текст сообщения, размещаемый в клиентской области окна
  2. Текст заголовка окна сообщения (необязательный, а у функции AfxMessageBox() - отсутствует вообще)
  3. Определяет кнопки и пиктограммы, которые размещаются в окне сообщения (необязательный). Если этот параметр необходим, то должен быть указан и второй параметр, пусть даже в виде пустой строки. Для комбинированного параметра применяется операция побитового ИЛИ для идентификаторов кнопок и пиктограмм

Сочетание кнопок и пиктограмм, определяемых третьим параметром (у функции AfxMessageBox() - вторым), предопределено, поэтому если необходимо что-то иное, придется создать свое диалоговое окно, похожее на стандартное. Ниже приведены все возможные значения третьего параметра

Идентификаторы комбинации кнопок в третьем параметре функции MessageBox()
Идентификатор Кнопки
MB_ABORTRETRYIGNORE Три кнопки: Abort (Прервать), Retry (Повторить), Ignore (Пропустить)
MB_OK Кнопка OK
MB_OKCANCEL Две кнопки: OK, Cancel (Отмена)
MB_RETRYCANCEL Две кнопки: Retry (Повторить), Cancel (Отмена)
MB_YESNO Две кнопки: Yes (Да), No (Нет)
MB_YESNOCANCEL Три кнопки: Yes (Да), No (Нет), Cancel (Отмена)
MB_CANCELTRYCONTINUE Три кнопки: Cancel (Отмена), Try Again (Повторить попытку), Continue (Продолжить)
Идентификаторы пиктограмм в третьем параметре функции MessageBox()
Идентификатор Пиктограммы
MB_ICONINFORMATION Информационное сообщение
MB_ICONQUESTION Вопросительный знак
MB_ICONSTOP Знак остановки
MB_ICONEXCLAMATION Восклицательный знак

Если при вызове функции окна сообщений указывается сочетание кнопок, то нужно получить возвращаемое значение, чтобы определить, по какой кнопке щелкнул пользоватаель. Возвращаемые значения являются целочисленными и их идентификаторы приведены в таблице

Идентификаторы результатов, возвращаемый функцией MessageBox()
Идентификатор Кнопка, которую выбрал пользователь
IDABORT Abort (Прервать)
IDRETRY Retry (Повторить)
IDIGNORE Ignore (Пропустить)
IDYES Yes (Да)
IDNO No (Нет)
IDOK OK
IDCANCEL Cancel (Отмена)
IDTRYAGAIN Try Again (Повторить попытку)
IDCONTINUE Continue (Продолжить)

Создание заготовки приложения

  • Создайте новый проект C++ на основе MFC и назовите его Dialogs

    Ни в коем случае не называйте проекты русскими именами, поскольку оболочка использует имя проекта при автоматической генерации имен файлов проекта и классов. Компилятор из текстов на русском принимает только комментарии и строковые константы.

  • Укажите мастеру, что проект будет диалоговым приложением
  • Остальные настройки мастера оставьте по умолчанию
  • Установите для ресурсов русский язык
  • Измените заголовок формы на "свою фамилию" + " Lab7 - Диалоги"
  • Создайте макет диалогового окна, показанный на рисунке. Для этого воспользуйтесь таблицей свойств элементов управления, приведенной ниже
  • Для выравнивания элементов диалога включите и пользуйтесь панелью инструментов "Dialog Editor" оболочки

    При выравнивании группы элементов отметьте, что первый из выделенных элементов группы является опорным: все остальные элементы подравниваются под него. Точное перемещение элементов выполняйте стрелками клавиатуры. Для быстрого просмотра результатов визуального проектирования пользуйтесь кнопкой Test Dialog панели инструментов Dialog Editor оболочки.

  • Определите порядок перехода по клавише табуляции между элементами управления

  • Обеспечьте выход по кнопке Exit
    Таблица настройки мастера создания каркаса приложения
    Свойство проекта Значение
    Вкладка Application Type
    Application Type Dialog Based
    Resource language: Английский (США)
    Project style: MFC standard
    Use of MFC: Use MFC in a shared DLL
    Вкладка Advanced Features
    Все сбросить!
    Вкладка User Interface Features
    Main frame styles: System menu
    Dialog title: Dialogs
    Таблица свойств главной диалоговой формы Dialogs
    Элемент управления Свойство Значение
    Главная форма Caption Студент Иванов. Lab7 - Диалоги
    Font(Size) MS Sans Serif(10)
    Maximize Box True
    Minimize Box True
    Button ID IDC_B_YESNOCANCEL
    Caption Да, Нет, Отмена
    Button ID IDC_B_ABORTRETRYIGNORE
    Caption Прервать, Повторить, Пропустить
    Button ID IDC_B_FILEOPEN
    Button Caption Диалог File Open
    ID IDC_B_CUSTOMDIALOG
    Caption Сконструированный диалог
    Button ID IDC_B_WHICHOPTION
    Caption Какая опция?
    Disabled True
    Static Text Caption Результаты диалога:
    Right Align Text True
    Edit Control ID IDC_E_RESULT
    Multiline True
    Auto VScroll True
    Horizontal Scroll True
    Button ID IDC_B_EXIT
    Caption Выход
  • Нажмите на пиктограмму Test Dialog панели инструментов Dialog Editor и получите внешний вид макета диалогового окна, как оно должно смотреться в работающем приложении

Создание переменных элементов управления (Edit Control и Button "Какая опция?"), а также обработчиков первых двух кнопок
  • Создайте и свяжите с полем редактирования и кнопкой "Какая опция?" две переменные
    Переменные элементов управления
    ID (Объект связывания) Name (Имя) Type ( Тип) Category ( Категория) Accass ( Доступ) Назначение
    IDC_E_RESULT m_strResult Value CString public Для хранения значений поля редактирования
    IDC_B_WHICHOPTION m_cWhichOption Control CButton Public Для управления блокированием кнопки
  • Создайте обработчик для щелчка на первой кнопке "Да, Нет, Отмена"
    Обработчик для щелчка по первой кнопке "Да, Нет, Отмена"
    void CDialogsDlg::OnBnClickedBYesnocancel()
    {
    	int iResults; // Для возвращаемого значения MessageBox()
    	
    	// Спросить пользователя
    	iResults = MessageBox(
    		"Щелкните по кнопке\nДа, Нет, Отмена"// В области клиента (символ новой строки)
    	   ,"Диалог \"Да, Нет, Отмена\"" // Заголовок окна (экраны)
    	   ,MB_YESNOCANCEL | MB_ICONINFORMATION // Комбинации кнопок и пиктограмм
    	   ); 	
    	
    	// Определить, по какой кнопке щелкнул пользователь
    	switch(iResults){ // переключатель
    		case IDYES:
    			m_strResult = "Да! Да! Да!";
    			break;
    		case IDNO:
    			m_strResult = "Нет, нет, нет, нет, нет.";
    			break;
    		case IDCANCEL:
    			m_strResult = "Жаль, что \"Отмена\"";
    		// break здесь необязательно, все равно последний
    	}
    	
    	// Выдать на экран
    	UpdateData(FALSE);
    }
  • По аналогии создайте обработчик для щелчка по второй кнопке "Прервать, Повторить, Пропустить", используя идентификатор комбинации кнопок MB_ABORTRETRYIGNORE и идентификатор пиктограмм MB_ICONEXCLAMATION
Александр Даниленко
Александр Даниленко
Стоит Windows 8 Pro, Visual Studio 2010 Express Edition .