Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПро - все лк.pdf
Скачиваний:
63
Добавлен:
16.03.2016
Размер:
1.35 Mб
Скачать

SS_ETCHEDHORZ, SS_ETCHEDVERT, SS_ETCHEDFRAME – рамки с тенью,

состоящей из серого и белого цветов). Текст во всех этих случаях игнорируется. Существуют еще два стиля статических окон: SS_ICON – стиль, позволяющий отображать в окне иконку и SS_USERITEM – для создания

пунктов, выбираемых пользователем (например, пунктов меню) .

Класс полос прокрутки

Полосы прокрутки или полосы скроллинга могут быть автоматически добавлены к окну, если вы укажете в стиле окна идентификаторы горизонтальной WS_VSCROLL и вертикальной WS_HSCROLL полос прокрутки. Однако вы в любой момент можете создать свое дочернее окно прокрутки, используя предопределенный класс окна "scrollbar" и один из двух стилей для полос прокрутки: SBS_VERTS – для вертикальной и SBS_HORZ – для горизонтальной полос прокрутки. Пользователь сам определяет положение полосы скроллинга внутри родительского окна и его размеры через соответствующие параметры функции CreateWindow при создании или MoveWindow при дальнейшей работе.

Вы можете установить диапазон и положение полосы прокрутки при помощи функций:

SetScrollRange(hwndScroll, SB_CTL, iMin, iMax, bRedraw);

SetScrollPos(hwndScroll, SB_CTL, iPos, bRedraw);

где параметры iMin и iMax устанавливают соответственно минимальное (при котором отметка полосы прокрутки устанавливаются либо в крайнее верхнее для вертикальной полосы прокрутки, либо в крайнее левое положение – для горизонтальной) и максимальное значение, bRedraw устанавливается в TRUE если необходима перерисовка полосы скроллинга и в FALSE в обратном случае, iPos определяет текущее положение полосы скроллинга (и лежит в диапазоне от iMax до iMax). Следует отметить, что если вы используете полосы прокрутки, созданные с помощью стилей окна, то непосредственного описателя полосы прокрутки hwndScroll вы не имеете. Для их управления вы должны использовать описатель окна, которому принадлежат полосы прокрутки:

SetScrollRange(hwnd, SB_VERT, iMin, iMax, bRedraw);

SetScrollPos(hwndScroll, SB_HORZ, iPos, bRedraw);

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

Все полосы прокрутки посылают сообщения родительскому окну при щелчке мыши или перетаскивании маркера полосы прокрутки. При этом в родительское окно приходит сообщение WM_VSCROLL или WS_HSCROLL.

39

Для полос прокрутки окна параметр lParam равен 0, а для полос прокрутки, созданных на родительском окне, в этом параметре передается описатель полосы прокрутки, пославшей сообщение. Младшее слово параметра wParam определяет то действие, которое совершается с полосой прокрутки. Вот его некоторые значения: SB_LINEUP, SB_PAGEUP, SB_THUMBTRACK, SB_THUMBPOSITION, SB_PAGEDOWN, SB_PAGEDOWN, SB_LINEDOWN, SB_ENDSCROLL. Старшее слово параметра wParam указывает текущее положение полосы прокрутки.

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

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

Одним из простейших применений окон редактирования является простое однострочное окно ввода данных, которое, например, используется в окнах открытия и сохранения файлов для указания имени файла.

При создании указывается стиль окна редактирования (присутствие параметра WM_CHILD обязательно), который может использовать следующие значения: ES_LEFT, ES_RIGHT, ES_CENTER для выравнивания редактируемого текста соответственно по левому или правому краю, либо по центру; ES_MULTILINE – для создания многострочного окна редактирования;

ES_AUTOHSCROOL и ES_AUTOVSCROOL для включения соответственно горизонтальной и вертикальной полосы прокрутки.

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

EN_SETFOCUS

окно получило фокус ввода;

EN_KILLFOCUS

окно потеряло фокус ввода;

EN_CHANGE

содержимое окна будет меняться;

EN_UPDATE

содержимое окна изменилось;

EN_ERRSPACE

произошло переполнение буфера ввода;

EN_MAXTEXT

произошло переполнение буфера ввода при вставке;

EN_HSCROLL

на горизонтальной полосе прокрутки был щелчок

мыши;

 

EN_VSCROLL

на вертикальной полосе прокрутки был щелчок

мыши;

 

 

40

Поместить либо прочитать текст из окна редактирования можно при помощи функций SetWindowText и GetWindowText.

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

Вы можете выделить текст, указав начальное и конечное положение выделения:

SendMessage(hwndEdit, EM_SETSEL, iStart, iEnd);

а также получить начальное и конечное положение текущего выделения:

SendMessage(hwndEdit, EM_GETSEL, (wParam) &iStart, (lParam) &iEnd);

Длину строки можно получить используя номер строки в окне редактирования:

int iLength = SendMessage(hwndEdit, EM_LINELENGTH, iLine, 0);

а также скопировать саму строку в буфер:

int iLength = SendMessage(hwndEdit, EM_GETLINE, (LPARAM) szBuffer);

С выделенным в окне редактирования текстом можно выполнить те же действия, которые предоставляются большинством текстовых редакторов: копирование, вставку, удаление, удаление с копированием, послав в окно редактирование соответствующие сообщения (WM_COPY, WM_PASTE, WM_CLEAR, WM_CUT). Параметры сообщения в этом случае равны 0.

Класс окна списка

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

Чаще всего списки используются в окнах диалога, например, при открытии файла в окне списка отображаются имена файлов текущего каталога. Список позволяет выбирать один пункт списка или несколько. Если окно списка имеет фокус ввода, то один из пунктов списка выводится окруженным штриховой линией. Такая индикация не означает, что данный пункт выбран. Выбранный пункт индицируется световым выделением.

Дочернее окно списка создается с помощью вызова функции CreateWindow, с использованием имени "listbox" в качестве класса окна и WS_CHILD в качестве идентификатора стиля. Кроме этого, окно списка имеет ряд предопределенных стилей:

41

LBS_NOTIFY инициирует посылку сообщений от списка родительскому окну;

LBS_SORT дает возможность сортировки элементов списка; LBS_MULTIPLESEL дает возможность выбора сразу нескольких пунктов

списка

LBS_STANDART = (LBS_NOTIFY|LBS_SORT|WS_VSCROLL|WS_BORDER)

Самой естественной операцией для окна списка является добавление строк. Это выполняется путем посылки сообщения в окно списка:

SendMessage(hwndList, LB_INSERTSTRING, iIndex, (LPARAM) szString);

где iIndex – значение индекса. Если вы используете стиль LBS_SORT , то можно использовать сообщение:

SendMessage(hwndList, LB_ADDSTRING,0, (LPARAM) szString);

Удалить строку из списка можно путем посылки сообщения:

SendMessage(hwndList, LB_DELETESTRING, iIndex, 0);

Полностью очистить список:

SendMessage(hwndList, LB_RESETCONTENT,0,0);

Для получения информации от списка также можно использовать ряд сообщений. Так, количество строк и выбранный текущий элемент вы можете узнать:

int iCount = SendMessage(hwndList, LB_GETCOUNT,0,0); int iIndex= SendMessage(hwndList, LB_GETCURSEL,0, 0);

Вы можете определить длину строки любого элемента, а также скопировать эту строку:

iLength = SendMessage(hwndList, LB_GETTEXTLEN, iIndex, 0);

iLength = SendMessage(hwndList, LB_GETTEXT, LB_GETTEXT, (LPARAM) szBuffer);

Кроме этого вы можете сами устанавливать выделяемый пункт списка:

SendMessage(hwndList, LB_SETCURSEL, iIndex, 0);

42