Кнопки, определяемые пользователем. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Кнопки, определяемые пользователем.



 

 

Данный стиль кнопки применяется тогда, когда есть необходимость (или желание) управлять внешним обликом кнопки, а логику обработки клавиатуры и мыши можно оставить самой кнопке. Сообщения родительскому окну такие же, как и у всех кнопок, однако, при необходимости перерисовки кнопки, она посылает родительскому окну сообщение WM _ DRAWITEM c указателем на структуру типа DRAWITEMSTRUCT, используемую при рисовании кнопки, в параметре lParam.

 

 

Класс статических дочерних окон

 

 

Статическое окно имеет предопределенный класс с именем " static ". Данное окно не получает сообщений от мыши и клавиатуры: оно как бы прозрачно для сообщений и сообщения, адресованные статическому окну переправляются родительскому окну (расположенному под ним). Существует 12 стилей статического окна.

 

 

Три из них – (SS _ LEFT, SS _ RIGHT, SS _ CENTER) позволяют выводить текст, заданный в поле текста окна соответственно с выравниванием влево, вправо, по центру. Фактически, окно выводит заданный текст с помощью функции DrawText. Текст окна может быть изменен при помощи функции SetWindowText.

 

 

Существует девять стилей, позволяющих рисовать прямоугольники и рамки – SS _ BLACKRECT, SS _ GRAYRECT, SS _ WHITERECT – рисуют закрашенные прямоугольники, SS _ BLACKFRAME, SS _ GRAYFRAME, SS _ WHITEFRAME –прямоугольные рамки без закрашивания, SS _ ETCHEDHORZ, SS _ ETCHEDVERT, SS _ ETCHEDFRAME – рамки с тенью, состоящей из серого и белого цветов). Текст во всех этих случаях игнорируется.

 

 

Существуют еще два стиля статических окон: SS _ ICON – стиль, позволяющий отображать в окне иконку и SS _ USERITEM – для создания пунктов, выбираемых пользователем (например, пунктов меню).

 

 

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

 

 

Полосы прокрутки или полосы скроллинга могут быть автоматически добавлены к окну, если вы укажете в стиле окна идентификаторы горизонтальной WS _ VSCROLL и вертикальной WS _ HSCROLL полос прокрутки. Однако вы в любой момент можете создать свое дочернее окно прокрутки, используя предопределенный класс окна " scrollbar " и один из двух стилей для полос прокрутки: SBS _ VERTS – для вертикальной и SBS _ HORZ – для горизонтальной полос прокрутки. Пользователь сам определяет положение полосы скроллинга внутри родительского окна и его размеры через соответствующие параметры функции CreateWindow при создании или MoveWindow при дальнейшей работе.

 

 

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


– 37 –

 

 

SetScrollRange(hwndScroll, SB_CTL, iMin, i Max, bRedraw);

 

 

SetScrollPos(hwndScroll, SB_CTL, iPos, bRedraw);

 

 

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

 

 

SetScrollRange(hwnd, SB_VERT, iMin, i Max, bRedraw);

 

 

SetScrollPos(hwndScroll, SB_HORZ, iPos, bRedraw);

 

 

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

 

 

Все полосы прокрутки посылают сообщения родительскому окну при щелчке мыши или перетаскивании маркера полосы прокрутки. При этом в родительское окно приходит сообщение WM _ VSCROLL или WS _ HSCROLL. Для полос прокрутки окна параметр 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 на вертикальной полосе прокрутки был щелчок мыши;

 

 

Поместить либо прочитать текст из окна редактирования можно при помощи функций 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 своему родительскому окну.

 

 

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


– 39 –

 

 

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

 

 

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);

 

 

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

 

 

SendMessage(hwndList, LB_SETSEL, wParam, iIndex);

 

 

Данное сообщение изменяет состояние элемента списка с номером iIndex. Если параметр iIndex = -1, то действие распространяется на все элементы списка. Параметр wParam определяет будет ли элемент


 

 

выбран (значение не равно 0) или у данного элемента выделение будет отменено (равен 0). Проверить выделен ли конкретный элемент списка или нет в данном случае можно с помощью:

 

 

int iSelect = SendMessage(hwndList, LB_GETSEL, iIndex, 0);

 

 

где iSelect не равно 0, если пункт выбран, и равно 0 – в противном случае.

 

 

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

 

 

LBN_ERRSPASE показывает, что превышен объем памяти, выделенный для списка;

 

 

LBN_SELCHANGE изменен текущий выбор;

 

 

LBN_DBCLK был двойной щелчок мыши на окне списка;

 

 

LBN_SELCANSEL отмена выделения;

 

 

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

 

 

LBN_KILLFOCUS окно списка потеряло фокус.


– 41 –


 

 

ЛЕКЦИЯ 6. РЕСУРСЫ

 



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 333; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.226.96.61 (0.051 с.)