Операционная система Windows 95 для программиста© Александр Фролов, Григорий ФроловТом 22, М.: Диалог-МИФИ, 1993, 271 стр. 7.5. Орган управления Up-DownВ этом разделе мы расскажем вам об очень простом органе управления Up-Down , который мы будем называть органом циклического просмотра.
Вы можете создать вертикальный или горизонтальный орган циклического просмотра, просто указав соответствующий стиль окна органа 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 ,
а также дополнительные, определяющие поведение
этого органа управления:
Вот пример создания органа 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_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. |