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

Использование элементов управления 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 мастера должен быть включен для всех элементов. Имена переменным присваиваются в соответствии с венгерской нотацией.

    Переменные для элементов управления
    Control ID: Идентификатор Variable name: Имя переменной Category: Категория Variable type: Тип переменной Access: Доступ Comment: Комментарии
    IDC_MSG m_strMessage Value CString public Простое поле редактирования для ввода сообщений
    IDC_COMBO_RUN m_strRun Value CString public Список программ запуска
    IDC_ENABLE_MSG m_bEnableMsg Value BOOL public Поле ввода сообщений доступно
    IDC_ENABLE_PROGRAM m_bEnableProgram Value BOOL public Список выполнения программ доступен
    IDC_SHOWS_MSG m_bShowsMsg Value BOOL public Поле ввода сообщений видно
    IDC_SHOWS_PROGRAM m_bShowsProgram Value BOOL public Список выполнения программ виден
  • Убедитесь, что фактически через мастер мы добавили код в объявление класса, его функцию-конструктор и функцию обмена данными между элементами и переменными.
    Изменения в объявлении класса 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);
    }
Александр Даниленко
Александр Даниленко
Стоит Windows 8 Pro, Visual Studio 2010 Express Edition .