LESSON 2

Связывание событий с элементами управления

    Код, инициализирующий окно редактирования

  • При запуске программы, основанную на диалоге, вам нужно установить определенные значения некоторых элементов управления. Вам необходимо, чтобы флажки Visible и Enable были отмечены, иначе окна редактирования не будет видно. Для этого выполните следующие действия:
  • Зайдите в View->ClassWizard,откройте закладку Message Maps.
  • В Message IDs выберете CTestDlg, в Messages появится список событий, с которыми может быть связано диалоговое окно. Выберете там событие WM_INITDIALOG. Оно происходит, когда запускается программа и инициализируется диалоговое окно.
  • Щелкнете на кнопку Add Function, а затем нажмите на кнопку Edit Code, для редактирования иходного кода.
  • Функция OnInitDialog() уже содержит часть кода написанного VC++ Найдите в нем коментарий // TODO: Add extra initialization here, который сообщает нам, что после него мы можем добавить свой код.
  • Напишите следующий код в функции OnInitDialog():

    BOOL CTestDlg::OnInitDialog()
    {
    CDialog::OnInitDialog();
    ...
    ...
    ...

    // TODO: Add extra initialization here
    // Добавьте свою инициализацию

    ////////Мой код начинается здесь///////////

    //Устаноить переменную флажка VisibleCheck и EnabledCheck в состояние
    //TRUE
    m_VisibleCheck=TRUE;
    m_EnableCheck=TRUE;
    //Обновить экран
    UpdateData(FALSE);

    ////////Мой код заканчивается здесь///////////

    return TRUE; // Вернуть TRUE, если только вы не установили фокус на элемент управления
    }

  • Рассмотрим код:
  • Первый и второй операторы, который которые вы ввели присваивают переменным m_VisibleCheck и m_EnableCheck значение TRUE. Это означает, что при запуске программы флажки будут отмечены.
  • Последний оператор UpdateData(FALSE) обновляет экран, т.е. он обновляет значения переменных элементов управления на текущие. В нашем случае, при выполнении этого оператора текущие содержимое переменных связанных с флажками будет передано к ним.
  • Теперь для того, чтобы посмотреть инициализирующий код в действии выполните программу.
    Главное окно вашей программы должно будет выглядеть так:

    Флажки должны быть отмечены.

Связывание кода с событием BN_CLICKED кнопки Exit

    При нажатии на кнопку Exit программа Test.Exe завершится.
  • Чтобы связать код с событием BN_CLICKED кнопки EXIT, выполните следующие действия:
  • Выбирете ClassWizard в меню View
  • Выберете закладку Message Maps в панели ClassWizard
  • Исползуйте диалоговую панель ClassWizard для выбора следующего события:
    Class Name: CTestDlg
    Object ID: IDC_EXIT_BUTTON
    Messages: BN_CLICKED
  • Щелкните на кнопку Add Fucntion и в раскрывшемся окне нажмите кнопку OK.
  • Сейчас ваша панель MFC ClassWizard должна будет выглядеть так:

  • Нажмите кнопку Edit Code и напишите следующий код в функции OnExitButton():

    void CTestDlg::OnExitButton()
    {
    // TODO: Add your control notification handler code here

    ////////Мой код начинается здесь///////////

    OnOK();

    ////////Мой код заканчивается здесь///////////

    }

  • Функция OnOK(), которую вы ввели завершает программу, при нажатии на кнопку Exit.

Связывание кода с событием BN_CLICKED кнопки Test

    При нажатии на кнопку Test программа Test.Exe в окне редактирования напишет текст: This is a Test
  • Чтобы связать код с событием BN_CLICKED кнопки Test, выполните следующие действия:
  • Выбирете ClassWizard в меню View
  • Выберете закладку Message Maps в панели ClassWizard
  • Исползуйте диалоговую панель ClassWizard для выбора следующего события:
    Class Name: CTestDlg
    Object ID: IDC_TEST_BUTTON
    Messages: BN_CLICKED
  • Щелкните на кнопку Add Fucntion и в раскрывшемся окне нажмите кнопку OK.
  • Нажмите кнопку Edit Code и напишите следующий код в функции OnTestButton():

    void CTestDlg::OnTestButton()
    {
    // TODO: Add your control notification handler code here

    ////////Мой код начинается здесь///////////

    ///Присвоить переменной окна редактирования IDC_TEST_EDIT значение This is a Test.
    m_TestEdit="This is a Test";
    //// Обновить экран UpdateData(FALSE);

    ////////Мой код заканчивается здесь///////////

    }

  • Код, который вы ввели содержит два оператора:
  • Первый присваивает переменной m_TestEdit типа CString значение This is a Test.
  • А второй оператор UpdateData(FALSE); обновляет экран, т.е. сообщает переменным диалогового окна текущие их значения.

Связывание кода с событием BN_CLICKED кнопки Clear

    При нажатии на кнопку Clear программа Test.Exe должна стирать текст из окна редактирования.
  • Чтобы связать код с событием BN_CLICKED кнопки Clear, выполните следующие действия:
  • Выбирете ClassWizard в меню View
  • Выберете закладку Message Maps в панели ClassWizard
  • Исползуйте диалоговую панель ClassWizard для выбора следующего события:
    Class Name: CTestDlg
    Object ID: IDC_CLEAR_BUTTON
    Messages: BN_CLICKED
  • Щелкните на кнопку Add Fucntion и в раскрывшемся окне нажмите кнопку OK.
  • Нажмите кнопку Edit Code и напишите следующий код в функции OnClearButton():

    void CTestDlg::OnClearButton()
    {
    // TODO: Add your control notification handler code here

    ////////Мой код начинается здесь///////////

    ///Присвоить переменной окна редактирования IDC_TEST_EDIT значение NULL.
    m_TestEdit=" ";
    //// Обновить экран
    UpdateData(FALSE);

    ////////Мой код заканчивается здесь///////////

    }

  • Код, который вы ввели содержит два оператора:
  • Первый присваивает переменной m_TestEdit типа CString значение NULL, т.е. окно редактирования не будет содержать никакого текста.
  • А второй оператор UpdateData(FALSE); обновляет экран, т.е. сообщает переменным диалогового окна текущие их значения. При выполнении этого оператора весь текст из окна редактирования удалится.
  • Теперь сохраните свою работу, выбрав Save All в меню File.
  • Чтобы увидеть в действии код программы выполните и запустите ее.
  • Напишите что-нибудь в окне редактирования.
  • Щелкните на кнопку Clear, вы видите что текст стирается.
  • Теперь нажмите на кнопку Test в окне редактирования появится текст This is a Test.
  • Если все это выполняется, значит вы совершенно правильно связали события с кнопками Test и Clear.

Связывание кода с событием BN_CLICKED флажка Visible

    При включении флажка Visible программа Test.Exe должна сделать окно редактирования невидимым, а при выключении - наоборот.
  • Чтобы связать код с событием BN_CLICKED флажка Visible, выполните следующие действия:
  • Выбирете ClassWizard в меню View
  • Выберете закладку Message Maps в панели ClassWizard
  • Исползуйте диалоговую панель ClassWizard для выбора следующего события:
    Class Name: CTestDlg
    Object ID: IDC_VISIBLE_CHECK
    Messages: BN_CLICKED
  • Щелкните на кнопку Add Fucntion и в раскрывшемся окне нажмите кнопку OK.
  • Нажмите кнопку Edit Code и напишите следующий код в функции OnVisibleButton():

    void CTestDlg::OnVsibleCheck()
    {
    // TODO: Add your control notification handler code here

    ////////Мой код начинается здесь///////////

    ////Обновить значения переменных элементов управления,
    ////(содержимое эрана передается переменным элементов управления)
    UpdateData(TRUE);
    ///Если отметка флажка Visible зделать окно редактирования видимым
    ///А если нет - то невидимым
    if(m_VisibleCheck==TRUE)
    GetDlgItem(IDC_TEST_EDIT)->ShowWindow(SW_SHOW);
    else
    GetDlgItem(IDC_TEST_EDIT)->ShowWindow(SW_HIDE);

    ////////Мой код заканчивается здесь///////////

    }

  • Код который вы ввели содержит следующие операторы:
  • UpdateData(TRUE); - этот оператор обновляет значения переменных элементов управления текущими значениями, которые содержаться на экране. Т.е. при нажатии на флажок переменная может принимать два значения TRUE или FALSE, TRUE - это когда флажок включен, а FASLE - наоборот. Значит при выполнении этого оператора переменная флажка управления принимаеит текущее положение флажка и все остальные переменные обновляются значениями, которые отображаются на экране.
  • Следующие оператор проверяет включен или выключен флажок. Если он включен, то выполняется оператор GetDlgItem(IDC_TEST_EDIT)->ShowWindow(SW_SHOW);, где GetDlgItem(IDC_TEST_EDIT) извлекает указатель на элемент управления, а функция ShowWindow(SW_SHOW); с параметром SW_SHOW, делает окно редактирования видимым.
  • А если флажок не отмечен, то выполняется таже самая функция ShowWindow(); с параметром SW_HIDE, этот параметр означает спрятать окно редактирования.

Связывание кода с событием BN_CLICKED флажка Visible

    При включении флажка Enable программа Test.Exe должна сделать окно редактирования доступным, а при выключении - недоступным.
  • Чтобы связать код с событием BN_CLICKED флажка Enable, выполните следующие действия:
  • Выбирете ClassWizard в меню View
  • Выберете закладку Message Maps в панели ClassWizard
  • Исползуйте диалоговую панель ClassWizard для выбора следующего события:
    Class Name: CTestDlg
    Object ID: IDC_ENABLE_CHECK
    Messages: BN_CLICKED
  • Щелкните на кнопку Add Fucntion и в раскрывшемся окне нажмите кнопку OK.
  • Нажмите кнопку Edit Code и напишите следующий код в функции OnEnableButton():

    void CTestDlg::OnEnableCheck()
    {
    // TODO: Add your control notification handler code here

    ////////Мой код начинается здесь///////////

    ////Обновить значения переменных элементов управления,
    ////(содержимое эрана передается переменным элементов управления)
    UpdateData(TRUE);
    ///Если отметка флажка Enable зделать окно редактирования видимым
    ///А если нет - то невидимым
    if(m_EnableCheck==TRUE)
    GetDlgItem(IDC_TEST_EDIT)->EnableWindow(SW_SHOW);
    else
    GetDlgItem(IDC_TEST_EDIT)->EnableWindow(SW_HIDE);

    ////////Мой код заканчивается здесь///////////

    }

  • Код который вы ввели содержит следующие операторы:
  • UpdateData(TRUE) - обновляет переменные элементов управления текущими их значениями на экране. После выполнения этого оператора перменной m_EnableCheck присваивается текущее значение флажка Enable.
  • Следующие операторы имееют ту же конструкцию, как и у флажка Visible, но только функция ShowWindow заменена на EnableWindow(), которая предназначена для того, чтобы элемент управления был недоступен или доступен. Она имеет те же параметры, что и функция ShowWindow.

Связывание кода с событием EN_CHANGE окна редактирования

    При вводе текста и его изменении в окне редактирования, возникает событие EN_CHANGE. В нашей программе при вводе слова CALCULATOR запускается калькулятор, а при вводе Paint - графический редактор Paint.
  • Чтобы связать код с событием EN_CHANGE окна редактирования, выполните следующие действия:
  • Выбирете ClassWizard в меню View
  • Выберете закладку Message Maps в панели ClassWizard
  • Исползуйте диалоговую панель ClassWizard для выбора следующего события:
    Class Name: CTestDlg
    Object ID: IDC_TEST_EDIT
    Messages: EN_CHANGE
  • Щелкните на кнопку Add Fucntion и в раскрывшемся окне нажмите кнопку OK.
  • Нажмите кнопку Edit Code и напишите следующий код в функции OnChangeTestEdit():

    void CTestDlg::OnChangeTestEdit()
    {
    ...
    // TODO: Add your control notification handler code here


    ////////Мой код начинается здесь///////////


    ///Обновить переменные
    UpdateData(TRUE);
    ///Содать переменную типа CString, присвоить ей значение
    ///переменной m_TestEdit и выполнить перевод символов в верхний
    ///регистр.
    CString UpperValue;
    UpperValue=m_TestEdit;
    UpperValue.MakeUpper();

    ///Если в окне редактирования напечатано PAINT
    ///запускается редактор PAINT и окно редактирования становится пустым.
    if(UpperValue=="PAINT")
    {
    system("pbrush.exe");
    m_TestEdit=" ";
    UpdateData(FALSE);
    }

    ///Если в окне редактирования напечатано CALCULATOR
    ///запускается калькулятор и окно редактирования становится пустым.
    if(UpperValue=="CALCULATOR")
    {
    system("calc.exe");
    m_TestEdit=" ";
    UpdateData(FALSE);
    }

    ////////Мой код заканчивается здесь///////////

    }

  • Код который вы ввели содержит следующие операторы:
  • UpdateData(TRUE); обновляет переменную m_TestEdit значением содержимого окна редактирования, при каждом его изменении, так как окно редактирования связано с событием EN_CHANGE.
  • Следующий оператор CString UpperValue; содает новую переменную типа CString.
  • Затем переменной UpperValue приравнивается значение переменной m_TestEdit, это можно сделать, так как они имеют одинаковый тип.
  • Оператор UpperValue.MakeUpper(); переводит все символы переменной UpperValue в верхний регистр.
  • Оператор if(UpperValue=="PAINT"); проверяет, если введено ли слово PAINT, то выполняются следующие три оператора:
    Первый system("pbrush.exe"); запускает графический редактор, так как не указан явный путь к файлу, то программа будет искать его в каталоге C:\WINDOWS.
    Второй оператор m_TestEdit=""; присваивает переменной окна редактирования значение NULL, а следующий оператор UpadteData(FALSE) - обновляет экран. Вследствии этого, весь текст из окна редактирования удалится.
  • Заметьте, что мы перевели символы переменной UpperValue в верхний регистр - это нужно потому, что в языке С++ символы нижнего и верхнего регистра имеют разные значения, поэтому при переводе на верхний регистр, мы 100% будем уверены, что написанное нами слово PaInT совпадет с PAINT.
  • Следующая конструкция операторов полностью идеинтична предыдущей, только проверяется равно ли значение переменной m_TestEdit слову CALCULATOR, если да, то запускается калькулятор, и окно редактирования очищается.

Вы закончили связывание событий с элементами управления

Резюме и упражнение


Оглавление -> Страница 1 -> Страница 2 -> Страница 3 -> Страница 4 -> Страница 5 ->