Стоит Windows 8 Pro, Visual Studio 2010 Express Edition . |
Диалоговые окна MFC
При работе с большинством приложений возникают ситуации, когда приложение запрашивает от пользователя некоторую информацию. В большинстве случаев для запроса открывается новое окно. Такие окна называются диалоговыми. Диалоговые окна обычно содержат несколько элементов управления и текст с пояснениями о запрашиваемой информации. В них нет такой обширной пустой рабочей области, как в редакторах.
Цель работы
- Более гибко использовать диалоговые окна
- Вызывать другие диалоговые окна и получать введенную в них пользователем информацию, а затем использовать ее в главном окне приложения
- Использовать стандартные диалоговые окна и конструируемые диалоги
Использование существующих (системных) диалоговых окон
В библиотеке MFC (как и в других подобных библиотеках) заготовлены некоторые виды типовых диалоговых окон для взаимодействия с пользователем:
- Окна сообщений
- Общие и стандартные диалоги
Окна сообщений
Простые диалоговые окна сообщений реализуются двумя функциями
- MessageBox() - является членом класса CWnd, поэтому доступна только для потомков этого класса. Это означает, что ее можно вызывать только из оконного класса или класса элемента управления. Имеет три параметра, которые можно передавать по порядку один, два или три
- AfxMessageBox() - применяется тогда, когда нужно открыть окно сообщения из класса, не являющегося потомком CWnd. Имеет два параметра. Ее можно вызывать и из класса-потомка CWnd
Назначение параметров по порядку:
- Текст сообщения, размещаемый в клиентской области окна
- Текст заголовка окна сообщения (необязательный, а у функции AfxMessageBox() - отсутствует вообще)
- Определяет кнопки и пиктограммы, которые размещаются в окне сообщения (необязательный). Если этот параметр необходим, то должен быть указан и второй параметр, пусть даже в виде пустой строки. Для комбинированного параметра применяется операция побитового ИЛИ для идентификаторов кнопок и пиктограмм
Сочетание кнопок и пиктограмм, определяемых третьим параметром (у функции 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
- Нажмите на пиктограмму Test Dialog панели инструментов Dialog Editor и получите внешний вид макета диалогового окна, как оно должно смотреться в работающем приложении
Создание переменных элементов управления (Edit Control и Button "Какая опция?"), а также обработчиков первых двух кнопок
-
Создайте и свяжите с полем редактирования и кнопкой "Какая опция?" две переменные
-
Создайте обработчик для щелчка на первой кнопке "Да, Нет, Отмена"
Обработчик для щелчка по первой кнопке "Да, Нет, Отмена" 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