Назад | Начало урока | Вперед
Содержание

День 3 (продолжение 1)

  • Очистка пользовательских сообщений
  • Отключение и сокрытие элементов управления сообщениями

    Очистка пользовательских сообщений

    Некоторые клиенты предпочитают чтобы окно редактирования было очищено перед вводом в него сообщения. Для удобства таких пользователей можно к кнопке на которой написано Clear Message присоединить функцию, предназначенную для очистки Edit Box. Фактически мы просто присваиваем переменной m_strMessage пустую строку, и затем обновляем элементы управления в окне, чтобы в них отразилось это изменение.
    Посмотрите листинг 3.5

    Листинг 3.5 CONTROLSDLG.CPP - отображение пользовательского сообщения.

    void CControlsDlg::OnBnClickedClrmsg()
    {

    m_strMessage = " ";

    //обновить значения в диалоговом окне
    UpdateData(FALSE);
    }

    Вверх

    Отключение и сокрытие элементов управления сообщениями

    Добавим функции к флажкам (то есть к объектам Check Box):

    Enable Message Action (разрешить сообщение) и
    Show Message Action (Отображать элементы управления сообщениями)

    Первый из этих флажков включает и отключает элементы управления, имеющие отношние к отображению пользовательского сообщения. Когда флажок установлен, элемент управления становится доступным для пользователя. В противном случае элементы блокируются.
    Второй флажок делает видимым или не видимым тот же самый набор элементов.
    В листинге 3.6 представлен код этих двух функций.

    Листинг 3.6

    void CControlsDlg::OnBnClickedCkenblmsg()
    {

    UpdateData(TRUE);
    if(m_bEnableMsg == TRUE)
    {
    GetDlgItem(IDC_MSG)->EnableWindow(TRUE);
    GetDlgItem(IDC_SHWMSG)->EnableWindow(TRUE);
    GetDlgItem(IDC_DFLTMSG)->EnableWindow(TRUE);
    GetDlgItem(IDC_CLRMSG)->EnableWindow(TRUE);
    GetDlgItem(IDC_STATICMSG)->EnableWindow(TRUE);

    }
    else
    {
    GetDlgItem(IDC_MSG)->EnableWindow(FALSE);
    GetDlgItem(IDC_SHWMSG)->EnableWindow(FALSE);
    GetDlgItem(IDC_DFLTMSG)->EnableWindow(FALSE);
    GetDlgItem(IDC_CLRMSG)->EnableWindow(FALSE);
    GetDlgItem(IDC_STATICMSG)->EnableWindow(FALSE);
    }

    }


    void CControlsDlg::OnBnClickedCkshwmsg()
    {
    UpdateData(TRUE);
    if(m_bShowMsg == TRUE)
    {
    GetDlgItem(IDC_MSG)->ShowWindow(TRUE);
    GetDlgItem(IDC_SHWMSG)->ShowWindow(TRUE);
    GetDlgItem(IDC_DFLTMSG)->ShowWindow(TRUE);
    GetDlgItem(IDC_CLRMSG)->ShowWindow(TRUE);
    GetDlgItem(IDC_STATICMSG)->ShowWindow(TRUE);

    }
    else
    {
    GetDlgItem(IDC_MSG)->ShowWindow(FALSE);
    GetDlgItem(IDC_SHWMSG)->ShowWindow(FALSE);
    GetDlgItem(IDC_DFLTMSG)->ShowWindow(FALSE);
    GetDlgItem(IDC_CLRMSG)->ShowWindow(FALSE);
    GetDlgItem(IDC_STATICMSG)->ShowWindow(FALSE);
    }

    }

    Вам должна быть понятна первая часть этих функций. Сначала обновляются переменные (при помощи функции UpdateData(TRUE) ) - в них записываются текущие значения, хранящиеся в элементах управления диалогового окна. То есть считываются данные с экрана : стоит птичка в элементе Check Box или нет.

    Затем проверяется значение булевой переменной, связанной с соответствующим флажком.Если значение переменной равно TRUE, то включается или отображается нужный элемент управления. Если значение переменной равно FALSE, то элемент управления отключается или прячется.

    А вот в дальнейшем коде разобраться труднее.

    Первой функции GetDlgItem() передается идентификатор (ID) того элемента управления, который нужно изменить.
    Эта функция возвращает указатель на элемент управления. Во время выполнения приложения она позволяет получить указатель на любой элемент управления диалогового окна. В следующей части каждого оператора записан вызов функции- члена объекта элемента управления.

    Вторая функция представляет собой функцию-член объекта элемента управления, указатель на который был возвращен первой функцией.

    Вторые функции в этих вызовах, EnableWindow() и ShowWindow() выглядят так, как будто они должны использоваться для манипуляций с окнами а не с элементами управления. И действительно они должны использоваться для манипуляций с окнами, ведь они члены класса CWnd, представляющего собой базовый класс для класса CDialog, производным от которого является наш класс CControlsDlg.

    Так случилось что в Widows все элементы управления сами являются окнами, полностью отдельными от окна в котором они размещены. Это позволяет рассматривать элементы управления как окна и вызывать функции окон для работы с ними. Фактически ведь все классы элементов управления являются производными от класса CWnd. Это проясняет истинную природу элементов управления: все они представляют собой окна.
    Откомпилируйте и испытайте теперь приложение.

    Проверил.Все работает!


    Назад | Вверх | Вперед
    Содержание

    Hosted by uCoz