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

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

Добавление собственного диалогового окна

Добавим собственное диалоговое окно, которое будет предлагать пользователю поле редактирования, группу радиокнопок. Когда пользователь щелкнет на кнопке OK, введенный им текст отобразится в главном окне приложения. Для этого нужно будет выполнить следующие действия:

  1. Добавить новое диалоговое окно к ресурсам приложения
  2. Создать дизайн диалогового окна, разместив в нем необходимые элементы
  3. Содать для управления ресурсом класс на базе класса CDialog
  4. Связать переменные с элементами управления диалога
Создание макета диалогового окна
  • Выберите вкладку Resource View, выделите узел Dialogs и через контекстное меню или главное меню оболочки выполнилните опцию Add Resourcе. Появится окно Add Resource

  • Выделите в нем пиктограмму Dialog и щелкните на кнопке New. Оболочка создаст заготовку

  • В панели Resource View выделите сгенерированный ресурс с дежурным именем IDD_DIALOG1 и через панель свойств присвойте ресурсу осмысленный идентификатор IDD_MESSAGEDLG. Не удаляйте кнопки OK и Cancel
  • Отредактируйте ресурс диалогового окна в соответствии с таблицей свойств
    Таблица свойств диалогового ресурса IDD_MESSAGEDLG
    Элемент управления Свойство Значение
    Форма Caption Диалог с сообщениями и опциями
    Font(Size) MS Sans Serif(10)
    Maximize Box False
    Minimize Box False
    Static Text Caption Введите сообщение:
    Right Align Text True
    Edit Control ID IDC_EMESSAGE
    Multiline True
    Auto VScroll True
    Horizontal Scroll True
    Group Box Caption Выбор опции
    Radio Button ID IDC_ROPTION1
    Caption Опция 1
    Group True
    Radio Button ID IDC_ROPTION2
    Caption Опция 2
    Group False
    Radio Button ID IDC_ROPTION3
    Caption Опция 3
    Group False
    Radio Button ID IDC_ROPTION4
    Caption Опция 4
    Group False

При редактировании диалогового ресурса периодически проверяйте дизайн кнопкой 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 и добавьте две переменные через мастера, как показано ниже
    Переменные элементов управления диалога CMsgDlg
    ID (Объект связывания) Name (Имя) Type ( Тип) Category ( Категория) Accass ( Доступ) Назначение
    IDC_EMESSAGE m_strMessage Value CString public Для хранения значений поля редактирования
    IDC_ROPTION1 m_iOption Value int public Для распознавания выбранной радиокнопки


Мастер добавит в приложение код

Файл 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++ нумерация элементов массива или группы начинается с нуля.

Александр Даниленко
Александр Даниленко
Стоит Windows 8 Pro, Visual Studio 2010 Express Edition .