Класс CSpinButtonCtrl

Лекция 6.

Использование элементов управления ComboBox, ListBox, Spin, RadioButton.

Создаем новое приложение MFC (рис. 1) с названием Project6.

Рис. 1.

Выбираем тип приложения – на основе диалоговых окон (рис. 2), и нажимаем на кнопку Готово.

Рис. 2.

Наше приложение будет выполнять следующие функции. С помощью выпадающего списка ComboBox пользователь будет выбирать время года – зима, весна, літо, осінь. (І їх весь час по колу носить. Зриває дощ з повітря спеку, вмиває землю, і рідну, і далеку. Нехай вона заблищить всіма скарбами світу, але для когось це всього-навсього літо).

В списке ListBox при этом будут отображаться месяцы выбранного времени года. При выборе определенного месяца в элементе Edit Control отобразится количество дней в выбранном месяце. Если год високосный, что выбирается пользователем с помощью элемента управления RadioButton, то при выборе месяца февраля в элементе Edit Control отобразится количество дней, равное 29.

Размещаем на диалоговом окне, в редакторе ресурсов, элементы управления, как показано на рис. 4.

Важно! Когда вы разместите на диалоге первый элемент RadioButton (Не високосный), установите свойство Группа в true. Тогда следующий элемент RadioButton, который будет добавлен на диалог, будет находится в одной группе с первым, и тогда только один из этих элементов управления может быть активирован, что, собственно, и нужно, т.к. год не может быть одновременно не високосным и високосным. У второго элемента RadioButton, который вы разместите на диалоге, установите свойство Группа в false (значение по умолчанию).

Рис. 3.

Рис. 4.

Открываем окно Мастера классов (для этого нажмите комбинацию клавиш Ctrl+Shift+X), и на закладке Переменные-члены связываем с элементами управления переменные, как показано на рис. 5.

Рис. 5.

Обратите внимание на тип переменных. Для элементов управления ComboBox и ListBox переменные имеют тип Control, а для элементов Edit и RadioButton категория переменных Value, а тип переменных – int. Такой выбор обусловлен удобством работы с этими переменными. В предыдущих лекциях более подробно описано, в каких случаях выбирается тот или иной тип переменной.

После запуска приложения в списке ComboBox должны отображаться названия времен года. Для добавления времен года в список добавим код программы в функцю OnInitDialog. Эта функция вызывается перед появлением окна приложения на экране. Чтобы отобразить код этой функции в Окне классов выберите класс диалога и дважды нажмите на названии функции. Откроется текстовый редактор, в котором пишем код.

Рис. 6.

Ниже представлен код, который необходимо добавить в конце функции OnInitDialog:

m_combo.AddString(_T("Spring")); // добавляем элемент в список, порядковый номер 0

m_combo.AddString(_T("Summer")); // добавляем элемент в список, порядковый номер 1

m_combo.AddString(_T("Autumn")); // добавляем элемент в список, порядковый номер 2

m_combo.AddString(_T("Winter")); // добавляем элемент в список, порядковый номер 3

m_combo.SetCurSel(0); // устанавливаем в списке элемент с порядковым номером 0

Можно откомпилировать проект. Вы увидите, что у вас в списке отображается не Spring, а Autumn. Это связано с тем, что по умолчанию для элемента ComboBox включена сортировка. Зайдите в редактор ресурсов, и отредактируйте свойства элемента ComboBox. Установите свойство Сортировка в False.

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

Рис. 7.

В обработчике пишем код:

int sel=m_combo.GetCurSel(); // получить номер выбранного пользователем элемента

m_list.ResetContent(); // очищаем список ListBox

switch(sel){

case 0: // если выбрано в Combobox значение Spring

m_list.AddString(_T("March")); // в ListBox добавляем элемент March

m_list.AddString(_T("April"));// в ListBox добавляем элемент

m_list.AddString(_T("May"));// в ListBox добавляем элемент

break;

case 1:// если выбрано в Combobox значение Summer

m_list.AddString(_T("June"));// в ListBox добавляем элемент

m_list.AddString(_T("July"));// в ListBox добавляем элемент

m_list.AddString(_T("August"));// в ListBox добавляем элемент

break;

case 2:// если выбрано в Combobox значение Autumn

m_list.AddString(_T("September"));// в ListBox добавляем элемент

m_list.AddString(_T("October"));// в ListBox добавляем элемент

m_list.AddString(_T("November"));// в ListBox добавляем элемент

break;

case 3:// если выбрано в Combobox значение Winter

m_list.AddString(_T("December"));// в ListBox добавляем элемент

m_list.AddString(_T("January"));// в ListBox добавляем элемент

m_list.AddString(_T("Febuary"));// в ListBox добавляем элемент

break;

}

После компиляции программы в списке после выбора времени года названия месяцев отображаются не по порядку. По умолчанию для элемента ListBox включена сортировка. Зайдите в редактор ресурсов, и отредактируйте свойства элемента ListBox. Установите свойство Сортировка в False.

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

Рис. 8.

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

UpdateData(true); // обновляем значения в переменных, связанных с элементами управления

// в двумерном массиве хранится количество дней в каждом месяце

// первое измерение - время года: 0 - весна, 1 - лето, 2- осень, 3 - зима

// второе измерение - номер месяца в сезоне

int d[4][3]={{31,30,31},{30,31,31},{30,31,30},{31,31,28}};

int season=m_combo.GetCurSel(); // получаем номер выбранного сезона

int month=m_list.GetCurSel(); // получаем номер выбранного месяца

if(m_radio==1) d[3][2]=29; // если високосный год, в феврале 29 дней

else d[3][2]=28; // в невисокосном году в феврале 28 дней

m_days=d[season][month]; // записываем в переменную количество дней

UpdateData(false); // выводим значение на экран в элемент управления

После компиляции программы проверьте ее работу выбирая различные времена года и месяцы.

Рис. 9.

Класс CSpinButtonCtrl

В Windows существует стандартный элемент управления счетчик, доступ к которому нам предоставляет класс MFC - CSpinButtonCtrl. Историю происхождения данного класса Вы можете наблюдать на рисунке, приведенном ниже.

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

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

Зачастую счетчик используют совместно с текстовым полем, которое называют "приятелем". Другими словами, у счетчика существует "приятель", в котором, к примеру, отображается текущее значение счетчика. Для пользователя счетчик и "приятель" выглядят как один обобщенный элемент управления. Естественно, чтобы научиться использовать данный элемент управления нам необходимо разобраться с методами класса CSpinButtonCtrl.

Конструктор CSpinButtonCtrl(); - позволяет создать объект класса CSpinButtonCtrl(). Но, как обычно, чтобы создать непосредственно сам счетчик и связать его с объектом класса CSpinButtonCtrl мы обязаны вызвать метод:

BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID); - принимаемые параметры практически ничем не отличаются от аналогичных параметров рассмотренных для метода Create класса CProgressCtrl. Тем не менее, отдельного внимания заслуживает первый параметр, так как для счетчика существуют дополнительные стили. Рассмотрим их: UDS_HORZ - указывает на горизонтальную ориентацию счетчика (при отсутствии данного стиля ориентация вертикальная); UDS_WRAP - задает циклический переход от верхней границы к нижней (и наоборот) при достижении максимального значения верхней (нижней) границы); UDS_ARROWKEYS - разрешает использование клавиатуры (стрелочка вверх и стрелочка вниз), для изменения значения счетчика; UDS_SETBUDDYINT - указывает, что при изменении значения счетчика необходимо изменить значение "приятеля"; UDS_NOTHOUSANDS - снимает разделитель между тысячами, к примеру, 1000000 или 1 000 000; UDS_AUTOBUDDY - автоматически выбирать "приятеля" из существующего списка окон; UDS_ALIGNRIGHT - счетчик будет находиться справа от приятеля; UDS_ALIGNLEFT - счетчик будет находиться слева от приятеля.

CWnd* SetBuddy(CWnd* pWndBuddy); - устанавливает "приятеля" для счетчика. Обратите внимание, что принимаемый параметр - это указатель на класс CWnd - базовый класс для всех элементов управления. Соответственно, не только текстовое поле (CEdit) может быть "приятелем" счетчика. Возвращаемое значение - указатель на предыдущий счетчик.

CWnd* GetBuddy() const; - возвращает указатель на текущего "приятеля" счетчика.

int SetPos(int nPos); - устанавливает текущее значение счетчика, значение параметра nPos должно находиться в диапазоне меду нижней и верхней границами. Возвращаемый результат - предыдущее значение счетчика.

int GetPos() const; - возвращает текущее значение счетчика.

void SetRange(int nLower, int nUpper); и void SetRange32(int nLower, int nUpper); - задает нижнюю и верхнюю границы счетчика. По умолчанию, нижняя граница равна 100, а верхняя 0 (таки именно так, а не наоборот). Ситуация с SetRange32 полностью аналогичная SetRange, но только SetRange32 работает с 32-битными параметрами.

void GetRange(int& lower, int& upper) const; и void GetRange32(int& lower, int& upper) const; - возвращает значение нижней и верхней границ счетчика. Желательно придерживаться следующего правила: установили границы с помощью SetRange - получили через GetRange, SetRange32 - GetRange32.

int SetBase(int nBase); - позволяет задать систему исчисления (базу) для счетчика: десятичную (значение параметра nBase равно 10) или шестнадцатеричную (значение параметра nBase равно 16). Обратите внимание, что при использовании шестнадцатеричной базы числа не могут быть отрицательными. Возвращаемое значение - предыдущая база или ноль, если установлена некорректная база.

UINT GetBase() const; - возвращает текущее значение базы. Другими словами, если Вас интересует какая система исчисления используется в счетчике, то обратитесь к данной функции (10 - десятичная, 16 - шестнадцатеричная).

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

BOOL SetAccel(int nAccel, UDACCEL* pAccel); - устанавливает правило, по которому будет осуществляться приращение счетчика. Параметр nAccel - задает количество структур, участвующих в определении правила, из массива pAccel.

Подходящий момент, чтобы поговорить детальней о структуре UDACCEL. Вот как определена данная структура:

typedef struct { UINT nSec; UINT nInc; }UDACCEL, FAR *LPUDACCEL;

Как видите в структуре определено всего два поля: nSec - задает время в секундах, по прошествии которого приращение nInc счетчика будет изменено.

Метод UINT GetAccel(int nAccel, UDACCEL* pAccel) const; - позволяет узнать информацию о приращениях счетчика. Параметр nAccel - запрашиваемое количество структур, pAccel - указатель на массив структур для получения информации о приращениях счетчика. Возвращаемое значение - реальное количество полученных структур типа UDACCEL.

Домашнее задание

1. Разработайте приложение Телефонная книга. На диалоге размещается 2 элемента Edit Control, кнопка и ListBox. В первом поле ввода пользователь вводит ФИО, во втрое поле ввода – номер телефона. После нажатия на кнопку в список ListBox добавляется имя пользователя и его номер телефона.

2. Разработайте конвертор чисел, представленных в десятичной системе счисления, в числа, представленные в восьмеричной или шестнадцатеричной системе счисления. Выбор системы счисления выбирается с помощью элемента ComboBox. Для ввода чисел используется элемент Edit Control.

3. Создать маленькую игрушку. На поле находятся 10 кнопок (Button), счетчик (Spin), список (ListBox). Правила: при запуске игры на кнопки помещаются 10 случайных чисел (при этом на счетчике необходимо выставить скорость игры в десятых долях секунды, что будет являться значением для таймера). Задача: необходимо за заданное время щелкнуть по числам на кнопках в порядке возрастания; числа должны добавляься в список (только если данное число является следующим по возрастанию). Если игрок не успевает, то список очищается и игра начинается снова с текущим значением таймера (на счетчике).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: