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

День 3

Построение диалогового окна с множеством элементов управления.


Сегодня мы :

Создание оболочки приложения

  1. Создадим новый проект .
  2. В дереве отображаемом в подокне Project Type выберем Visual C++ Projects.
  3. В подокне Templates выберем MFC Application.
  4. В поле Name наберем название проекта -Controls
  5. Щелкните OK.
Мастер выполнит две вещи - назначит папку для нового проекта
(эта папка указывается в поле Location и создается после окончания
работы AppWizard), а затем запустит AppWizard.

Вверх

Использование AppWizard для создания оболочки приложения
Мастер задаст целую серию вопросов о типе создаваемого приложения и о необходимых функциональных возможностях. Мастер использует эту инфу для создания оболочки приложения, это приложение уже сразу после создания этой оболочки можно скомпилировать и запустить. Эта оболочка является базовой инфраструктурой,
которая необходима для создания приложения.

Выполните следующее:

  1. Выберите Application Type. Это действие позволит указать некоторые опции для типа создаваемого приложения. Выберите опцию Dialog-based (Диалоговое окно)

  2. В левой части выберите User Interface Features (свойства интерфейса пользователя) Здесь можно выбрать вид главного окна приложения. В поле возде нижнего края окна введите текст заголовка главного окна приложения.- Visual C++ Controls

  3. Щелкните на Finish.

  4. Теперь можно скомпилироваить и запустить приложение. Ваше приложение отобразится в виде окна с сообщением TODO в центре и двумя кнопками OK и Cancel. Заголовок окна будет таким, какой вы ввели ранее.Для закрытия приложения можно щелкнуть на любой кнопке.

  5. Создав оболочку приложения,создадим макет основного диалогового окна,
    используя как основу наше только что созданное окно.
    Создайте макет окна такой как нарисовано на рисунке 3.3

    Подсказка

    Разместите на нем все управляющие элементы.

  6. Сконфигурируйте свойства управляющих элементов окна так,как указано в таб 3.7
Таб 3.7 Значения свойств элементов управления нашего диалогового окна приложения.

Static Text (надпись) Caption This is example of Visual C++
using a number of controls
Static Text (надпись) ID
Caption
IDC_STATICMSG
Enter a &Message
Static Text (надпись) ID
Caption
IDC_STATICPGM
Run a &Program
Edit Box ID IDC_MSG
Button ID
Caption
IDC_SHWMSG
&Show Message
Button ID
Caption
IDC_DFLTMSG
&Default Message
Button ID
Caption
IDC_CLRMSG
&Clear Message
Button ID
Caption
IDC_RUNPGM
&Run Program
Button ID
Caption
IDC_EXIT
E&xit
Combo Box ID IDC_PROGTORUN
Group Box Caption Enable Action
Group Box Caption Show Action
Check Box ID
Caption
IDC_CKENBLPGM
E&nable Program Action
Check Box ID
Caption
IDC_CKENBLMSG
&Enable Message Action
Check Box ID
Caption
IDC_CKSHWMSG
S&how Message Action
Check Box ID
Caption
IDC_CKSHWPGM
Sh&ow Program Action

(А.В.Идентификатор ID для надписей нужен для того, что с надписями мы в программе тоже будем производить некоторые действия, например будем их скрывать или показывать. Для этого будем вызывать функцию, в которую в качестве параметра будем передавать этот идентификатор)

7.После размещения всех этих элементов управления в диалоговом окне и конфигурации всех их свойств, снова выберите поле со списком (Combo Box), а в окне Properties найдите свойство Data и введите следующие значения, отделяя их точкой с запятой.

  • Notepad
  • Paint
  • Solitaire

    При добавлении к диалоговому окну управляющего элемента поле со списком (Combo Box), важно изменить размер области, которая отводится для элемента управления так, чтобы раскрывающийся список имел нужный размер. (Для этого необходимо растянуть область, занимаемую списком).
    После размещения элемента управления в диалоговом окне, ширину элемента необходимо изменять обычным способом.Чтобы изменить вертикальный размер раскрывающегося списка, следует щелкнуть на стрелке так, как это делается во время выполнения приложения с целью раскрыть раскрывающийся список.


    Вверх

    Последовательность перехода по клавише табуляции

    1. Выбрать диалоговое окно .либо один из элементов управления диалогового окна в области редактирования Developer Studio.
    2. Выбрать пункт Tab Order в меню Format (в Visual C++ 6.0 этот пункт находится в меню Layout). Возле каждого элемента управления диалогового окна появится номер. Числа указывают порядок перемещения в диалоговом окне.
    3. Щелкнуть на каждом номере в порядке задаваемой последовательности перехода по клавише табуляции -этим вы определите порядок перехода по клавише табуляции. Именно в таком порядке пользователь будет переходить от одного элемента управления к другому. Элементы управления пронумеруют себя в порядке их выбора.
    4. Определив порядок перехода по клавише табуляции, необходимо снова выбрать пункт Tab Order в меню Format, чтобы возвратиться в редактор макета.



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



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

    Чтобы определить мнемонику, в свойстве Caption управляющего элемента поместите амперсанд перед символом, который вы хотите сделать мнемоникой. (Важно удостовериться что одна и та же мнемоника не используется более одного раза в одном и том же диалоговом окне или меню.)

    И наконец надо проверить мнемоники, чтобы убедиться в отсутствии конфликтов между элементами управления. Сделайте следующее:
    1. Выберите диалоговое окно или один из элементов управления в редакторе макета.Щелкните на нем правой кнопкой и выберите Check Mnemonics
    2. Если нет ни каких конфликтов между мнемониками,отобразится специальное диалоговое окно(окно сообщения), из которого вы узнаете об отсутствии конфликтов.
    3. Если имеются какие-либо конфликты, в диалоговом окне будет указана конфликтующая буква, причем предоставляется возможность автоматически выбрать первый элемент управления, содержащий конфликтующую мнемонику.
    Можно откомпилировать и сохранить. Проверить как действует клавиша табуляции. Как выглядит приложение.

    Вверх
    Связывание переменых и элементов управления

    Прежде чем начать программировать, необходимо назначить переменные каждому элементу управления с которым связывается какое-нибудь значение. Другими словами - переменные должны быть назначены всем элементам управления, кроме надписей и командных кнопок.
    (АВ:потому что в надписи и командные кнопки мы не будем вносить ни каких данных).

    Создавая код приложения.программист взаимодействует с этими переменными. Значения,которые пользователь вводит в элемент управления диалогового окна, помещается в эти переменные и только затем используется в коде приложения. Аналогично, любое значение, помещаемое кодом приложения в одну из этих переменных, обновляет и соответствующий элемент управления диалогового окна, чтобы пользователь видел изменения.
    Как же объявить все эти переменные и связать их с элементами управления?

    1. Выбрать элемент управления, с которым необходимо связать переменную.
    2. Щелкнуть правой кнопкой на нужном элементе управления, и в появившемся контекстном меню выбрать пункт Add Variable (Добавить переменную).
    3. Выбрать идентификатор (ID) одного из элементов управления, с которым необходимо связать переменную, например IDC_MSG. Идентификатор (ID) выбранного элемента управления должен быть уже выбран в поле со списком Control ID (Идентификатор элемента управления)
    4. Указать значение Value в поле Category (Категории)
    5. Указать тип данных для переменной в поле со списком Variable Type (Тип переменной)

    6. Ввести имя переменной в редактируемое поле Variable Name (Имя переменной)
    7. В редактируемое поле Comment (Комментарий), расположенное внизу диалогового окна, ввести комментарий, описывающий переменную и ее назначение. Щелкните на кнопке Finish чтобы добавить переменную.
    8. Повторить шаги 1-8 для всех остальных элементов управления, для которых нужно добавить переменные. В наше приложение необходимо добавить переменные так, как это указано в таблице 3.8

      Таб 3.8 Переменные для элементов управления

      IDC_MSG m_strMessage value CString public
      IDC_PROGTORUN m_strProgToRun value CString public
      IDC_CKENBLPGM m_bEnablePgm value BOOL public
      IDC_CKENBLMSG m_bEnableMsg value BOOL public
      IDC_CKSHWMSG m_bShowMsg value BOOL public
      IDC_CKSHWPGM m_bShowPgm value BOOL public



    Вверх
    Добавление функциональных возможностей для элемента управления

    Теперь надо инициализировать переменные, чтобы установить начальные значения большинства из них.

    Для этого выполните пошаговые инструкции:

    1. В окне Class View раскройте класс CControlDlg, и выберите в списке функций -членов функцию OnInitDialog.
    2. Дважды щелкните на узле OnInitDialog. Вы увидите исходный текст этой функции.
    3. Вставьте сюда код следующего содержания:


    BOOL CControlsDlg::OnInitDialog()
    {
    CDialog::OnInitDialog();
    ...
    SetIcon(m_hIcon,TRUE);//установить большой значек
    SetIcon(m_hIcon,FALSE);//установить маленький значек //поместить заданное по умолчанию сообщение
    m_strMessage = "Place a message here ";
    //Установить все флажки
    m_bShowMsg = TRUE;
    m_bShowPgm = TRUE;
    m_bEnableMsg = TRUE;
    m_bEnablePgm = TRUE;
    //обновить значения в диалоговом окне
    UpdateData(FALSE);
    //возвратить значение ИСТИНА, если элемент управления не получает фокуса
    return TRUE;
    }

    Приведенный код инициализации прост.

    В поле правки (Edit Box) устанавливается начальное сообщение:
    //поместить заданное по умолчанию сообщение

    m_strMessage = "Place a message here ";

    Затем устанавливаются все флажки в Check Box :

    //Установить все флажки
    m_bShowMsg = TRUE;
    m_bShowPgm = TRUE;
    m_bEnableMsg = TRUE;
    m_bEnableMsg = TRUE;

    Особо обратите внимание на функцию : UpdateData()

    //обновить значения в диалоговом окне

    UpdateData(FALSE);

    Эта функция представляет собой ключ для работы с переменными элементов управления.

    Эта функция получает доступ к данным, хранящихся в переменных (которые мы только что инициализировали) и обновляет на экране вид элементов управления так, чтобы отобразить значения этих переменных.

    Она так же принимает данные от элементов управления, введенные пользователем, и заносит эти данные в переменные. Этот процесс управляется булевым параметром, передаваемом в качестве аргумента в функцию UpdateData().

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


    Таким образом параметр функции определяет направление передачи значений от переменных к элементам управления или в противоположном направлении. Или другими словами этот параметр определяет что будет модифицироваться -переменные или элементы управления.

    После того как программа изменила значение одной или более переменных,
    следует вызвать функцию UpdateData(), передав ей в качестве параметра FALSE.
    Чтобы прочитать значения переменных, введенных пользователем интерактивно, необходимо сначала вызвать функцию UpdateData() передав ей в качестве параметра TRUE, а затем можно читать значения любой из этих переменных.


    Вызов UpdateData(FALSE) затирает значения введенные пользователем интерактивно.

    Вверх

    Закрытие приложения
    1. Теперь необходимо удостовериться что пользователь сможет закрыть приложение. Необходимо поместить код закрытия приложения в ту функцию, которая вызывается по щелчку на кнопке Exit. Используя Control Events добавьте функцию - обработчик сообщения BN_CLICKED для этой кнопки выхода.
    2. Введите следующий код в функцию :

    void CControlsDlg::OnBnClickedExit() {
    OnOK();
    }


    Здесь используется функция базового класса OnOK() .

    Вверх

    Отображение пользовательского сообщения
    Отобразить сообщение которое пользователь ввел в окне Edit Box не сложно.Можно воспользоваться для этого командной кнопкой,которая у нас на форме и на которой написано Show Message.Для этого выделяем эту кнопку в редакторе и связываем ее событие BnClicked с функцией которая будет вызываться при нажатии на эту кнопку.Название этой функции нам подсказывает мастер создания приложений,если нажать правой кнопкой на событии BnClicked.Выбрав эту функцию мы попадаем в код CONTROLSDLG.CPP где внутри этого кода пишем вызов функции MessageBox :

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

    void CControlDlg::OnBnClickedShow() {

    MessageBox(m_strMessage);
    }
    Если сейчас скомпилировать и запустить приложение,то мы увидим на экране не то сообщение,которое ввел пользователь,а то которым была инициализирована эта переменная в функции OnInitDialog(). Это произошло потому,что в переменную не было записано значение которое ввел пользователь в элемент Edit Box.Чтобы значение ,которое пользователь ввел в элемент Edit Box ,записалось в переменную m_strMessage надо применить функцию UpdateData(TRUE) с аргументом TRUE. Вот измененный код :

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

    void CControlDlg::OnBnClickedShow() {
    UpdateData(TRUE)
    MessageBox(m_strMessage);
    }
    Если теперь скомпилировать и запустить приложение, то оно отобразит в окне сообщения текст, который пользователь ввел в Edit Box -окне редактирования.
    АВ: Мы сейчас научились важному: мы научились взаимодействовать интерактивно с пользователем.В частности пользователь вводит в элемент Edit Box свое строковое сообщение и мы программно считываем с экрана и присваиваем это сообщение строковой переменной и далее манипулируем с этой инициализированной строковой переменной,в частности передаем ее в качестве аргумента в окно сообщений MessageBox.

    Еще раз вот как это работает:

    void CControlDlg::OnBnClickedShow() {
    // считываем с экрана данные ,которые ввел пользователь,в переменную
    // m_strMessage а так же инициализируем и другие переменные ассоциированные
    // с другими элементами на экране

    UpdateData(TRUE)

    // Передаем объекту MessageBox переменную m_strMessage,в которой уже
    // содержатся данные,которые ввел пользователь.Переменная инициализирована
    // данными которые ввел пользователь

    MessageBox(m_strMessage);

    }

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

    Hosted by uCoz