Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Технология разработки программных систем

..pdf
Скачиваний:
13
Добавлен:
05.02.2023
Размер:
1.31 Mб
Скачать

101

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

8.2.8.5. Сообщение от переключателей

Родительское окно получает от переключателей ранее рассмотренное сообщение BN_CLICKED в составе WM_COMMAND.

8.2.8.6.Сообщение от родительского окна к переключателям

1.Родительское окно с дескриптором hWnd может запросить состояние переключателя, который имеет идентификатор nID, через сообщение

BM_GETCHECK. Например:

int k=SendDlgItemMessage(hWnd,nID,BM_GETCHECK,0,0);

Возвращается одно из следующих состояний переключателя:

BST_CHECKED включен;

BST_UNCHECKED выключен;

BST_INDETERMINATE неопределенное состояние.

Последний код ответа может иметь только переключатель, для которого был определен стиль BS_AUTO3STATE.

2. Родительское окно может изменить состояние переключателя, посылая ему сообщение BM_SETCHECK, значение wParam параметра которого должно принимать одну из указанных выше величин, а параметр lParam не используется и должен быть равен нулю.

8.2.9. Структура DRAWITEMSTRUCT

Структура DRAWITEMSTRUCT используется при отрисовке пунктов меню, а также для некоторых элементов управления (см. поле CtlType в приведенной ниже таблице), которые имеют стиль OWNERDRAW. Как уже было сказано, этот стиль сообщает Windows, что отрисовку необходимых элементов приложение берет под свой контроль. Обязанностью Windows остается заполнение полей структуры, которая содержит информацию, что и как нужно перерисовать. После этого указатель на структуру передается в функцию родительского окна для обработки. Заметим, что оконная функция будет получать столько сообщений WM_DRAWITEM, сколько пунктов требуется перерисовать. Перечислим допустимые значения для полей структуры:

CtlType

CtlID

itemID

itemAction

itemState

hwndItem

hDC rcItem

itemData

102

Определяет тип элемента управления, который имеет стиль OWNERDRAW:

ODT_MENU

меню;

ODT_BUTTON

кнопка;

ODT_LISTBOX

обычный список;

ODT_LISTVIEW

расширенный список (Win32);

ODT_COMBOBOX

комбинированный список;

ODT_STATIC

статический текст;

ODT_TAB

набор закладок (Win32).

идентификатор элемента управления. Не используется для меню.

номер пункта меню или элемента списков, которые требуют перерисовки.

Определяет тип перерисовки:

ODA_DRAWENTIRE

перерисовка всего пункта;

ODA_FOCUS

пункт имеет фокус ввода;

ODA_SELECT

пункт является выбранным.

Состояние пункта:

 

ODS_DEFAULT обычное состояние;

ODS_FOCUS имеет фокус ввода; ODS_GRAYED недоступен (только для меню); ODS_DISABLED недоступен (только для меню); ODS_CHECKED отмечен (только для меню); ODS_SELECTED выбран (только для меню).

Дескриптор элемента управления. Не используется для меню. Дескриптор контекста отображения.

Структура RECT, ограничивающая прямоугольную область, которая требует перерисовки.

Двойное слово, ассоциированное с данным пунктом.

8.2.10. Стандартный элемент управления окно ввода

Задавая класс “edit”, приложение определяет прямоугольное дочернее окно, в которое пользователь может вводить текст с клавиатуры. Характерная особенность этого органа управления – наличие мигающего курсора ввода информации. Кроме того, в данном окне функционируют все клавиши редактирования.

Для Windows 95/98 объем текста в одном окне ввода не может превышать 32К.

103

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

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

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

ES_AUTOHSCROLL

ES_LOWERCASE

ES_UPPERCASE

ES_OEMCONVERT

ES_NUMBER ES_READONLY ES_PASSWORD

ES_NOHIDESEL

Выполняется автоматическая горизонтальная прокрутка текста, при этом полоса прокрутки не появляется.

Переводит все вводимые символы в нижний регистр.

Переводит все вводимые символы в верхний регистр.

Проводится конвертирование вводимого текста в ASCII символы.

Разрешен ввод только цифр. Ввод информации невозможен.

Все вводимые символы закрываются символомзаполнителем. По умолчанию это символ ‘*’, так что вводимая строка будет выглядеть как “****”. При желании можно переопределить его собственным заполнителем.

Не убирает выделение даже при потере фокуса ввода.

ES_MULTILINE ES_AUTOVSCROLL

ES_WANTRETURN

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

Нажатие клавиши Enter трактуется как переход на новую строку в окне редактора.

8.2.10.2. Сообщения от редактора к родительскому окну

Ниже указаны сообщения, которые редактор посылает своему родительскому окну. Часть из них является самостоятельными Windows сообщениями, а другие приходят в составе сообщения WM_COMMAND. В последнем

104

случае старшее слово параметра wParam соответствует указанному нотифи-

кационному значению:

EN_UPDATE (WM_COMMAND) EN_CHANGE (WM_COMMAND) EN_SETFOCUS, EN_KILLFOCUS (WM_COMMAND) EN_MAXTEXT (WM_COMMAND)

WM_CTLCOLOREDIT

Пользователь изменил текст в окне редактирования, но изменения еще не отображены. Изменения вступили в силу и уже отображены.

Редактор получает или теряет фокус ввода.

Вводимый символ превышает допустимое количество. Смотри сообщение EM_SETLIMITTEXT в следующем разделе.

Посылается родительскому окну, когда редактору требуется перерисовать свой фон. Родительское окно должно вернуть дескриптор кисти для закрашивания фона.

8.2.10.3.Сообщения от родительского окна к редактору

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

SetWindowText(hWnd, szString);

и получить текст заголовка окна hWnd

GetWindowText(hWnd, szString, nString);

Параметр szString для функции SetWindowText() представляет собой константный указатель на строку символов, а для функции GetWindowText() – указатель на буфер длиной nString символов.

Применительно к окну редактирования эти функции позволяют изменить или получить содержимое редактора.

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

WM_SETFONT

Установить новый шрифт для элемента

 

управления. Через wParam передается де-

 

скриптор нового фонта, а lParam=1, что

 

требует перерисовки элемента.

EM_SETLIMITTEXT

105

Ограничивает длину текста, вводимого в окно

 

редактора, величиной nMax символов.

 

Параметры сообщения:

EM_GETLIMITTEXT

wParam = nMax; lParam = 0;

Возвращает текущую длину ограничения

 

текста. Параметры сообщения:

EM_GETSEL

wParam = 0; lParam = 0;

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

 

окне редактора. Определите две переменные

 

типа DWORD dwStart как позиция начала

 

выделения и dwEnd как конечная позиция.

 

Передайте адреса этих переменных через

 

параметры сообщения:

 

wParam = (WPARAM)&dwStart;

 

lParam = (LPARAM)&dwEnd;

 

После возврата из сообщения, переменные

EM_SETSEL

будут содержать требуемую информацию.

Установить выделение текста.

 

Параметры сообщения:

 

wParam=nStart; lParam=nEnd;

 

где nStart, nEnd - начальная и конечная

 

позиции выделения. Если задать (0) и (-1)

 

соответственно, то выделяется весь текст в

 

редакторе. Если начальная позиция равна (-

EM_SETREADONLY

1), то выделение снимается.

Изменить стиль “только для чтения”.

 

Параметры сообщения:

 

wParam=0 или 1; lParam=0;

 

Если wParam=1 стиль устанавливается, если

EM_GETPASSWORDCHAR

wParam=0 стиль снимается.

Возвращает текущий символ-заполнитель для

 

стиля ES_PASSWORD. Параметры сообщения:

EM_SETPASSWORDCHAR

wParam=0; lParam=0;

Установить символ-заполнитель для стиля

 

ES_PASSWORD. Параметры сообщения:

 

wParam=ch; lParam=0;

 

где ch - новый символ-заполнитель.

EM_GETLINECOUNT

Возвращает количество строк в многостроч-

 

 

ном редакторе. Параметры сообщения:

 

wParam=0; lParam=0;

EM_LINELENGTH

EM_GETLINE

106

Возвращает длину для i-той строки. Параметры сообщения: wParam=i; lParam=0;

Скопировать i-ю строку редактора в буфер. Параметры сообщения:

wParam=i; lParam=szBuff;

где szBuff адрес буфера копирования. Возвращает длину i-той строки.

Кроме того, для окон редактирования определены сообщения

WM_COPY, WM_CUT, WM_PASTE, WM_UNDO, которые сопровождают мани-

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

8.2.11. Стандартный элемент управления статический текст

Задавая класс “static”, приложение определяет простое прямоугольное дочернее окно, которое не имеет фокус ввода. Этот орган управления обычно используется для создания текстовых меток, может применяться в качестве контейнера для отображения иконок – обычно в диалогах, а также как разделитель других органов управления.

8.2.11.1. Стили элемент управления STATIC

При создании статического текста функцией CreateWindow() используются следующие дополнительные стили.

SS_SIMPLE

SS_LEFT

SS_RIGHT

SS_CENTER

SS_NOTIFY

SS_BITMAP

SS_ICON

SS_BLACKFRAME SS_BLACKRECT SS_WHITEFRAME SS_WHITERECT

Простой текст с выравниванием влево.

Задает режим выравнивания текста внутри прямоугольной области.

Уведомляет родительское окно о нажатиях клавиш мыши внутри окна.

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

Черная рамка и черный прямоугольник.

Белая рамка и белый прямоугольник.

8.2.11.2. Сообщения от статического элемента управления

Сообщения, которые статический элемент управления посылает своему родительскому окну, немногочисленны. Часть из них является самостоя-

107

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

STN_CLICKED (WM_COMMAND)

STN_DBLCLK (WM_COMMAND)

WM_CTLCOLORSTATIC

Пользователь щелкнул клавишей мыши в окне элемента управления. Только при наличии стиля

SS_NOTIFY

Пользователь сделал двойной щелчок клавишей мыши в окне элемента управления. Только при наличии стиля SS_NOTIFY

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

8.2.11.3. Сообщения от родительского окна к STATIC

Основные операции со стороны родительского окна заключаются в изменении текста этого элемента управления. Мы уже рассмотрели их в пунк-

те 8.2.10.3.

8.2.12. Стандартный элемент управления список

Задавая класс “listbox”, приложение, в простейшем случае, определяет прямоугольное дочернее окно в виде списка текстовых строк. Пользователь может выбирать одну или несколько строк из списка. Элемент управления автоматически добавляет и убирает полосы прокрутки, если полный список не вмещается в клиентскую область дочернего окна.

Для Windows 95/98 максимальное количество строк в списке ограничено значением 32К.

8.2.12.1. Стили элемента управления список

При создании списка функцией CreateWindow() используются следующие основные стили.

LBS_STANDARD

LBS_SORT

LBS_NOTIFY

Стандартный список. Включает стили

LBS_SORT и LBS_NOTIFY.

При добавлении строк к списку производится их автоматическая сортировка. Список генерирует сообщения для родительского окна о двойном щелчке мышью.

LBS_NOINTEGRALHEIGHT

LBS_MULTICOLUMN

LBS_MULTIPLESEL

LBS_OWNERDRAWFIXED

108

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

В списке возможен выбор нескольких строк. Если стиль не указан, то только одна строка может быть отмеченной.

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

Windows.

8.2.12.2. Сообщения от списка к родительскому окну

Ниже указаны сообщения, которые список посылает своему родительскому окну. Часть из них является самостоятельными Windows сообщениями, а другие приходят в составе сообщения WM_COMMAND. В последнем случае старшее слово параметра wParam соответствует указанному нотификационному значению:

LBN_DBLCLK

(WM_COMMAND)

LBN_SELCHANGE

(WM_COMMAND)

LBN_SELCANCEL

(WM_COMMAND)

LBN_SETFOCUS

LBN_KILLFOCUS

(WM_COMMAND) WM_CTLCOLORLISTBOX

Пользователь сделал двойной щелчок клавишей мыши по строке списка.

Пользователь выбрал строку списка.

Пользователь отменил выбор строки.

Список получает или теряет фокус ввода.

Посылается родительскому окну, когда списку требуется перерисовать свой фон. Родительское окно должно вернуть дескриптор кисти для закрашивания фона.

8.2.12.3. Сообщения от родительского окна к списку

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

LB_ADDSTRING

LB_INSERTSTRING

LB_GETCOUNT

LB_DELETESTRING

LB_FINDSTRING

LB_GETCURSEL

LB_SETCURSEL

LB_GETTEXTLEN

109

Добавляет строку szText к списку. Если указан стиль LBS_SORT, то выполняется сортировка списка, если нет, то строка добавляется в конец списка. Параметры сообщения:

wParam=0; lParam=(LPARAM)szText;

Возвращает позицию новой строки.

Вставляет строку szText в i-тую позицию, при этом сортировка не выполняется, даже если определен стиль LBS_SORT. Если i=-1, строка добавляется в конец списка. Параметры сообщения: wParam=i; lParam=(LPARAM)szText;

Возвращает позицию строки.

Возвращает текущее количество строк в списке. Параметры сообщения:

wParam=0; lParam=0;

Уничтожает i-тую строку в списке. Параметры сообщения: wParam=i; lParam=0;

Возвращает количество оставшихся строк. Поиск контекста szFind в строках списка. Поиск начинается с i-той позиции списка.

Параметры сообщения:

wParam=i; lParam=(LPARAM)szFind;

Возвращает номер строки, включающей szFind, или LB_ERR, если контекст не найден. Возвращает номер выделенной пользователем строки. Если список не содержит выделенной строки, возвращается значение LB_ERR. Параметры сообщения:

wParam=0; lParam=0;

Пометить i-тую строку в списке как выделенную. Параметры сообщения:

wParam=i; lParam=0;

Возвращает длину текста в i-той строке списка. Параметры сообщения:

wParam=i; lParam=0;

LB_GETTEXT

110

Копирует текст из i-той строки списка в буфер

 

szBuff. Длина буфера должна быть достаточной,

 

чтобы вместить копируемый текст (см. предыду-

 

щее сообщение). Параметры сообщения:

 

wParam=i; lParam=(LPARAM)szBuff;

LB_GETSEL

LB_SETSEL

LB_SELITEMRANGE

Позволяет определить, выделил ли пользователь i-тую строку списка. Параметры сообщения: wParam=i; lParam=0;

Если возвращается ненулевое значение, строка выделена, если нуль – строка не выделена. Изменяет выделение для i-той строки списка. Параметры сообщения:

wParam=fSel; lParam=i;

Если fSel равно 1, i-тая строка становится выбранной, если fSel=0, то выделение снимается. Изменить статус у диапазона строк от nFist до nLast. Параметры сообщения: wParam=fSel; lParam=MAKELPARAM(nFist,nLast);

8.2.13. Стандартный элемент управления список с вводом

Задавая класс “combobox”, приложение определяет прямоугольное дочернее окно, которое, в простейшем случае, содержит список текстовых строк. Однако список снабжен полем ввода, где пользователь может изменить содержимое строки из списка.

Для Windows 95/98 максимальное количество строк в комбинированном списке ограничено значением 32К.

8.2.13.1. Стили элемента управления combobox

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

CBS_DROPDOWN

CBS_DROPDOWNLIST CBS_SIMPLE

Элемент управления состоит из выпадающего списка и окна редактирования. Окно редактирования отсутствует.

Окно редактирования со списком, который виден всегда.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]