Вы находитесь на странице: 1из 5

Лекция 17 Дополнительные элементы управления 1

ЛЕКЦИЯ 17
СПИН-КНОПКА _________________________________________________________________________ 1
Функции класса CSpinButtonCtrl ___________________________________________________________ 1
Пример использования спин-кнопки________________________________________________________ 1
Акселераторы__________________________________________________________________________ 2
Пример получения значений параметров акселераторов ______________________________________ 3
Пример установки значений параметров акселераторов_______________________________________ 3
ПОЛЗУНОК _____________________________________________________________________________ 3
Пример использования элемента управления Spin Button______________________________________ 4
Функции класса CSliderCtrl _______________________________________________________________ 4

СПИН-КНОПКА
Это пара кнопок со стрелками, назначение которых – изменение (уменьшение-увеличение) значения,
например, позиции прокрутки или числового значения. Элемент управления Spin Button возвращает зна-
чение типа short, которое может изменяться в пределах от –32 768 до 32 767. Иерархия классов до класса
CSpinButtonCtrl представлена на рисунке.

CObject

CCmdTaget

CWnd

CSpinButtonCtrl
Если спин-кнопка создается не в шаблоне блока диалога, то необходимо воспользоваться функцией
Create ( ).

Функции класса CSpinButtonCtrl


Для использования спин-кнопки необходимо создать с помощью ClassWizard ассоциированную пере-
менную типа CSpinButtonCtrl. Этот объект хранит положение спин-кнопки (текущее значение), которое
пользователь может изменить с помощью щелчка кнопкой мыши. Необходимо отметить, что положение
спин кнопки хранится в двухбайтной переменной. Поэтому передавать положение нужно в переменную
типа short или преобразовывать его с помощью соответствующей функции преобразования типа. Для
операций со спин-кнопкой в классе CSpinButtonCtrl определены следующие функции:
SetRange ( ) устанавливает диапазон значений;
GetRange ( ) возвращает диапазон значений;
SetAccel ( ) устанавливает параметры акселераторов;
GetAccel ( ) получает параметры акселераторов;
SetPos ( ) устанавливает положение элемента управления;
GetPos ( ) возвращает положение элемента управления;
SetBase ( ) установить основание системы счисления (10 или 16);
GetBase ( ) возвращает основание системы счисления.

Пример использования спин-кнопки


Рассмотрим пример, который демонстрирует основные приёмы использования спин-
кнопки. Диалоговое окно IDD_SPINDEMO_DIALOG содержит текстовое поле
IDC_EDIT и элемент управления IDC_SPIN, с помощью которого пользователь может
изменить значение, отображаемое в текстовом поле с шагом 0,1 в диапазоне от –100 до
100. Пользователь также может ввести значение непосредственно в текстовое поле.
Код, включённый в класс CSpinDemoDlg, имеет вид:
class CSpinDemoDlg : public CDialog
{
public :
CSpinButtonCtrl m_spin ; // переменная ассоциированная со спин-кнопкой IDC_SPIN

Выжол Ю.А. Программирование на Visual C++


Лекция 17 Дополнительные элементы управления 2
float m_edit ; // переменная ассоциированная с текстовым полем IDC_EDIT
};
void CSpinDemoDlg::DoDataExchange ( CDataExchange* pDX )
{
DDX_Control ( pDX , IDC_SPIN , m_spin ) ; // связывает спин-кнопку IDC_SPIN с переменной m_spin
DDX_Text ( pDX , IDC_EDIT , m_edit ) ; // связывает текстовое поле IDC_EDIT
// с переменной m_edit
DDV_MinMaxFloat ( pDX , m_edit , -100.f , 100.f ) ; // определяет диапазон допустимых
// значений переменной m_edit
}
// функция инициализации диалогового окна
BOOL CSpinDemoDlg :: OnInitDialog ( )
{
m_spin.SetRange ( -1000 , 1000 ) ; // определяет диапазон изменения значения,
// возвращаемого спин-кнопкой IDC_SPIN
m_spin.SetPos ( 100 ) ; // определяет начальное значение спин-кнопки IDC_SPIN
}
// функция обработки события изменения значения текстового поля IDC_EDIT
void CSpinDemoDlg :: OnChangeEdit ( )
{
UpdateData ( ) ; // считывает данные из спин-кнопки IDC_EDIT
// в ассоциированную переменную m_edit
m_spin.SetPos (( int ) m_edit*10 ) ; // передаёт значение переменной m_edit
// в спин-кнопку IDC_SPIN
}
// функция обработки события изменения положения спин-кнопки
void CSpinDemoDlg :: OnDeltaPosSpin ( NMHDR* pNMHDR , LRESULT* pResult )
{
m_edit = (( short ) m_spin.GetPos ( )) / 10.0f ; // считывает данные из спин-кнопки IDC_SPIN
// в переменную m_edit
UpdateData ( false ) ; // передаёт значение переменной m_edit
// в текстовое поле IDC_EDIT
}

Акселераторы
Изменять значение в текстовом поле с помощью щелчка мыши на спин-кнопке удобно, но долго. По-
этому в элементе управления предусмотрены акселераторы, которые изменяют шаг изменения позиции, в
том случае, когда пользователь долго жмёт кнопку мыши на спин-кнопке. Для хранения акселератора в
библиотеке MFC объявлена структура UDACCEL в следующем виде:
typedef struct
{
int nSec ; // время ожидания в секундах
int nInc ; // шаг изменения позиции после nSec секунд ожидания
} UDACCEL ;
Спин-кнопка содержит несколько акселераторов в соответствующем массиве, доступ к которому мож-
но получить с помощью следующих функций:
UINT GetAccel ( int nAccel , UDACCEL* pAccel ) const ;
BOOL SetAccel ( int nAccel , UDACCEL* pAccel ) ;
Функция GetAccel ( ) возвращает количество акселераторов, определённых в спин-кнопке. Функция
SetAccel ( ) возвращает true, если выполнена успешно. Параметры функций:
nAccel количество акселераторов, определённых в спин-кнопке;
pAccel указатель на массив акселераторов типа UDACCEL, который содержат информацию
об акселераторах. Элементы массива должны быть отсортированы по возрастанию по
времени ожидания.
По умолчанию в спин-кнопке определены три акселератора со следующими значениями параметров:
№ 0 1 2
nSec 0 2 5
nInc 1 5 20

Выжол Ю.А. Программирование на Visual C++


Лекция 17 Дополнительные элементы управления 3
Пример получения значений параметров акселераторов
В приведённом ниже примере пользователь нажимает кнопку, и программа выводит на экран в окнах
сообщения информацию об акселераторах, определённых в спин-кнопке. Для хранения информации об
акселераторах используется динамический массив структур типа UDACCEL.
void CSpinDemoDlg :: OnGetAccel ( )
{
int m = 5 ; // размер динамического массива акселераторов
UDACCEL* pAccel = new UDACCEL [ m ] ; // создаёт динамический массив акселераторов
int n = m_spin.GetAccel ( n , pAccel ) ; // определяет количество акселераторов
// и получает их параметры
CString number , elapse , step , title = "Параметры акселератора";
number.Format ( "Количество акселераторов \t%i \n" , n ) ;
MessageBox ( number , title , MB_ICONINFORMATION ) ;
for ( int i =0 ; i < n ; i++ ) // для всех акселераторов
{
number.Format ( "Акселератор №\t%i\n", i ) ;
elapse.Format ( "Время ожидания\t%i сек\n", pAccel [ i ].nSec ) ;
step.Format ( "Шаг изменения \t%i \n", pAccel [ i ].nInc ) ;
MessageBox ( number + elapse + step , title , MB_ICONINFORMATION ) ;
}
delete [ ] pAccel ; // удаляет динамический массив акселераторов
}

Пример установки значений параметров акселераторов


В приведённом ниже примере пользователь нажимает кнопку, и устанавливает 4 акселератора для
спин-кнопке с новыми значениями параметров. Для хранения информации об акселераторах используется
динамический массив структур типа UDACCEL.
void CSpinDemoDlg ::OnSetAccel ( )
{
int n = 4 ; // размер динамического массива акселераторов
UDACCEL* pAccel = new UDACCEL [ n ] ; // создаёт динамический массив акселераторов
for ( int i = 0 ; i < n ; i++ ) // для всех акселераторов
pAccel [ i ].nSec = i ; // устанавливает время ожидания
pAccel [ 0 ].nInc = 1 ; pAccel [ 1 ].nInc = 10 ; // устанавливает шаг изменения позиции
pAccel [ 2 ].nInc = 100 ; pAccel [ 3 ].nInc = 1000 ;
m_spin.SetAccel ( n , pAccel ) ; // устанавливает значения параметров акселераторов
delete [ ] pAccel ; // удаляет динамический массив акселераторов
}

ПОЛЗУНОК
Ползунок – это линейка с бегунком. Линейка может содержать деления. Данный элемент предназна-
чен для выбора дискретных значений в установленном интервале. Иерархия классов до класса
CSliderCtrl представлена на рисунке.

CObject

CCmdTaget

CWnd

CSliderCtrl
Если этот элемент управления создается не в шаблоне блока диалога, то необходимо воспользо-
ваться функцией Create ( ).

Выжол Ю.А. Программирование на Visual C++


Лекция 17 Дополнительные элементы управления 4
Пример использования ползунка
Рассмотрим пример, который демонстрирует основные приёмы использования ползунка со значения-
ми свойств, заданными по умолчанию. Диалоговое окно IDD_SLIDERDEMO_DIALOG содержит тексто-
вое поле IDC_EDIT и элемент управления IDC_SLIDER, с помощью которого пользователь может из-
менить значение, отображаемое в текстовом поле в диапазоне от 0 до 100. Пользователь также может
ввести значение непосредственно в текстовое поле. Если ползунок имеет фокус, то его значение также
можно изменить с помощью клавиш управления курсором с шагом 1 и с помощью клавиш PageUp и
PageDown с шагом 20.

Для использования ползунка необходимо создать с помощью ClassWizard ассоциированную пере-


менную типа int, которая хранит положение ползунка.
Код, включённый в класс CSliderDemoDlg, имеет вид:
class CSliderDemoDlg : public CDialog
{
public :
int m_spin ; // переменная ассоциированная с ползунком IDC_SLIDER
int m_edit ; // переменная ассоциированная с текстовым полем IDC_EDIT
};
void CSliderDemoDlg :: DoDataExchange ( CDataExchange* pDX )
{
DDX_Slider ( pDX , IDC_SLIDER , m_slider ) ; // связывает ползунок у IDC_SLIDER
// с переменной m_spin
DDX_Text ( pDX , IDC_EDIT , m_edit ) ; // связывает текстовое поле IDC_EDIT
// с переменной m_edit
DDV_MinMaxInt ( pDX , m_edit , 0 , 100) ; // определяет диапазон допустимых
// значений переменной m_edit
}
// функция обработки события изменения положения ползунка IDC_SLIDER
void CSliderDemoDlg :: OnCustomDrawSlider(NMHDR* pNMHDR, LRESULT* pResult)
{
UpdateData ( true ) ; // считывает данные из элементов управления
// в ассоциированные переменные
m_edit = m_slider ; // передаёт данные из ползунка в текстовое поле
UpdateData ( false ) ; // передаёт значение ассоциированных переменных
// в элементы управления
}

Функции класса CSliderCtrl


Для использования ползунка необходимо создать с помощью ClassWizard ассоциированную пере-
менную типа CSliderCtrl. Этот объект хранит положение ползунка. Для операций с ползунком в классе
CSpinButtonCtrl определены следующие функции:
SetPos ( ) устанавливает положение элемента управления;
GetPos ( ) возвращает положение элемента управления;
SetRange ( ) устанавливает диапазон значений;
GetRange ( ) получает диапазон значений;
SetRangeMax ( ) устанавливает максимальное положение бегунка;
GetRangeMax ( ) возвращает максимальное положение бегунка;
SetRangeMin ( ) устанавливает минимальное положение бегунка;
GetRangeMin ( ) возвращает минимальное положение бегунка;
SetLineSize ( ) устанавливает величину единичных перемещений (клавиши управления курсо-
ром);
GetLineSize ( ) возвращает величину единичных перемещений;

Выжол Ю.А. Программирование на Visual C++


Лекция 17 Дополнительные элементы управления 5
SetPageSize ( ) устанавливает величину страничных перемещений (клавиши PageUp и
PageDown);
GetPageSize ( ) Получить величину страничных перемещений;

GetLineSize ( ) Получить величину единичных перемещений;


SetLineSize ( ) Установить величину единичных перемещений;
GetPageSize ( ) Получить величину страничных перемещений;
SetPageSize ( ) Установить величину страничных перемещений;
GetSelection ( ) Получить диапазон текущего выбора;
SetSelection ( ) Установить диапазон текущего выбора;
ClearSel ( ) Очищает текущий выбор бегунка;
GetChannelRect ( ) Получить размер элемента управления;
GetThumbRect ( ) Получить размер бегунка;
GetTicArray ( ) Получить положение всех меток;
GetTic ( ) Получить положение указанной метки;
SetTicFreq ( ) Задать частоту отображения меток;
ClearTics ( ) Удаление меток;
VerifyPos ( ) Проверяет допустимость положения бегунка. Эту функцию нельзя использовать в
обработчике уведомлений;
GetNumTic ( ) Получить количество меток.

Выжол Ю.А. Программирование на Visual C++

Вам также может понравиться