Урок №4 - Работа  с элементами управления   

     На этом уроке мы рассмотрим, как работать с элементами управления.
     Для этого создадим диалоговое приложение DateApp, в котором будет автоматически определятся текущая дата.

     Создайте диалоговое приложениеDateApp (как создавать диалогового приложение было описано на первом уроке). Оставьте все установки по умолчанию.
     В окне Workspace (Проект), обычно расположенном слева от окна редактора, раскройте вкладку ResourceView (Просмотр ресурсов).
     Раскройте папку DateApp resources, а в ней - папку Dialog. Щелкните правой кнопкой мыши на идентификаторе ресурса IDD_DATEAPP_DIALOG и в появившемся контекстном меню выберите команду Properties (Свойства). Появится диалоговое окно Dialog Properties.
     В раскрывающемся списке Language (Язык) выберите строку Russian (Русский).
     Щелкните правой кнопкой мыши в области диалогового окна и в появившемся контекстном меню выберите команду Properties (Свойства). Появится диалоговое окно Dialog Properties. В тестовое окно Caption (Заголовок) введите текст "Урок № 4" (или то, что Вам больше нравится).
     Удалите из заготовки Вашего диалогового окна статический элемент TODO: Place dialog controls here.
     В панели инструментов Controls (Элементы управления) поместите курсор мыши на кнопку Static Text (Статический текст), нажмите левую кнопку мыши и, удерживая ее, перетащите рамку статического текста в левый верхний угол диалогового окна. Заготовка диалогового окна примет вид, изображенный на рис. 4.1.



     Нажмите на этом элементе на правую кнопку мыши и выберите команду Properties (Свойства). В текстовое поле Caption диалогового окна Text Properties введите текст "Дата:"
     Поместите курсор мыши на кнопку Edit Box (Текстовое поле) в панели инструментов Controls, перетащите рамку текстового поля рядом со статическим элементом управления и отрегулируйте ее размеры и положение.
     Чтобы изменить положение элемента управления, нужно его выделить, щелкнув на нем левой кнопкой мыши. Вокруг выделенного элемента управления появится толстая рамка с восемью синими квадратиками. Вы можете изменять расположение элемента, растягивать или сужать его.
     После регулировки размеров и положения текстового поля заготовка диалогового окна примет вид, изображенный на рис. 4.2.


     Откройте диалоговое окно Edit Properties. В тестовое поле раскрывающего списка ID: (Идентификатор ресурса) вместо идентификатора IDC_EDIT1 введите идентификатор IDC_DATE_EDIT.
     В панели инструментов Controls (Элементы управления) поместите курсор мыши на кнопку Spin (Инкрементный регулятор ). Поместите его справа от текстового поля IDC_DATE_EDIT.
     Откройте диалоговое окно Spin Properties. В текстовое поле раскрывающего списка ID: (Идентификатор ресурса) вместо идентификатора IDC_SPIN1 введите идентификатор IDC_DATE_SPIN. Раскройте вкладку Styles (Стили). В раскрывающемся списке Alignment: (Выравнивание) выберите опцию Right (Справа) и установите флажки Auto buddy (Автоматическое подключение связанного элемента) и Set buddy (Рассматривать содержимое связанного элемента как целое число без знаков). При установке флажка Auto buddy в качестве связанного выбирается последний созданный перед регулятором элемент управления. При установке в текстовом поле раскрывающегося списка Alignment: значения Right инкрементный индикатор становится составной частью поля связанного элемента и располагается в его правой части. Если установлен флажок Wrap (Цикл), а величина в связанном элементе достигла максимального значения, то при следующем ее увеличении она сбрасывается в ноль, а попытка уменьшения обнуленного значения приводит к записи максимально возможного значения. Установка флажка Arrow keys (Управление с клавиатуры) позволяет изменять значения с помощью клавиш, если фокус установлен на данном элементе управления. Установка флажка No thousands (Отсутствие разбиения по триадам) удаляет разделитель между триадами цифр.
     Диалоговое окно Spin Properties примет вид, изображенный на рис. 4.3.

pic4_3.gif

     В панели инструментов Controls (Элементы управления) поместите курсор мыши на кнопку Combo box (Раскрывающийся список) и поместите его в заготовку диалогового окна. Щелкните левой кнопкой мыши на кнопке раскрытия списка. Поместите указатель мыши на синий квадратик на нижней границе рамки элемента управления и переместите его вниз, как это показано на рис. 4.4.



     В диалоговом окне Combo Box Properties измените идентификатор на IDC_MONTH_COMBO. Во вкладке Styles данного диалогового окна снимите флажок Sort (Сортировка). В раскрывающемся списке Type установите значение Drop List.
     По методике, описанной выше установите на заготовку Edit Box и Spin.
     В текстовые поля раскрывающего списка ID: (Идентификатор ресурса) установите соответственно IDC_YEAR_EDIT и IDC_YEAR_SPIN и установите аналогичные свойства для них.
     Ваша заготовка примет вид изображенный на рис. 4.5.


     На этом этап формирования диалогового окна можно считать законченным. Дело в том, что одновременно с производимыми нами действиями программная оболочка Visual C++ фиксировала все вносимые изменения в файлах DateApp.rc и resource.h. В результате наших действий в файле DateApp.rc появилась структура диалогового окна:

/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_DATEAPP_DIALOG DIALOGEX 0, 0, 320, 200
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "Урок №4"
FONT 8, "MS Sans Serif"
BEGIN
     DEFPUSHBUTTON   "OK",IDOK,260,7,50,14
     PUSHBUTTON     "Cancel",IDCANCEL,260,23,50,14
     LTEXT     "Дата:",IDC_STATIC,39,43,20,8
     EDITTEXT     IDC_DATE_EDIT,63,40,40,14,ES_AUTOHSCROLL
     CONTROL     "Spin1",IDC_DATE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,101,40,10,14
     COMBOBOX     IDC_MONTH_COMBO,119,40,48,93,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     EDITTEXT     IDC_YEAR_EDIT,178,39,40,14,ES_AUTOHSCROLL
     CONTROL     "Spin2",IDC_YEAR_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,217,39,10,14
END

     В первой строке этой структуры указан идентификатор ресурса диалогового окна и его размеры в оконных координатах, поэтому верхний левый угол данного окна всегда имеет координаты 0,0. После этого следует описание стиля диалогового окна, его заголовок и описание используемого в нем шрифта. Между BEGIN и END, располагается описание элементов управления данного окна. Описание элемента управления начинается с указания на то, что это за элемент управления, затем следует его заголовок, если он есть, идентификатор и другая специфическая информация. В конце описания элемента управления расположены координаты его рамки.
     В случае необходимости можно вносить изменения в описание элемента управления или любого другого ресурса непосредственно в файле описания ресурсов, но намного удобнее делать это с использованием интегрированной оболочки.
     Создание класса диалога

     Приступим к созданию класса диалога. Очень большую долю работы по созданию этого класса уже выполнил мастер AppWizard, а еще некоторую часть работы возьмет на себя мастер ClassWizard.
     Выберите команду View, ClassWizard (или нажмите Ctlr+W). Появится диалоговое окно MFC ClassWizard.
     Раскройте вкладку Member Variables (Переменные, члены класса). Диалоговое окно MFC ClassWizard примет вид, изображенные на рис. 4.6.



     В окне списка Control IDs: данной вкладки перечислены все идентификаторы ресурсов, используемыев созданном нами диалоговом окне. Теперь необходимо сопоставить этим идентификаторам ресурсов идентификаторы переменных в классе, обрабатывающем сообщения данного диалогового окна.
     Выделите идентификатор IDC_DATE_EDIT и нажмите кнопку Add Variable (Добавить переменную). Появится диалоговое окно Add Member Variable, изображенное на рис. 4.7.

pic4_7.gif

     В соответствии с венгерской нотацией имя переменной, являющейся членом класса, должно начинаться с m_, что отражено в текстовом поле Member variable name: (Идентификатор переменной, члена класса).
     Введите в текстовое поле Member variable name: идентификатор m_Date. В раскрывающемся списке Category (Категория) оставьте значение Value. В раскрывающемся списке Variable type (Тип переменной) выберите тип int (целое число). Нажмите кнопку ОК.
     Повторите предыдущие операции для остальных идентификаторов в соответствии с данной таблицей:

Control IDs: Member
variable name:
Category: Variable type:
IDC_DATE_SPIN m_sDate Control CSpinButtonCtrl
IDC_MONTH_COMBO m_Month Control CComboBox
IDC_YEAR_EDIT m_Year Value Int
IDC_YEAR_SPIN m_sYear Control CSpinButtonCtrl

     Раскройте вкладку Message Maps (Карты сообщений). Данная вкладка имеет несколько окон и текстовых полей. В раскрывающемся списке Project: указано имя текущего проекта. Мы работаем с одним проектом, поэтому у нас есть только один выбор в данном списке. В раскрывающемся списке Class name: (Имя класса) указано имя текущего класса. Т.к. мастер ClassWizard запускался из окна редактирования ресурса диалога, то текущим классом в настоящее время является класс обработки сообщений данного диалогового окна. Из этого списка можно выбрать любой зарегистрированный в данном мастере класс. Под этими двумя раскрывающимися списками расположено текстовое поле, предназначенное только для вывода информации и не имеющее внешней рамки. В это поле выводится информация об именах файла заголовка и файла реализации данного класса.
     В окне списка Object IDs: (Идентификаторы объектов) перечислены идентификаторы ресурсов, доступные в данном классе, и имя самого класса, имеющего свой набор сообщений и функций их обработки. В окне списка Messages: (Сообщения) перечислены все сообщения и функции их обработки, связанные с выделенным в предыдущем окне идентификатором объекта. В окне списка Member functions: (Функции-члены класса) перечислены все функции обработки сообщений, включенные в данный класс и связанные с ними сообщения.
     Когда Вы запускаете диалоговое приложение, очень часто требуется установить определенные начальные значения ("инициализировать" диалоговое приложение) некоторых элементов управления.
     В нашей программе нам нужно установить текущую дату.
     Для этого в диалоговой панели ClassWizard выберите следующие элементы:

               ClassName:     CDateAppDlg
               Object IDs:      CDateAppDlg
               Message:         WM_INITDIALOG


     Диалоговая панель ClassWizard будет выглядеть, как это показано на рис. 4.8.



     Это событие "инициализирует диалоговую панель". То есть код, который Вы связываете с событием WM_INITDIALOG, отвечает за инициализацию диалоговой панели.
     Щелкните на кнопке Edit Code. В ответ Visual C++ откроет файл DateAppDlg.cpp c функцией OnInitDialog() в режиме редактирования.
     Функция OnInitDialog() уже содержит часть кода, написанного мастером AppWizard. Вам нужно ввести собственный код, расположив его ниже следующей строки с комментарием:
     // TODO: Add extra initialization here
     Напишите следующий код:
     
     BOOL CDateAppDlg::OnInitDialog()
     {
     CDialog::OnInitDialog();
     ...
     ...
     ...
     // TODO: Add extra initialization here
     m_sDate.SetRange(1,31);
     m_sYear.SetRange(1995, 2000);

     CTime t = CTime::GetCurrentTime();

     char* Month[] = {"январь","февраль","март","апрель","май",
                    "июнь","июль","август","сентябрь",
                    "октябрь","ноябрь","декабрь"};

     for (int i=0; i<12; i++)
          m_Month.InsertString(i,Month[i]);

     m_Month.SelectString(t.GetMonth()-1,Month[t.GetMonth()-1]);

     m_Year = t.GetYear();
     m_Date = t.GetDay();

     UpdateData(FALSE);

     return TRUE; // return TRUE unless you set the focus to a control
     }

     Первые два оператора задают диапазон для элементов управления Spin.
     Функция CTime::GetCurrentTime() возвращает объект класса CTime, хранящий текущее время.
     Функции GetDay(), GetMonth() и GetYear() возвращают соответственно текущую дату, номер текущего месяца и текущий год.
     Функция CComboBox::InsertString(int nIndex, LPCTSRT lpszItem) возвращает индекс вставленной строки, причем первая строка имеет нулевой индекс. Если в процессе работы функции возникла ошибка, то возвращается величина CB_ERR, если эта ошибка связана с нехваткой памяти для хранения новой строки, то возвращается величина CB_ERRSPACE. nIndex определяет индекс позиции, в которую нужно вставить данную строку. Если этот аргумент равен нулю, то строка вставляется в конец списка. lpszItem является указателем на строку символов, заканчивающуюся нулем, которую необходимо добавить в список.
     Функция CComboBox::SelectString(int nStartAfter, LPCTSTR lpszString ) возвращает индекс выделенной строки, если она найдена.
     Функция UpdateData(BOOL bSaveAndValidate = TRUE) вызывается для инициализации объектов классов элементов управления диалогового окна или для получения информации, содержащейся в этих объектах. bSaveAndValidate - определяет, используется ли данная функция для инициализации объектов классов элементов управления диалогового окна (FALSE) или для получения информации, содержащейся в данных объектах (TRUE).

     Сохраните и откомпилируйте Вашу программу.

Содержание

Hosted by uCoz



Смотрите также:



Hosted by uCoz