Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Операционная система Windows 95 для программиста

© Александр Фролов, Григорий Фролов
Том 22, М.: Диалог-МИФИ, 1993, 271 стр.

[Назад] [Содеожание] [Дальше]

7.5. Орган управления Up-Down

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

Внешне этот орган управления похож на вырожденную полосу просмотра Scrollbar, у которой нет движка, а верхняя и нижняя кнопка расположены рядом.

Вы можете создать вертикальный или горизонтальный орган циклического просмотра, просто указав соответствующий стиль окна органа Up-Down.

Обычно орган управления Up-Down используется для изменения значения какого-либо параметра (например, количества копий при печати). При этом он комбинируется с однострочным текстовым редактором, как это показано на рис. 7.7.

Рис. 7.7. Комбинирование органа управления Up-Down и однострочного текстового редактора

В этом случае можно сделать так, что когда пользователь нажимает кнопки органа управления Up-Down, в окне текстового редактора появляются значения, которые находятся в заранее заданном диапазоне. Пользователь может также ввести нужное значение непосредственно в окне текстового редактора.

Вы также можете объединить орган циклического просмотра с другим органом управления, например, с органом управления Tab или Trackbar. Способ такого объединения органов управления будет описан ниже.

Создание органа управления Up-Down

Орган управления Up-Down создается функцией CreateWindowEx на базе предопределенного класса окна UPDOWN_CLASS . При этом следует сохранить полученный от функции CreateWindowEx идентификатор для посылки окну органа Up-Down управляющих сообщений.

Вы можете также переместить изображение пиктограммы органа Up-Down из палитры редактора диалогов в проектируемую диалоговую панель. Если вы работаете с системой Microsoft Visual C++ версии 2.0 , не забудьте внести изменения в регистрационную базу данных, описанные в этой главе.

Для определения идентификатора окна органа управления Up-Down, расположенного в диалоговой панели, вы можете воспользоваться функцией GetDlgItem .

Есть еще один способ, который удобен при объединении органа Up-Down с каким-либо другим органом управления. Этот способ основан на использовании функции CreateUpDownControl :

HWND CreateUpDownControl(
  DWORD dwStyle,    // стиль окна органа Up-Down
  int   x, 	      // расположение окна
  int   y, 
  int   cx,         // размеры окна
  int   cy, 
  HWND  hParent,    // иднтификатор родительского окна
  int   nID,        // идентификатор органа Up-Down
  HINSTANCE hInst,  // идентифкатор приложения	
  HWND  hBuddy,     // идентификатор сцепленного органа
  int   nUpper,     // верхняя граница значений
  int   nLower,     // нижняя граница значений
  int   nPos);      // начальное значение

Функция CreateUpDownControl выполняет несколько действий.

Прежде всего, она создает орган управления Up-Down с помощью функции CreateWindowEx на базе предопределенного класса окна UPDOWN_CLASS . Затем она устанавливает диапазон возможных значений и начальное значение, посылая окну органа управляющие сообщения. Затем функция CreateUpDownControl подключает орган Up-Down к органу управления с идентификатором hBuddy.

Остановимся подробнее на объединении органов управления .

Окно органа управления, с которым сцепляется орган Up-Down, называется сцепленным окном (buddy window ). Так как при сцеплении органы действуют как единое целое и находятся внутри одной рамки (рис. 7.7), пользователю кажется, что он работает с одним органом управления.

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

Во-первых, для органа управления Up-Down можно задать стиль окна UDS_AUTOBUDDY . При этом последний сцепляется с органом управления, расположенным под ним (с предыдущим по порядку в шаблоне диалоговой панели).

Во-вторых, вы можете сцепить органы управления, послав окну органа Up-Down сообщение UDM_SETBUDDY . Именно этот способ и используется функцией CreateUpDownControl.

При создании органа Up-Down вы должны указывать обычные стили окна, такие как WS_CHILD , WS_BORDER и WS_VISIBLE , а также дополнительные, определяющие поведение этого органа управления:

Стиль Описание
UDS_ALIGNLEFT Орган Up-Down будет выровнен по левой границе окна сцепленного с ним органа управления
UDS_ALIGNRIGHT То же, но по правой границе
UDS_SETBUDDYINT В заголовок окна органа управления, сцепленного с органом Up-Down, будет автоматически записываться текущее значение, установленное для органа Up-Down. Если же орган Up-Down сцеплен с органом Listbox, заголовок изменяться не будет. Вместо этого будет изменяться номер выделенного элемента списка
UDS_NOTHOUSANDS Используется вместе со стилем UDS_SETBUDDYINT. Указывает, что при отображении текущего значения не нужно разделять разряды тысяч десятичной точкой
UDS_ARROWKEYS Если указан этот стиль, для изменения текущего значения можно использовать клавиши перемещения курсора по вертикали
UDS_HORZ Размещение окна органа Up-Down по горизонтали
UDS_WRAP При достижении в процессе перебора значений верхней или нижней границы будет происходить переход, соответственно, к нижнему или верхнему значению. Таким образом, возможна организация циклического перебора возможных значений

Вот пример создания органа Up-Down, сцепленного с однострочным текстовым редактором hwndEdit, который расположен в диалоговой панели:

hwndUpDown = CreateUpDownControl (
  WS_CHILD | WS_BORDER | WS_VISIBLE | 
  UDS_WRAP | UDS_ARROWKEYS | UDS_ALIGNRIGHT |
  UDS_SETBUDDYINT, 0, 0, 0, 0, hdlg, IDC_UPDOWN, hInst,
  hwndEdit,10, 1, 1);

Обратите внимание, что мы не указали размеры и расположение окна органа Up-Down, так как при сцеплении они устанавливаются автоматически.

Сообщения для органа управления Up-Down

Для органа управления Up-Down определены следующие сообщения:

Сообщение Описание
UDM_GETACCEL Получение параметров режима ускорения работы органа управления Up-Down
UDM_GETBASE С помощью этого сообщения приложение может определить, какая система счисления (десятичная или шестнадцатиричная) используется для органа Up-Down
UDM_GETBUDDY Определение идентификатора окна органа управления, сцепленного с органом Up-Down
UDM_GETPOS Определение текущего значения
UDM_GETRANGE Определение интервала значений
UDM_SETACCEL Установка параметров режима ускорения работы органа управления Up-Down
UDM_SETBASE Установка десятичной или шестнадцатиричной системы счисления
UDM_SETBUDDY Подключение сцепленного органа управления
UDM_SETPOS Установка текущего значения
UDM_SETRANGE Установка интервала значений

Сообщение UDM_SETACCEL позволяет установить режим ускорения. В этот режим орган управления Up-Down переходит в том случае, если пользователь держит одну из кнопок органа нажатой в течении определенного интервала времени. После этого текущее значение, связанное с органом Up-Down, начинает изменяться автоматически. Подробности вы можете найти в справочной системе SDK.

Для подключения органа Up-Down к окну другого органа управления вам может пригодиться сообщение UDM_SETBUDDY. Параметр wParam этого сообщения должен содержать идентификатор окна органа управления, к которому будет выполняться подключение.

С помощью сообщения UDM_SETRANGE вы можете установить диапазон значений (такая операция может вам пригодиться при инициализации органа Up-Down, созданного функцией CreateWindowEx). Параметр wParam этого сообщения должен быть равен нулю, а параметр lParam необходимо указать следующим образом:

lParam = (LPARAM) MAKELONG((short)nMax, (short)nMin);

Здесь nMin и nMax задают, соответственно, нижний и верхний предел изменения значения. Параметр nMin не должен быть меньше константы UD_MINVAL, а параметр nMax - больше константы UD_MAXVAL. Кроме того, минимальное и максимальное значение не должны отличаться друг от друга больше чем на значение константы UD_MAXVAL.

С помощью сообщения UDM_SETPOS можно задать текущее значение. При этом в параметр wParam нужно записать ноль, а параметр lParam подготовить так:

lParam = (LPARAM) MAKELONG((short)nPos, 0);	

Параметр nPos должен содержать новое значение.

При установке системы счисления вы должны в параметр wParam сообщения UDM_SETBASE записать значение 10 (для десятичной системы счисления) или 16 (для шестнадцатиричной). В параметр lParam нужно записать нулевое значение.

Извещение от органа управления Up-Down

Когда позиция органа управления Up-Down (т. е. текущее значение, связанное с органом) изменяется, родительское окно получает извещение UDN_DELTAPOS , которое поступает в форме сообщения WM_NOTIFY .

При этом в параметре lParam передается адрес структуры NM_UPDOWN , содержащей информацию об изменении:

typedef struct _NM_UPDOWN 
{
  NMHDR hdr;     // заголовок извещения
  int   iPos;    // текущая позиция
  int   iDelta;  // предполагаемая величина изменения позиции
} NM_UPDOWNW;

Обработчик этого извещения может разрешить или запретить изменение позиции, возвратив, соответственно, значение TRUE или FALSE. Кроме того, обработчик извещения может при необходимости изменить содержимое поля iDelta.

[Назад] [Содеожание] [Дальше]