Стоит Windows 8 Pro, Visual Studio 2010 Express Edition . |
Диалоговые окна MFC
Добавление собственного диалогового окна
Добавим собственное диалоговое окно, которое будет предлагать пользователю поле редактирования, группу радиокнопок. Когда пользователь щелкнет на кнопке OK, введенный им текст отобразится в главном окне приложения. Для этого нужно будет выполнить следующие действия:
- Добавить новое диалоговое окно к ресурсам приложения
- Создать дизайн диалогового окна, разместив в нем необходимые элементы
- Содать для управления ресурсом класс на базе класса CDialog
- Связать переменные с элементами управления диалога
Создание макета диалогового окна
- Выберите вкладку Resource View, выделите узел Dialogs и через контекстное меню или главное меню оболочки выполнилните опцию Add Resourcе. Появится окно Add Resource
- Выделите в нем пиктограмму Dialog и щелкните на кнопке New. Оболочка создаст заготовку
- В панели Resource View выделите сгенерированный ресурс с дежурным именем IDD_DIALOG1 и через панель свойств присвойте ресурсу осмысленный идентификатор IDD_MESSAGEDLG. Не удаляйте кнопки OK и Cancel
-
Отредактируйте ресурс диалогового окна в соответствии с таблицей свойств
При редактировании диалогового ресурса периодически проверяйте дизайн кнопкой Test Dialog панели инструментов Dialog Editor. Размеры элементов управления контролируйте через панель состояния дизайнера. Для выравнивания элементов пользуйтесь инструментами на панели инструментов или опциями меню Format оболочки.
Окончательный вариант макета приведен на рисунке
Отметьте, что для согласованной работы радиокнопок мы для первого переключателя установили свойство Group в состояние True. В остальных же переключателях оставили его значение по умолчанию False. Это приведет к тому, что следующие по порядку их создания радиокнопки будут объединены в группу. Новая группа начнется с нового следующего по порядку создания радиопереключателя со свойством True (но у нас только одна группа). Порядок следования радиопереключателей можно посмотреть через опцию Edit/Resource Symbols (или через контекстное меню в панели Resource View, щелкнув на узле Dialogs.rc ) в окне Resource Symbols
Отредактировать порядок радиопереключателей можно в файле Resource.h, открыв его на редактирование через панель Solution Explorer (не рекомендуется!!!)
В этом файле оболочка формирует именованные константы
Именованные константы в файле Resource.h //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by Dialogs.rc // #define IDD_DIALOGS_DIALOG 102 #define IDR_MAINFRAME 128 #define IDD_MESSAGEDLG 131 #define IDC_B_YESNOCANCEL 1000 #define IDC_B_ABORTRETRYIGNORE 1001 #define IDC_B_CUSTOMDIALOG 1002 #define IDC_B_WHICHOPTION 1003 #define IDC_E_RESULT 1004 #define IDC_EMESSAGE 1005 #define IDC_B_FILEOPEN 1006 #define IDC_ROPTION1 1006 #define IDC_B_EXIT 1007 #define IDC_ROPTION2 1007 #define IDC_ROPTION3 1008 #define IDC_RADIO4 1009 #define IDC_ROPTION4 1009 ............................................
Создание управляющего класса
Для управления диалоговым ресурсом создайте класс на основе базового класса CDialog. Для этого:
-
Выберите только что сконструированное окно приложения в режиме дизайна и через контекстное меню (или главное меню Project ) выполните опцию Add Class
Запустится мастер добавления класса, который нужно настроить в соответствии с рисунком
-
Убедитесь, что в поле Base class выбран CDialog
После создания класса его код должен быть размещен в двух новых файлах MsgDlg.h и MsgDlg.cpp. Убедитесь в этом через панель Solution Explorer. Удобнее при создании новых классов размещать их в отдельных файлах. Мастер Add Class создал производный класс-потомок на основании базового класса CDialog, поддерживающего диалоговые окна
Объявление производного класса CMsgDlg, наследника CDialog (код файла MsgDlg.h) #pragma once // CMsgDlg dialog class CMsgDlg : public CDialog { DECLARE_DYNAMIC(CMsgDlg) public: CMsgDlg(CWnd* pParent = NULL); // standard constructor virtual ~CMsgDlg(); // Dialog Data enum { IDD = IDD_MESSAGEDLG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support DECLARE_MESSAGE_MAP() };
-
Добавьте две ассоциированные переменные к элементам управления. Для этого выделите в панели Class View класс CMsgDlg и добавьте две переменные через мастера, как показано ниже
Мастер добавит в приложение код
Файл MsgDlg.h class CMsgDlg : public CDialog { ................................................ public: // Для хранения значений поля редактирования CString m_strMessage; // Для распознавания выбранной радиокнопки int m_iOption; };
Файл MsgDlg.cpp CMsgDlg::CMsgDlg(CWnd* pParent /*=NULL*/) : CDialog(CMsgDlg::IDD, pParent) , m_strMessage(_T("")) , m_iOption(0) { } void CMsgDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EMESSAGE, m_strMessage); DDX_Radio(pDX, IDC_ROPTION1, m_iOption); }
Для переключателя с установленным свойством Group мы назначили ассоциированную целочисленную переменную m_iOption. Значение этой переменной зависит от того, какой из переключателей группы будет выбран пользователем. При выборе первого переключателя "Опция 1" эта переменная принимает значение 0, при выборе второго - значение 1, и т.д. , поскольку в C++ нумерация элементов массива или группы начинается с нуля.