Класс редактирования
Когда используется класс " 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. РЕСУРСЫ
Дата добавления: 2016-11-22; просмотров: 606;