Стоит Windows 8 Pro, Visual Studio 2010 Express Edition . |
Использование элементов управления MFC
Добавление кода в приложение
Мы выполнили этап визуального проектирования интерфейса пользователя для нашего приложения. Все, что мы делали, дизайнер вносил в виде кода в файл ресурсов. Пришла пора дабавить код в файлы самого приложения на языке C++. Именно этот код обеспечит функциональные возможности элементов управления в соответствии с нашим замыслом.
Связывание переменных и элементов управления
Технология создания приложений с использованием библиотеки базовых классов такова, что ресурсы существуют отдельно, а соответствующие им классы MFC - отдельно. Поэтому необходимо в коде связать эти части, назначив элементам управления соответствующие переменные, с которыми будут ассоциироваться элементы управления. Создавая код приложения, программист через эти переменные взаимодействует с самими элементами управления.
Для объявления ассоциированных переменных и связи их с элементами управления лучше использовать мастер Add Member Variable Wizard, но можно добавить переменные и вручную в объявлении класса CControlsDlg заголовочного файла ControlsDlg.h.
- Выделить элемент управления, с которым нужно связать переменную. Это можно сделать щелчком на элементе или в меню Properties через раскрывающийся список, если помнить значение идентификатора ID элемента управления.
- Через главное меню оболочки выбрать опцию Project/Add Variable. То же самое можно сделать через контекстное меню элемента, щелкнув по нему правой кнопкой мыши. Появится окно мастера Add Member Variable Wizard
-
Выделяя последовательно элементы
- IDC_MSG (Edit Control)
- IDC_COMBO_RUN (Combo Box)
- IDC_ENABLE_MSG (Check Box)
- IDC_ENABLE_PROGRAM (Check Box)
- IDC_SHOWS_MSG (Check Box)
- IDC_SHOWS_PROGRAM (Check Box) для каждого из них заполните поля мастера как указано в таблице
При этом флажок Control variable мастера должен быть включен для всех элементов. Имена переменным присваиваются в соответствии с венгерской нотацией.
-
Убедитесь, что фактически через мастер мы добавили код в объявление класса, его функцию-конструктор и функцию обмена данными между элементами и переменными.
Изменения в объявлении класса CControlsDlg файла ControlsDlg.h // CControlsDlg dialog class CControlsDlg : public CDialog { // Construction public: CControlsDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data enum { IDD = IDD_CONTROLS_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation protected: HICON m_hIcon; // Generated message map functions virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() public: // Простое поле редактирования для ввода сообщений CString m_strMessage; // Список программ запуска CString m_strRun; // Поле ввода сообщений доступно BOOL m_bEnableMsg; // Список выполнения программ доступен BOOL m_bEnableProgram; // Поле ввода сообщений видно BOOL m_bShowsMsg; // Список выполнения программ виден BOOL m_bShowsProgram; };
Инициализация переменных через заголовок конструктора класса CControlsDlg в файле ControlsDlg.cpp CControlsDlg::CControlsDlg(CWnd* pParent /*=NULL*/) : CDialog(CControlsDlg::IDD, pParent) , m_strMessage(_T("")) , m_strRun(_T("")) , m_bEnableMsg(FALSE) , m_bEnableProgram(FALSE) , m_bShowsMsg(FALSE) , m_bShowsProgram(FALSE) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }
Связывание элементов управления диалогового окна приложения с введенными переменными в функции обмена данными класса CControlsDlg в файле ControlsDlg.cppvoid CControlsDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_MSG, m_strMessage); DDX_CBString(pDX, IDC_COMBO_RUN, m_strRun); DDX_Check(pDX, IDC_ENABLE_MSG, m_bEnableMsg); DDX_Check(pDX, IDC_ENABLE_PROGRAM, m_bEnableProgram); DDX_Check(pDX, IDC_SHOWS_MSG, m_bShowsMsg); DDX_Check(pDX, IDC_SHOWS_PROGRAM, m_bShowsProgram); }
Инициализация элементов управления
-
Выполните установку начальных состояний элементов управления
Для этого нужно фактически переопределить начальные значения связанных с ними введенных переменных. Для этого
- Через панель Solution Explorer откройте файл ControlsDlg.cpp
- Вверху появившегося окна редактирования в левом раскрывающемся списке выберите класс CControlsDlg, а в правом списке - функцию OnInitDialog()
Эта функция автоматически выполняется сразу же после создания диалогового окна, ассоциированного с классом CControlsDlg. Раскрывающиеся списки редактора кода позволяют быстро позиционироваться к месту описания нужной функции-члена класса в открытом файле.
-
Внесите код инициализации в функцию как показано ниже Код инициализации переменных, ассоциированных с элементами управления, в функции
CControlsDlg::OnInitDialog() файла ControlsDlg.cpp BOOL CControlsDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here // Поместить заданное по умолчанию значение // в поле редактирования Edit Control m_strMessage = "Привет студентам!!!"; // Установить все флажки m_bEnableMsg = TRUE; m_bEnableProgram = TRUE; m_bShowsMsg = TRUE; m_bShowsProgram = TRUE; // FALSE - передать значения из переменных в элементы управления // TRUE - передать значения из элементов управления в переменные UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control }
Закрытие приложения
- Добавьте обработчик события кнопки "Выход" (идентификатор элемента управления IDC_EXIT )
Это можно сделать двумя способами:
- Выделить кнопку "Выход", открыть панель Properties и в ее панели инструментов, расположенной в верхней части, выбрать пиктограмму Control Events. Выбрать событие BN_CLICKED и в раскрывающемся списке поля добавить функцию-обработчик OnBnClickedExit() или дважды щелкнуть на имени события.
- Дважды щелкнуть по кнопке "Выход".
-
Введите код в функцию-обработчик
Обработчик события BN_CLICKED файла ControlsDlg.cpp void CControlsDlg::OnBnClickedExit() { // TODO: Add your control notification handler code here OnOK(); // Вызов функции закрытия окна // базового класса CDialog }
Поскольку проектируемое диалоговое окно - главное окно приложения, то его закрытие приведет к закрытию всего приложения.
Обратите внимание, что при создании обработчика событий в таблице сообщений класса CControlsDlg появилась связка
Связка элемента управления IDC_EXIT с обработчиком в таблице сообщений файла ControlsDlg.cpp BEGIN_MESSAGE_MAP(CControlsDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_EXIT, OnBnClickedExit) END_MESSAGE_MAP()
В раскрывающемся списке методов класса добавилась новая функция-обработчик OnBnClickedExit(), а в объявлении класса появился ее прототип
Прототип функции-обработчика, добавленный в объявление класса CControlsDlg файла ControlsDlg.h // CControlsDlg dialog class CControlsDlg : public CDialog { .... afx_msg void OnBnClickedExit(); };
Отображение пользовательского сообщения
- Добавьте обработчик события кнопки "Отобразить сообщение" (идентификатор элемента управления IDC_SHOW_MSG )
-
Для создания обработчика дважды щелкните на кнопке и наполните обработчик следующим кодом
Обработчик кнопки "Отобразить сообщение" файла ControlsDlg.cpp void CControlsDlg::OnBnClickedShowMsg() { // TODO: Add your control notification handler code here // Передать видимое на экране значение поля ввода в переменную UpdateData(TRUE); // Отобразить сообщение для пользователя MessageBox(m_strMessage); }
Очистка поля ввода пользовательского сообщения
-
Обработайте кнопку "Очистить сообщение"
Обработчик кнопки "Очистить сообщение" файла ControlsDlg.cpp void CControlsDlg::OnBnClickedClearMsg() { // TODO: Add your control notification handler code here // Очистить сообщение m_strMessage = ""; // Обновить экран UpdateData(FALSE); }
Фактически в обработчике мы присвоим переменной m_strMessage пустую строку.
Восстановление сообщения
-
Обработайте кнопку "Сообщение по умолчанию"
Обработчик кнопки "Сообщение по умолчанию" файла ControlsDlg.cpp void CControlsDlg::OnBnClickedClearMsg() { // TODO: Add your control notification handler code here // Задать сообщение по умолчанию m_strMessage = "Привет студентам от Снеткова!"; // Обновить экран UpdateData(FALSE); }