CB_ADDSTRING
Добавление строки в список.
Параметры:
wParam = 0;
lParam = (LPARAM)(LPCSTR)lpszStr;
lpszStr - указатель на добавляемую строку.
Возвращаемое значение:
Номер строки в списке (первая строка имеет номер 0), или код ошибки.
CB_DELETESTRING
Удаление строки из списка.
Параметры:
wParam = (WPARAM)nIndex;
lParam = 0L;
nIndex - номер удаляемой строки. Первая строка имеет номер 0.
Возвращаемое значение:
Количество строк, оставшихся в списке, или код ошибки.
CB_DIR
Заполнение списка именами файлов и каталогов, расположенных в текущем каталоге, а также именами дисков.
Параметры:
wParam = (WPARAM)(UINT)uAttr;
lParam = (LPARAM)(LPCSTR)lpszFileSpec;
uAttr - атрибуты файлов;
lpszFileSpec - указатель на строку, содержащую имя файла или шаблон имени файла.
Возвращаемое значение:
Номер последнего имени файла, добавленного в список, или код ошибки.
CB_FINDSTRING
Поиск строки в списке, имеющей заданный префикс.
Параметры:
wParam = (WPARAM)nIndexStart;
lParam = (LPARAM)(LPCSTR)lpszStr;
nIndexStart - номер строки, с которой начинается поиск;
lpszStr- адрес префикса строки, которую нужно найти в списке.
Возвращаемое значение:
Номер найденной строки, или код ошибки (если строки в списке нет).
CB_GETCOUNT
Определение количества строк в списке.
Параметры:
wParam = 0;
lParam = 0L;
Возвращаемое значение:
Количество строк в списке или код ошибки.
CB_GETCURSEL
Определение номера выделенной строки.
Параметры:
wParam = 0;
lParam = 0L;
Возвращаемое значение:
Номер выделенной строки или код ошибки.
CB_GETDROPPEDCONTROLRECT
Определение экранных координат видимой части списка. Используется в Windows версии 3.1 и более поздних версий.
Параметры:
wParam = 0;
lParam = (LPARAM)(RECT FAR *) lprc
;lprc - указатель на структуру RECT, в которую будут записаны искомые координаты.
Возвращаемое значение:
Всегда возвращается CB_OKAY.
CB_GETDROPPEDSTATE
С помощью этого сообщения можно определить, находится список в видимом или невидимом состоянии.
Параметры:
wParam = 0;
lParam = 0L;
Возвращаемое значение: TRUE, если список виден, FALSE - если нет.
CB_GETEDITSEL
Определение положения первого и последнего символа в выделенном фрагменте текста.
Параметры:
wParam = 0;
lParam = 0L;
Возвращаемое значение:
Двойное слово. Младшее слово содержит положение первого символа в выделенном фрагменте, старшее - положение символа, следующего за выделенным фрагментом текста
CB_GETEXTENDUI
С помощью этого сообщения можно определить, использует ли список расширенный интерфейс пользователя. Это сообщение используется в Windows версии 3.1 и более поздних версий.При использовании расширенного интерфейса щелчок в окне редактора текста для стиля CBS_DROPDOWMLIST приводит к отображению списка. Список также отображается, когда пользователь нажимает клавишу перемещения курсора вниз <Down>. Если список находится в невидимом состоянии, свертка окна редактирования не выполняется.
Параметры:
wParam = 0;
lParam = 0L;
Возвращаемое значение:
TRUE, если расширенный интерфейс пользователя используется, FALSE - если нет.
CB_GETLBTEXT
Копирование текста, соответствующего заданной строке, в буфер.
Параметры:
wParam = (WPARAM)nIndex;
lParam = (LPARAM)(int FAR *)lpszBuffer;
nIndex - номер строки.
lpszBuffer - адрес буфера.
Возвращаемое значение:
Длина строки в байтах (с учетом двоичного нуля, закрывающего строку), или код ошибки.
CB_GETLBTEXTLEN
Определение длины строки, содержащейся в списке.
Параметры:
wParam = (WPARAM)nIndex;
lParam = 0L;
nIndex - номер строки.
Возвращаемое значение:
Длина строки в байтах (с учетом двоичного нуля, закрывающего строку), или код ошибки.
CB_INSERTSTRING
Вставка элемента в заданную позицию списка. На расположение строки не влияет стиль LBS_SORT.
Параметры:
wParam = (WPARAM)nIndex;
lParam = (LPARAM)(int FAR *)lpszBuffer;
nIndex - номер позиции, в которую будет вставлена строка.lpszBuffer - адрес буфера.
Возвращаемое значение:
Номер позиции, в которую вставлена строка, или код ошибки.
CB_LIMITTEXT
Определение максимального количества символов, которое можно ввести в окно редактирования.
Параметры:
wParam = (WPARAM)cCmax;
lParam = 0L;
cCMax - размер текста.
Возвращаемое значение: не используется
CB_RESETCONTENT
Удаление всех строк из списка.
Параметры:
wParam = 0;
lParam = 0L;
Возвращаемое значение: не используется.
CB_SELECTSTRING
Поиск строки в списке, которая начинается с символов, соответствующих образцу. Найденная строка становится выбранной.
Параметры:
wParam = (WPARAM)nIndexStart;
lParam = (LPARAM)(int FAR *)lpszBuffer;
nIndexStart - номер строки, с которой начинается поиск.lpszBuffer - адрес буфера, содержащего образец.
Возвращаемое значение:
Номер найденной строки или код ошибки.
CB_SETCURSEL
Выбор указанной строки. Ранее выделенная строка становится невыделенной. Если данная строка находится вне окна отображения, список сворачивается таким образом, чтобы строка стала видимой.
Параметры:
wParam = (WPARAM)nIndex;
lParam = 0L;
nIndex - номер строки. Если указать -1, выделение всех строк будет отменено. При этом функция SendMessage вернет значение CB_ERR, что в данном случае не говорит об ошибке.
Возвращаемое значение:
Код ошибки (если значение nIndex не равно -1).
CB_SETEDITSEL
Выделение заданных символов в окне редактирования.
Параметры:
wParam = (WPARAM)(UINT)fScroll;
lParam = MAKELPARAM(ichStart, ichEnd);
fScroll - если этот параметр равен 1, текстовый курсор сворачивается, если 0 - нет.ichStart - начальная позиция.
ichEnd - конечная позиция.
Если начальная позиция равна 0, а конечная -1, выбирается весь текст. Если начальная позиция равна -1, выделение фрагмента (если оно было) исчезает.
Возвращаемое значение:
TRUE, если сообщение посылается операция выполнена без ошибок или код ошибки.
CB_SETEXTENDEDUI
Установка режима использования расширенного интерфейса пользователя. Это сообщение используется в Windows версии 3.1 и более поздних версий.
Параметры:
wParam = (WPARAM)(BOOL)fExtended;
lParam = 0L;
fExtended - TRUE для установки режима, FALSE - для сброса.
Возвращаемое значение:
CB_OKAY, если сообщение посылается операция выполнена без ошибок или код ошибки CB_ERR.
CB_SETITEMDATA
Установка значения двойного слова, связанного с указанным элементом списка.
Параметры:
wParam = (WPARAM)nIndex;
lParam = (LPARAM)dwData;
nIndex - номер строки.
dwData - значение двойного слова.
Возвращаемое значение:
Код ошибки.
CB_SETITEMHEIGHT
Установка высоты элемента в списке, который рисует родительское окно и имеет переменную высоту элементов. Это сообщение используется в Windows версии 3.1 и более поздних версий.
Параметры:
wParam = (WPARAM)nIndex;
lParam = MAKELPARAM(cyItem, 0);
nIndex - номер строки.
Если список не имеет стиль LBS_OWNERDRAWVARIABLE, значение этого параметра должно быть равно 0.cyItem - высота элемента в пикселах.
Возвращаемое значение:
Код ошибки.
CB_SHOWDROPDOWN
Переключение списка в отображаемое или неотображаемое состояние.
Параметры:
wParam = (WPARAM)(BOOL)fExtended;
lParam = 0L;
fExtended - TRUE для отображения списка, FALSE - для переключения списка в неотображаемое состояние.
Возвращаемое значение:
всегда не равно 0
Диалоговые панели
3.1.
3.2.
3.3.
3.4.
В предыдущей главе мы научили вас создавать в главном окне приложения различные органы управления, такие как кнопки, списки, полосы просмотра и т. п. Однако обычно для объединения органов управления используются временные (pop-up) окна, созданные на базе предопределенного внутри Windows класса окон - класса диалоговых панелей (dialоg window class). На поверхности такого окна располагаются дочерние окна - органы управления. Функция окна для класса диалоговых панелей, определенная в Windows, выполняет практически всю работу, необходимую для организации взаимодействия органов управления с приложением.
Вспомним, с какими трудностями мы сталкивались, когда создавали органы управления в главном окне приложения. Для создания каждого органа управления мы вызывали функцию CreateWindow, которой требовалось указывать расположение и размеры органов управления. Поэтому при необходимости внесения изменений во внешний вид приложения приходилось изменять исходные тексты. В функцию родительского окна приходили все сообщения и извещения от всех органов управления. Большие проблемы возникали при необходимости передачи фокуса ввода от одного органа управления к другому - функция родительского окна должна была управлять передачей фокуса ввода и организовывать взаимодействие органов управления самостоятельно.
Диалоговые панели значительно упрощают использование органов управления, так как функция окна, соответствующая классу диалоговых панелей и расположенная внутри Windows, обеспечивает как взаимодействие органов управления между собой, так и их взаимодействие с приложением. В частности, эта функция обеспечивает передачу фокуса ввода от одного органа управления к другому при помощи клавиши <Tab> и клавиш перемещения курсора <Up> и <Down>, выполняет обработку сообщений от клавиш <Enter> и <Esc>.
Что же касается расположения органов управления на поверхности диалоговой панели, то для этого можно использовать три способа.
Первый способ предполагает включение в файл ресурсов приложения текстового описания шаблона диалоговой панели.
Это описание можно создать при помощи любого текстового редактора:
DIALOG_BOX DIALOG 25, 34, 152, 67 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Приложение DIALOG" BEGIN CTEXT "Microsoft Windows Application\n" "Приложение DIALOG\n (C) Frolov A.V., 1994", -1, 28, 9, 117, 26, WS_CHILD | WS_VISIBLE | WS_GROUP ICON "APPICON", -1, 6, 14, 16, 16, WS_CHILD | WS_VISIBLE DEFPUSHBUTTON "OK", IDOK, 56, 43, 36, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP END
Не останавливаясь пока на деталях, отметим, что в приведенном выше описании определен шаблон диалоговой панели с идентификатором DIALOG_BOX (см. первую строку). Расположение и размеры диалоговой панели определяются цифрами, стоящими после оператора DIALOG.
Вторая строка описания (оператор STYLE) предназначена для определения стиля временного окна, на поверхности которого будут расположены органы управления.
Далее следует описание заголовка диалоговой панели (оператор CAPTION).
Между строками BEGIN и END находится описание органов управления и пиктограмм. В нашем случае это статический орган управления (оператор CTEXT), пиктограмма (ICON) и кнопка (DEFPUSHBUTTON). Для каждого органа управления приводится вся необходимая информация - заголовок, стиль, расположение и размеры.
Так как шаблон диалоговой панели описан в файле ресурсов, вы можете влиять на внешний вид и поведение диалоговой панели, изменяя файл ресурсов, но не исходный текст приложения. При использовании диалоговых панелей задача создания и размещения (а также взаимодействия) органов управления сильно упрощается. Отделяя описание органов управления от исходного текста приложения, вы не только упрощаете процесс программирования, но и получаете возможность создать локализованную версию приложения для любого национального языка без внесения изменений в исходные тексты приложения.
Второй способ размещения органов управления на поверхности диалоговой панели предполагает использование специального редактора диалогов, такого как Borland Resource Workshop или Microsoft Dialog Editor.
Эти редакторы позволяют нарисовать диалоговую панель и сохранить ее текстовое описание в файле ресурсов приложения.
На рис. 3.1 показан процесс создания диалоговой панели, текстовое описание шаблона которой мы только что привели. С помощью мыши вы можете изменять размер и расположение диалоговой панели, размещать на ее поверхности органы управления, выбирая их из меню или из окна "Tools". Размеры органов управления можно изменять мышью, выделяя органы управления и перемещая их границы. При использовании специальных редакторов диалога у вас нет необходимости задавать для расположения и размеров органов управления численные значения.
Рис. 3.1. Создание диалоговой панели при помощи Borland Resource Workshop
Такой подход в создании приложений носит зачатки визуального программирования, когда внешний вид и поведение приложения определяется с помощью специальных графических средств проектирования без традиционного программирования на каком-либо алгоритмическом языке. Визуальное программирование реализовано полностью в таких программных продуктах, как Borland Object Vision или Microsoft FoxPro for Windows 2.5. Специальные средства проектирования приложений Windows позволяют вам не только нарисовать диалоговые панели, но и "привязать", например, поля, предназначенные для ввода и отображения текста, к полям файлов баз данных. Вы можете создавать полноценные приложения Windows, которые работают с базами данных, не написав ни строчки исходного текста. Однако в виде "компенсации" за значительное упрощение процесса разработки вы можете получить снижение скорости работы приложения. Это связано с тем что универсальные средства работают, как правило, медленнее специализированных. Однако вернемся к диалоговым панелям, так как визуальное программирование заслуживает отдельного рассмотрения.
Третий способ предполагает создание шаблона диалоговой панели в памяти во время работы приложения. Этот способ используется редко, обычно только в тех случаях, когда внешний вид диалоговой панели нельзя определить на этапе создания приложения.
В операционной системе Windows версии 3.1 появились встроенные диалоговые панели, реализованные в виде библиотеки динамической загрузки commdlg.dll. Приложения могут вызывать стандартные диалоговые панели для работы с файлами (мы это делали в наших приложениях, см. например приложение OEM2ANSI), для выбора цветов и шрифтов, для работы с принтерами и текстовыми строками (поиск и замена строк в текстовых редакторах и текстовых процессорах).
Хорошо знакомая вам функция MessageBox использует встроенные диалоговые панели, в которых могут находиться пиктограмма, статический орган управления (для отображения текста), а также одна или несколько кнопок.
Другие типы ресурсов
Помимо таблицы строк, пиктограмм, курсоров, изображений bitmap и произвольных данных приложения Windows могут иметь и другие, более сложные типы ресурсов. Это меню, диалоговые панели, шрифты, таблицы акселераторов и т. д. Эти типы ресурсов мы рассмотрим позже, так как они заслуживают отдельного разговора.
EM_CANUNDO
С помощью этого сообщения можно проверить, поддерживает ли редактор текста операцию отмены последнего действия редактирования. Эта операция выполняется по сообщению WM_UNDO, когда оно посылается в редактор текста.
Параметры:
wParam = 0;
lParam = 0L;
Возвращаемое значение:
TRUE, если операция поддерживается, FALSE - если нет
EM_EMPTYUNDOBUFFER
Сброс содержимого буфера, используемого для отмены последнего действия редактирования.Параметры и возвращаемое значение не используются.
EM_FMTLINES
Управление режимом добавления или удаления символов конца строки в процессе переноса слов на новую строку.
Параметры:
wParam = (WPARAM)(BOOL)fAddEOL;
lParam = 0L;
Значение флага fAddEOL: TRUE - вставка, FALSE - удаление.
Возвращаемое значение:TRUE - вставка, FALSE - удаление
EM_GETFIRSTVISIBLELINE
Получение номера самой верхней видимой строки в окне редактирования. Используется в Windows версии 3.1 и более поздних версиях.
Параметры: не используются.
Возвращаемое значение:
Номер строки. Первой строке соответствует значение 0
EM_GETHANDLE
Получение идентификатора локальной памяти, используемой редактором для хранения текста.Параметры: не используются.
Возвращаемое значение:
Идентификатор блока памяти
EM_GETLINE
Копирование строки из редактора текста в буфер.
Параметры:
wParam = (WPARAM)nLine;
lParam = (LPARAM)(LPSTR)lpCh;
nLine - номер строки, lpCh - адрес буфера для строки.
Возвращаемое значение:
Номер скопированных в буфер байт данных или 0, если указанный номер строки превосходит количество строк в тексте
EM_GETLINECOUNT
Определение количества строк в тексте.
Параметры:
wParam = 0;
lParam = 0L;
Возвращаемое значение:
Количество строк текста или 1, если окно редактирования не содержит ни одной строки текста
EM_GETMODIFY
Определение значения флага обновления.
Параметры:
wParam = 0;
lParam = 0L;
Возвращаемое значение:
TRUE, если текст был изменен или FALSE - если нет
EM_GETPASSWORDCHAR
Получение символа, используемого для вывода при вводе пароля. Используется в Windows версии 3.1 и более поздних версиях.
Параметры:
wParam = 0;
lParam = 0L;
Возвращаемое значение:
Код символа
EM_GETRECT
Определение координат прямоугольной области, используемой для редактирования текста. Эта область по своим размерам не обязательно совпадает с областью, занятой самим органом управления.
Параметры:
wParam = 0;
lParam = (LPARAM)(RECT FAR *)lprc;
lprc - указатель на структуру RECT, в которую будут записаны искомые координаты.
Возвращаемое значение: не используется
EM_GETSEL
Определение положения первого и последнего символа в выделенном фрагменте текста.
Параметры:
wParam = 0;
lParam = 0L;
Возвращаемое значение:
Двойное слово. Младшее слово содержит положение первого символа в выделенном фрагменте, старшее - положение символа, следующего за выделенным фрагментом текста
EM_GETWORDBREAKPROC
Получение адреса текущей функции, которая используется для переноса слов с одной строки на другую. Используется в Windows версии 3.1 и более поздних версиях.
Параметры:
wParam = 0;
lParam = 0L;
Возвращаемое значение:
Адрес функции или NULL, если такая функция не существует
EM_LIMITTEXT
Определение максимального количества символов, которое можно ввести в окно редактирования.
Параметры:
wParam = (WPARAM)cCmax;lParam = 0L;
cCMax - размер текста.
Возвращаемое значение: не используется
EM_LINEFROMCHAR
Определение номера строки, содержащей символ в заданной позиции.
Параметры:
wParam = (WPARAM) iChar;
lParam = 0L;
iChar - номер позиции. Можно задать как -1, в этом случае используется текущая строка (строка, в которой установлен текстовый курсор), или строка, в которой начинается выделенный фрагмент текста (если в тексте есть выделенный фрагмент).
Возвращаемое значение:
Номер строки. Первой строке соответствует значение 0
EM_LINEINDEX
Определение смещения в байтах от начала текста заданной строки.
Параметры:
wParam = (WPARAM) nLine;
lParam = 0L;
nLine - номер строки. Можно задать как -1, в этом случае используется текущая строка.
Возвращаемое значение:
Смещение в байтах или -1, если указана строка с номером, превосходящим количество строк в окне редактирования
EM_LINELENGTH
Определение размера строки в байтах.
Параметры:
wParam = (WPARAM) iChar;
lParam = 0L;
iChar - номер позиции символа, который находится в строке. Можно задать как -1, в этом случае используется текущая строка, для которой возвращается количество невыбранных символов
Возвращаемое значение:
Размер строки в байтах
EM_LINESCROLL
Свертка заданного количества строк.
Параметры:
wParam = 0;
lParam = MAKELPARAM(dv, dh);
dv - количество сворачиваемых строк по вертикали,dh - количество символов для свертки по горизонтали, не используется для текста, выравненного по правой границе или центрированного.
Возвращаемое значение:
TRUE, если сообщение был послано многострочному редактору, или FALSE - если однострочному
EM_REPLACESEL
Заменить выделенный фрагмент текста. Если в тексте нет выделенных фрагментов, строка будет вставлена в текущей позиции.
Параметры:
wParam = 0;
lParam = (LPARAM)(LPCSTR)lpszStr
;lpszStr - адрес строки, которая должна заместить собой выделенный текст
Возвращаемое значение: не используется
EM_SETHANDLE
Назначение буфера для хранения текста.
Параметры:
wParam = (WPARAM)(HLOCAL)hLoc;
lParam = 0L;
hLoc - идентификатор локального блока памяти, полученный с помощью функции LocalAlloc.
Возвращаемое значение: не используется
EM_SETMODIFY
Установка флага обновления.
Параметры:
wParam = (WPARAM)(UINT)fMod;
lParam = 0L;
fMod - новое значение для флага обновления. TRUE, если текст надо отметить, как обновленный, FALSE - если как необновленный.
Возвращаемое значение: не используется
EM_SETPASSWORDCHAR
Установка символа, который используется для вывода текста (в редакторе, имеющим стиль ES_PASSWORD).
Параметры:
wParam = (WPARAM)(UINT)chChar;
lParam = 0L;
chChar - код символа.
Возвращаемое значение:
TRUE, если сообщение посылается редактору, созданному как орган управления
EM_SETREADONLY
Установка или сброс состояния редактора, в котором пользователю позволяется только просматривать текст, но не редактировать (режим "только чтение").
Параметры:
wParam = (WPARAM)(UINT)fReadOnly;
lParam = 0L;
fReadOnly - TRUE для установки режима "только чтение", FALSE - для сброса.
Возвращаемое значение:
TRUE, если установка выполнена без ошибок или FALSE при ошибке
EM_SETRECT
Изменение размеров или расположения области, используемой для редактирования текста. Эта область находится внутри окна органа управления и сразу после создания совпадает с этим окном по размерам и расположению.
Параметры:
wParam = 0;
lParam = (LPARAM)(RECT FAR *)lprc;
lprc - указатель на структуру RECT, в которую будут записаны новые координаты области.
Возвращаемое значение: не используется
EM_SETRECTNP
Аналогично предыдущему, за исключением того что окно редактирования не перерисовывается
EM_SETSEL
Выделение заданных символов в окне редактирования.
Параметры:
wParam = (WPARAM)(UINT)fScroll;
lParam = MAKELPARAM(ichStart, ichEnd);
fScroll - если этот параметр равен 1, текстовый курсор сворачивается, если 0 - нет.
ichStart - начальная позиция.
ichEnd - конечная позиция. Если начальная позиция равна 0, а конечная -1, выбирается весь текст. Если начальная позиция равна -1, выделение фрагмента (если оно было) исчезает.
Возвращаемое значение:
TRUE, если сообщение посылается редактору, созданному как орган управления
EM_SETTABSTOPS
Установка позиций табуляции.
Параметры:
wParam = (WPARAM)cTabs;
lParam = (LPARAM)(const int FAR *) lpTabs;
cTabs - расстояние для табуляции. Если этот параметр указан как 0, используется значение по умолчанию - 32.
lpTabs - массив беззнаковых целых чисел, определяющих расположение позиций табуляции в единицах, используемых для диалоговых панелей. Эти единицы будут описаны в следующей главе.
Возвращаемое значение:
TRUE, если позиции табуляции были установлены ил FALSE при ошибке
EM_SETWORDBREAKPROC
Установка новой функции для переноса слов с одной строки на другую. Используется в Windows версии 3.1 и более поздних версиях.
Параметры:
wParam = 0;
lParam = (LPARAM)(EDITWORDBREAKPROC) ewpbrc;
ewpbrc - адрес переходника для новой функции, которая будет использована для переноса слов. Этот адрес необходимо получить при помощи функции MakeProcInstance, указав последней адрес функции переноса слов.
Возвращаемое значение: не используется
EM_UNDO
Отмена последней операции редактирования текста.
Параметры:
wParam = 0;
lParam = 0L;
Возвращаемое значение: не используется
Помимо описанных выше, текстовому редактору можно посылать некоторые сообщения, символические имена которых начинаются с префикса WM_. Это сообщения WM_COPY, WM_PASTE, WM_CUT, WM_CLEAR. Приведем краткое описание этих сообщений.
Функции для работы с текстовыми строками
Для работы с текстовыми строками приложения Windows могут вызывать стандартные функции библиотеки компилятора, такие как strcat или strcopy. Однако лучше использовать функции для работы с текстовыми строками, определенные в программном интерфейсе Windows. Эти функции используют дальние указатели на строки и учитывают специфику национальных алфавитов. Кроме того, указанные функции находятся в ядре Windows, поэтому при их использовании не происходит увеличения размера файла загрузочного модуля приложения.
Функция lstrcmp сравнивает строки, заданные параметрами:
int WINAPI lstrcmp(LPCSTR lpszString1, LPCSTR lpszString2);
Функция возвращает отрицательное значение, если строка lpszString1 меньше чем строка lpszString2, положительное в противоположном случае, и равное нулю при равенстве сравниваемых строк. При сравнении учитываются особенности национального алфавита для указанной при помощи приложения Control Panel страны. Функция способна сравнивать строки с двухбайтовыми кодами символов. Учитываются также заглавные и прописные буквы. Размер сравниваемых строк не может превышать 64 Кбайт.
Функция lstrcmpi предназначена для сравнения двух строк, но без учета заглавных и прописных букв:
int WINAPI lstrcmpi(LPCSTR lpszString1, LPCSTR lpszString2);
В остальном она полностью аналогична функции lstrcmp.
Учтите, что известные вам функции strcmp и strcmpi не учитывают особенности национальных алфавитов и поэтому их не следует использовать в приложениях Windows.
Для копирования текстовых строк вы должны пользоваться функцией lstrcpy:
LPSTR WINAPI lstrcpy(LPSTR lpszString1, LPCSTR lpszString2);
Эта функция копирует строку lpszString2 в строку lpszString1, возвращая указатель на первую строку или NULL при ошибке. В отличие от своего аналога из библиотеки функций MS-DOS (функции strcpy) эта функция способна работать со строками, содержащими двухбайтовые коды символов. Размер копируемой строки не должен превышать 64 Кбайт.
В программном интерфейсе Windows версии 3.1 появилась еще одна функция, предназначенная для копирования заданного количества символов из одной строки в другую.
Эта функция имеет имя lstrcpyn:
LPSTR WINAPI lstrcpyn(LPSTR lpszString1, LPCSTR lpszString2, int cChars);
Она копирует cChars символов из строки lpszString2 в строку lpszString1.
Для объединения двух строк в приложениях Windows следует применять функцию lstrcat:
LPSTR WINAPI lstrcat(LPSTR lpszString1, LPCSTR lpszString2);
Функция lstrcat добавляет строку lpszString2 к строке lpszString1. Размер строки, получившейся в результате объединения, не должен превышать 64 Кбайт. Функция возвращает указатель на строку lpszString1.
Длину текстовой строки (без учета закрывающего строку двоичного нуля) можно получить при помощи функции lstrlen, аналогичной известной вам функции strlen:
int WINAPI lstrlen(LPCSTR lpszString);
Для классификации символов на строчные, прописные, буквенные или цифровые приложения должны использовать специально предназначенные для этого функции из программного интерфейса Windows.
Функция IsCharAlpha возвращает значение TRUE, если символ, заданный параметром chTest, является буквой:
BOOL WINAPI IsCharAlpha(char chTest);
Функция IsCharAlphaNumeric возвращает значение TRUE, если символ, заданный параметром chTest, является буквой или цифрой:
BOOL WINAPI IsCharAlphaNumeric(char chTest);
Функция IsCharUpper возвращает значение TRUE, если символ, заданный параметром chTest, является прописным (заглавным):
BOOL WINAPI IsCharUpper(char chTest);
Функция IsCharLower возвращает значение TRUE, если символ, заданный параметром chTest, является строчным:
BOOL WINAPI IsCharLower(char chTest);
В предыдущем томе "Библиотеки системного программиста" мы рассказывали вам о том, что Windows и MS-DOS используют разные наборы символов. Приложения Windows обычно работают с наборами в стандарте ANSI, программы MS-DOS - в стандарте OEM. Там же мы описали функции, предназначенные для преобразования строк из одного стандарта в другой. Для удобства изучения материала кратко перечислим эти функции еще раз.
Для перекодировки строки символов, закрытой двоичным нулем, из набора ANSI в набор OEM предназначена функция AnsiToOem:
void WINAPI AnsiToOem( const char _huge* hpszWindowsStr, char _huge* hpszOemStr);
Параметр hpszWindowsStr представляет собой указатель типа _huge на преобразуемую строку, параметр hpszOemStr - указатель на буфер для записи результата преобразования.
Похожая по назначению функция AnsiToOemBuff выполняет преобразование массива заданного размера:
void WINAPI AnsiToOemBuff(LPCSTR lpszWindowsStr, LPSTR lpszOemStr, UINT cbWindowsStr);
Первый параметр этой функции (lpszWindowsStr) является дальним указателем на массив, содержащий преобразуемые данные, второй (lpszOemStr) - на буфер для записи результата. Третий параметр (cbWindowsStr) определяет размер входного массива, причем нулевой размер соответствует 64 Кбайт (65536 байт).
Обратное преобразование выполняется функциями OemToAnsi и OemToAnsiBuff:
void WINAPI OemToAnsi(const char _huge* hpszOemStr, char _huge* lpszWindowsStr); void WINAPI OemToAnsiBuff(LPCSTR lpszOemStr, LPSTR lpszWindowsStr, UINT cbOemStr);
Назначение параметров этих функций аналогично назначению параметров функций AnsiToOem и AnsiToOemBuff.
Для преобразований символов в строчные или прописные приложение Windows должно пользоваться функциями AnsiLower, AnsiLowerBuff, AnsiUpper, AnsiUpperBuff.
Функция AnsiLower преобразует закрытую двоичным нулем текстовую строку в строчные (маленькие) буквы:
LPSTR WINAPI AnsiLower(LPSTR lpszString);
Единственный параметр функции - дальний указатель на преобразуемую строку.
Функция AnsiUpper преобразует закрытую двоичным нулем текстовую строку в прописные (большие) буквы:
LPSTR WINAPI AnsiLower(LPSTR lpszString);
Параметр функции lpszString - дальний указатель на преобразуемую строку.
Функция AnsiLowerBuff позволяет преобразовать в строчные (маленькие) буквы заданное количество символов:
UINT WINAPI AnsiLowerBuff(LPSTR lpszString, UINT cbString);
Первый параметр функции (lpszString) является указателем на буфер, содержащий преобразуемые символы, второй (cbString) определяет количество преобразуемых символов (размер буфера).
Нулевой размер соответствует буферу длиной 64 Кбайт (65536 байт).
Функция возвращает количество преобразованных символов.
Функция AnsiUpperBuff позволяет преобразовать в прописные (большие) буквы заданное количество символов:
UINT WINAPI AnsiUpperBuff(LPSTR lpszString, UINT cbString);
Первый параметр функции lpszString(lpszString) является указателем на буфер, содержащий преобразуемые символы, второй (cbString) определяет количество преобразуемых символов (размер буфера). Нулевой размер соответствует буферу длиной 64 Кбайт (65536 байт).
Эта функция, как и предыдущая, возвращает количество преобразованных символов.
Функция AnsiNext возвращает новое значение для указателя, передвинутое вперед по строке на одни символ:
LPSTR WINAPI AnsiNext(LPCSTR lpchCurrentChar);
Параметр функции указывает на текущий символ. Возвращаемое значение является указателем на следующий символ в строке или на закрывающий строку двоичный ноль.
Функция AnsiPrev выполняет передвижение указателя в направлении к началу строки:
LPSTR WINAPI AnsiPrev(LPCSTR lpchStart, LPCSTR lpchCurrentChar);
Первый параметр функции указывает на начало строки (на первый символ строки). Второй параметр - указатель на текущий символ. Функция возвращает значение указателя, соответствующее предыдущему символу или первому символу в строке, если при продвижении достигнуто начало строки.