Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programming_Windows_95_Part_I.pdf
Скачиваний:
96
Добавлен:
05.06.2014
Размер:
4.61 Mб
Скачать

412

Категория

Элемент

Описание

 

управления

 

List view (список просмотра)

Другие элементы управления

Animation (анимационное изображение)

Drag list (список,

поддерживающий операции типа drag/drop)

Header (заголовок списка просмотра)

Hot-Key (горячая клавиша)

Image list (список изображений)

Progress bar (индикатор процесса)

Rich edit (усовершенствованный редактор)

Tab (набор закладок для выбора)

Trackbar (окно с движком для выбора значения из диапазона) Up-Down (полоса прокрутки, связанная с окном редактирования для увеличения или уменьшения на 1 целочисленного значения)

Отображает список элементов, идентифицируемых битовым образом и текстовыми данными (правая панель окна программы Windows Explorer).

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

Окно списка, поддерживающее

простые операции drag/drop по отношению к себе

идругим окнам типа Drag list. (Не drag/drop OLE-контейнер).

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

Отображает результат операции определения клавиш активизации (горячих клавиш). Элемент управления для хранения набора растровых изображений (битовых образов, курсоров, значков), не являющийся окном. Отображает динамику длительной операции как процент от выполненной задачи.

Редактор, поддерживающий множество шрифтов

ибазовые возможности OLE-контейнера. Отображает список закладок для выбора. Tabs используются в окне набора страниц свойств для выбора страницы свойств. Панель задач (task bar) Windows 95 — есть элемент управления Tab, использующий кнопки вместо закладок.

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

Тип полосы прокрутки, состоящий из двух стрелок (но собственно без полосы) для увеличения или уменьшения на 1 величины,

находящейся в связанном поле редактирования.

Рис. 12.1 Элементы управления, поддерживаемые библиотекой COMCTL32.DLL

В этой главе мы рассмотрим основы работы со всеми этими элементами управления и остановимся на первых двух категориях — элементах управления главного окна и составных элементах управления — представляющих собой набор, который будет использоваться в каждом приложении для Windows. Две другие категории — элементы управления Windows Explorer и другие элементы управления — более детально рассматриваются в книге Nancy Cluts "Programming the Windows 95 User Interface" (Microsoft Press, 1995).

Основы элементов управления общего пользования

Каждый элемент управления общего пользования, за исключением списка изображений, реализован как класс окна. С этой точки зрения, элементы управления общего пользования похожи на предопределенные элементы управления диалоговых окон, появившиеся в первой версии системы Windows. Оба типа элементов управления строятся с помощью функции CreateWindow, настраиваются с использованием конкретных флагов стиля класса, управляются специфичными для данного класса сообщениями и приводятся к нужному состоянию с применением обычных API — вызовов, манипулирующих с окнами. Оба типа элементов управления также посылают уведомляющие сообщения родительскому окну, информируя обо всех происходящих событиях.

Разница между элементами управления общего пользования и предопределенными элементами управления состоит в том, какие сообщения они посылают для уведомления. Предопределенные элементы управления посылают уведомляющие сообщения WM_COMMAND, в то время как элементы управления общего пользования (за некоторыми исключениями) посылают сообщения WM_NOTIFY. Хотя при поверхностном взгляде механизмы передачи отличаются, идея, лежащая в основе этих уведомляющих сообщений, одна и та же: родительское окно может иметь возможность реагировать на все интересующие его события.

413

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

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

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

Инициализация библиотеки

Все элементы управления общего пользования, за исключением усовершенствованного редактора, находятся в файле COMCTL32.DLL, который впервые появился в Microsoft Windows NT 3.51 и Windows 95. (По имени этой

DLL можно было бы предположить, что где-то существует 16-разрядная версия этой библиотеки. Microsoft сообщала, что не планирует выпуск 16-битной версии библиотеки элементов управления общего пользования. Microsoft сделала доступными некоторые элементы похожей библиотеки элементов управления общего пользования, поставляемой с Microsoft Windows for Workgroups 3.11, но эта библиотека никогда не поддерживалась официально, и не входит в существующие версии операционных систем Microsoft.)

Для использования какого-либо элемента управления общего пользования программа сначала вызывает функцию InitCommonControls, которая регистрирует классы окон элементов управления, используя функцию RegisterClass. Функция InitCommonControls не имеет параметров и не возвращает никакого значения:

InitCommonControls();

Описание этой функции вместе с другими описаниями, необходимыми для использования библиотеки элементов управления общего пользования, находится в файле COMMCTRL.H. Этот файл не является частью основной группы файлов, на которые имеет ссылки файл WINDOWS.H. Поэтому, любой исходный файл, ссылающийся на функции элементов управления общего пользования, типы данных, символические константы, должен обязательно содержать следующую строку:

#include <commcrtl.h>

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

error: unresolved external symbol __imp__InitCommonControls@0

Для решения этой проблемы добавьте файл COMCTL32.LIB в список компонуемых библиотек.

Ввиду размера и сложности усовершенствованного редактора, он располагается в его собственной динамически подключаемой библиотеке RICHED32.DLL. (Microsoft не собирается выпускать библиотеку RICHED16.DLL.) Усовершенствованный редактор регистрирует самого себя при загрузке этой библиотеки, которую вы вызываете посредством функции LoadLibrary:

LoadLibrary( "RICHED32.DLL");

Описания усовершенствованного редактора находятся в файле RICHEDIT.H, а связанные с OLE описания для него находятся в файле RICHOLE.H.

Создание элементов управления общего пользования

Наиболее общий путь создания окна элемента управления общего пользования состоит в вызове функции

CreateWindow или CreateWindowEx. (Функция CreateWindowEx идентична функции CreateWindow, с тем исключением, что она использует дополнительные стили. Эти стили окна рассматриваются в следующем разделе.) Например, приведенный вызов строит панель инструментов:

414

HWND hwndToolBar = CreateWindow( TOOLBARCLASSNAME, NULL,

CCS_TOP | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPSIBLINGS, 0, 0, 0, 0,

hwndParent, (HMENU) 1, hInst,

0

);

Рассмотрение некоторых параметров мы пока отложим. Имя класса окна не задается в кавычках, поскольку это символическая константа, определение которой зависит от набора символов, выбранного при построении программы. Для набора символов ANSI символическая константа TOOLBARCLASSNAME заменяется строкой "ToolbarWindow32"; для набора символов UNICODE символ "L" ставится перед этим именем (L"ToolbarWindow32") для создания UNICODE-строки. Все классы элементов управления общего пользования определяются этим способом.

Чаще всего элементы управления общего пользования создаются как дочерние окна, что определяется заданием флага WS_CHILD и установкой описателя родительского окна hwndParent. Как показано в примере, дочерние окна часто создаются с начальным местоположением (x, y) и размерами (cx, cy) равными нулю, а затем изменяют свой размер при изменении размеров родительского окна (т. е. когда родительское окно получает сообщение WM_SIZE).

Альтернативой вызову функции CreateWindow является вызов специализированной функции создания элемента управления, которая обычно выполняет некоторую стандартную инициализацию. Примером специализированной функции создания элемента управления является функция CreateToolbarEx, строящая панель инструментов, и добавляющая в нее кнопки. В других случаях, таких как набор страниц свойств и страница свойств, имя класса недоступно, поэтому требуется вызов специализированной функции: PropertySheet строит набор страниц свойств, а CreatePropertySheetPage строит индивидуальные страницы свойств. Список изображений строится вызовом функции ImageList_Create — специализированной функции, поскольку список изображений не является окном. На рис. 12.2 приведены все имена классов элементов управления общего пользования и функции их создания.

Категория/Элемент управления

Класс элемента управления

Функция создания

Элементы управления главного окна

CreateToolbarEx

Панель инструментов

TOOLBARCLASSNAME

Окно подсказки

TOOLTIPS_CLASS

Нет

Строка состояния

STATUSCLASSNAME

CreateStatusWindow

Анимационное изображение

ANIMATE_CLASS

Нет

Индикатор процесса

PROGRESS_CLASS

Нет

Составные диалоговые элементы управления

CreatePropertySheetPage

Страница свойств

Нет

Набор страниц свойств

Нет

PropertySheet

Элементы управления Windows Explorer

 

Дерево просмотра

WC_TREEVIEW

Нет

Список просмотра

WC_LISTVIEW

Нет

Список изображений

Нет

ImageList_Create

 

Другие элементы управления

MakeDragList

Список, поддерживающий операции

"listbox" (ANSI) или L"listbox"

типа drag/drop

(UNICODE)

 

Заголовок списка просмотра

WC_HEADER

Нет

Горячая клавиша

HOTKEY_CLASS

Нет

Усовершенствованный редактор

"RichEdit" (ANSI) или

Нет

 

L"RichEdit" (UNICODE)

 

Набор закладок для выбора

WC_TABCONTROL

Нет

Окно с движком для выбора значения

TRACKBAR_CLASS

Нет

из диапазона

 

CreateUpDownControl

Полоса прокрутки, связанная с окном

UPDOWN_CLASS

редактирования для изменения

 

 

значения

 

 

Рис. 12.2 Имена классов и функции создания элементов управления общего пользования

Стили элементов управления общего пользования

Необходимо приложить немало усилий при создании любого типа окна — вашего собственного окна, предопределенного элемента управления или элемента управления общего пользования. Эта работа состоит в выборе правильных флагов стиля окна. (Вспомните, флаги стиля объединяются побитовой операцией OR языка C и передаются вместе как один из двух параметров в функцию CreateWindowEx : или как первый параметр

415

dwExStyle, или как четвертый — dwStyle.) Эта работа достаточна трудна, поскольку флаги стиля влияют на широкий диапазон возможностей, включающих визуальное представление окна (или отсутствие отображения, если флаг WS_VISIBLE пропущен по невнимательности), поведение окна и конкретные типы взаимодействия между окнами.

При создании элементов управления общего пользования существует четыре набора флагов стиля: флаги основного стиля окна (WS_), флаги основного стиля элемента управления общего пользования (CCS_), флаги стиля, специфичные для конкретного элемента управления и флаги расширенного стиля (WS_EX_). Флаги первого из перечисленных типов передаются в функцию CreateWindowEx в качестве четвертого параметра; флаги последнего типа передаются в функцию CreateWindowEx в качестве первого параметра.

Основные стили окна

Основные стили окна имеют имена, начинающиеся с префикса WS_ и могут влиять на окна любого класса. Из примерно двадцати этих стилей окна семь применяются к элементам управления общего пользования: WS_CHILD, WS_VISIBLE, WS_DISABLED, WS_BORDER, WS_TABSTOP, WS_CLIPCHILDREN и WS_CLIPSIBLINGS.

Любое окно элемента управления общего пользования будет использовать бит стиля WS_CHILD, что делает элемент управления дочерним по отношению к какому-то родительскому окну, на поверхности которого будет расположен элемент управления. Когда элемент управления посылает уведомляющие сообщения, он посылает их родительскому окну. Дочерние окна автоматически удаляются при удалении их родительского окна.

Флаг стиля WS_VISIBLE позволяет окну быть отображенным (тем не менее наличие этого флага не гарантирует того, что окно не сможет быть перекрыто другим окном). Частой программной ошибкой является отсутствие флага стиля WS_VISIBLE, что заставляет программиста повсюду (в книгах, журналах, службах поддержки online) искать причину того, что окно не отображается ("потерялось"). Изменяйте, если необходимо, видимость окна после его создания с помощью функций ShowWindow или SetWindowPos.

Флаг WS_DISABLED делает окно запрещенным, т. е. такое окно не получает сообщений от мыши и клавиатуры. Наиболее общее использование этого флага состоит в запрещении элемента управления в диалоговом окне; будучи запрещенными, большинство элементов управления изменяют свой вид, чтобы дать пользователю понять, что они в данный момент недоступны. Например, кнопка OK в диалоговом окне File Open запрещена до тех пор, пока в поле редактирования имени файла — пусто. Кнопка становится разрешенной (доступной), когда какой-либо текст введен в окно задания имени файла. Окно создается один раз с использованием функции CreateWindow, а вызовы функций EnableWindow позволяют делать это окно запрещенным или разрешенным.

Флаг WS_BORDER вызывает появление рамки вокруг окна элемента управления.

Если элемент управления находится в диалоговом окне, то использование флага WS_TABSTOP включает его в список переходов по клавише <Tab>.

Флаги WS_CLIPCHILDREN и WS_CLIPSIBLINGS защищают поверхность дочерних окон от внешнего разрушения. Термин "отсечение" (clipping) относится к прорисовке границ между окнами. В то время, как отсечение всегда разрешено для перекрывающихся и всплывающих окон, оно запрещено для дочерних окон. Флаг WS_CLIPCHILDREN разрешает отсечение, когда рисуется родительское окно дочерних окон, тем самым предотвращая рисование в родительском окне на дочерних окнах. Флаг WS_CLIPSIBLINGS разрешает отсечение между дочерними окнами, имеющими общее родительское окно, для предотвращения соперничества между ними — борьбы между двумя дочерними окнами, имеющими общего родителя, за пиксели в перекрывающихся участках. При работе с дочерними окнами эти два стиля помогают решить проблемы непонятного визуального представления этих окон.

Флаги расширенного стиля окна

Флаги расширенного стиля окна имеют имена, начинающиеся с префикса WS_EX_, и передаются в функцию CreateWindowEx в качестве первого параметра. Из 27 расширенных стилей 3 относятся к созданию дочерних окон: WS_EX_CLIENTEDGE, WS_EX_STATICEDGE и WS_EX_NOPARENTNOTIFY.

Флаги стиля WS_EX_CLIENTEDGE и WS_EX_STATICEDGE поддерживают трехмерность изображения. Надлежащее их использование позволяет приложению хорошо выглядеть по отношению к другим приложениям Windows 95. Обратите внимание, что эти флаги стиля поддерживаются только в Windows 95 и версиях Windows NT, имеющих интерфейс системы Windows 95. (Эти флаги не имеют никакого эффекта в более ранних версиях операционной системы.)

Флаг стиля WS_EX_CLIENTEDGE строит "углубленную" область основной рабочей зоны приложения. Например, окно текста программы текстового процессора. Так как большинство элементов управления, таких как панель инструментов и строка состояния, создаются вне этой области, избегайте этих флагов стиля для родительских окон панели инструментов и строки статуса. Кроме того, избегайте использования флага стиля

416

WS_EX_OVERLAPPEDWINDOW, который включает как часть своего определения флаг стиля

WS_EX_CLIENTEDGE.

Флаг стиля WS_EX_STATICEDGE создает углубленное представление только для окон, в которые осуществляется вывод. Например, уведомляющее окно на панели задач Windows 95 — маленькое окно у правого края панели задач, содержащее значки строки состояния и часы — использует этот стиль. Этот флаг используется с такими элементами управления как индикатор процесса и окно анимационного изображения. Кроме того, элементы управления, предназначенные только для вывода, входящие в состав строки состояния или панели инструментов, будут, вероятно, использовать этот флаг стиля, так как его уникальное представление легко понимается опытным пользователем Windows 95.

Флаг стиля WS_EX_NOPARENTNOTIFY отменяет посылку уведомляющих сообщений WM_PARENTNOTIFY дочерним окном родительскому. Без установки этого бита дочернее окно посылает уведомляющие сообщения своему родительскому окну, когда дочернее окно создается, уничтожается или получает сообщение о нажатии клавиш мыши. Элементы управления диалогового окна всегда строятся с использованием этого флага для снижения трафика сообщений.

Флаги основного стиля элемента управления общего пользования

Библиотека элементов управления общего пользования поддерживает набор значений стиля с префиксом CCS_ для использования с панелями инструментов, окнами состояния и заголовками списка просмотра. Это флаги

CCS_ADJUSTABLE, CCS_BOTTOM, CCS_NODIVIDER, CCS_NOMOVEY, CCS_NOPARENTALIGN, CCS_NORESIZE и CCS_TOP. Поскольку смысл этих флагов стиля зависит от конкретного элемента управления, при дальнейшем рассмотрении мы будем обращать ваше внимание на детали.

Флаги стиля, специфичные для конкретного элемента управления

 

 

 

 

 

Элементы

управления

общего

пользования

Windows

95

так

же

как

и

пред-

определенные

элементы

управления

диалогового

окна имеют

специфичные

флаги

стиля,

такие

как

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

Детальное рассмотрение индивидуальных флагов стилей будет приведено позднее в этой главе при подробном описании конкретных элементов управления общего пользования.

Категория/Элемент управления

Префикс флага стиля

Пример

Элементы управления главного окна

 

Панель инструментов

TBSTYLE_

TBSTYLE_ALTDRAG

Окно подсказки

Нет

 

Строка состояния

SBARS_

SBARS_SIZEGRIP

Анимационное изображение

ACS_

ACS_AUTOPLAY

Индикатор процесса

Нет

 

Составные диалоговые элементы управления

Страница свойств

Нет

 

Набор страниц свойств

Нет

 

Элементы управления Windows Explorer

 

Дерево просмотра

TVS_

TVS_HASBUTTONS

Список просмотра

LVS_

LVS_ALIGNLEFT

Список изображений

Нет

 

Другие элементы управления

 

Список, поддерживающий

Нет

 

операции типа drag/drop

 

 

Заголовок списка просмотра

HDS_

HDS_BUTTONS

Горячая клавиша

Нет

 

Усовершенствованный редактор

ES_

ES_DISABLENOSCROLL

Набор закладок для выбора

TCS_

TCS_BUTTONS

Окно с движком для выбора значения

TBS_

TBS_AUTOTICKS

из диапазона

 

 

Полоса прокрутки, связанная с окном

UDS_

UDS_ALIGNLEFT

редактирования для

 

 

изменения значения

 

 

Рис. 12.3 Префиксы флагов стилей элементов управления общего пользования

417

Посылка сообщений элементам управления общего пользования

После создания окна элемента управления общего пользования для управления его действиями ему посылаются сообщения. Как можно предположить, для этого требуется вызов функции SendMessage с ее традиционными четырьмя параметрами: описатель окна, идентификатор сообщения, значение wParam, значение lParam. Так же как существуют специфические флаги стилей элементов управления общего пользования, так и существуют специфические сообщения.

Альтернативой вызовам функции SendMessage является использование набора макросов языка C, определенных в файле COMMCTRL.H, которые получают специфичный для сообщения набор параметров, осуществляют необходимые преобразования (например, упаковка двух величин типа shorts в одну величину типа lParam), а затем вызывают функцию SendMessage. Возвращаемое значение с целью минимизации числа сообщений компилятора также преобразуется к нужному типу, поскольку значение типа LRESULT, возвращаемое функцией SendMessage, не совпадает с ожидаемым типом возвращаемого значения.

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

hItem =(HTREEITEM)SendMessage( hwndTV, TVM_INSERTITEM, 0,(LPARAM)(LPTV_INSERTSTRUCT)&tvis );

Ниже показано, как послать то же самое сообщение, используя макрос TreeView_InsertItem:

hItem = TreeView_InsertItem(hwndTV, &tvis);

Макрос проще для чтения (имя макроса содержит имя класса окна и имя сообщения), он требует только половину параметров, а дает тот же результат, поскольку он расширяется в вызов функции SendMessage с соответствующим преобразованием параметров. Перейдя однажды на работу с макросами, обратно вернуться будет уже трудно.

(Если вам интересно использование набора аналогичных макросов для предопределенных элементов управления, то вы можете найти их определения в файле WINDOWSX.H. Макросы не документированы ни в одном файле помощи. Они достаточно хорошо сами себя объясняют и просты в использовании. Так же как и применение макросов для элементов управления общего пользования, так и использование макросов из файла WINDOWSX.H может сделать программу проще для написания и чтения.)

Несмотря на то что такие макросы очень полезны, файлы Win32, к сожалению, включают определения лишь для половины элементов управления общего пользования. Файл COMMCTRL.H содержит лишь макроопределения для следующих классов: анимационное изображение, заголовок списка просмотра, список просмотра, набор страниц свойств (в файле PRSHT.H), дерево просмотра и набор закладок для выбора.

Поскольку эти макросы так удобны, на прилагаемом к книге компакт-диске вы найдете набор макросов для других элементов управления общего пользования. Там находятся макросы для следующих классов: горячая клавиша, индикатор процесса, усовершенствованный редактор, строка состояния, панель инструментов, окно подсказки, окно с движком для выбора значения из диапазона и полоса прокрутки, связанная с окном редактирования для изменения значения. Эти макросы находятся в файле \PETZOLD\CHAP12\COMCTHLP.H.

Рис. 12.4 Программа CTLMACRO обеспечивает быстрый доступ к макросам сообщений элементов управления общего пользования

На прилагаемом компакт-диске находится также программа CTLMACRO, которая каталогизирует все макросы элементов управления общего пользования. Как показано на рис. 12.4, программа CTLMACRO элементизирует все макросы элементов управления общего пользования иерархически, и они доступны посредством простого дерева просмотра. Когда вы найдете сообщение, которое вам необходимо, нажмите кнопку Copy для копирования

Соседние файлы в предмете Операционные системы