О классе EDIT Текстовой буфер Изменение отображения Выделенный текст Операции над строками компонента Сообщения получаемые приложением от компонента класса EDIT Сообщения посылаемые приложением компоненту класса EDIT, для извлечения информацииО классе EDIT
Представляет собой окошко для ввода пользователем какой-нибудь строки. Встроена возможность использования буфера обмена (вставка, удаление, компирование и т. д.) Родительское окно компонента с таким классом может получать сообщение WM_COMMAND, параметры которого несут в себе другие "под-сообщения" (о них попозже). Естественно, что сообщение посылается функциями SendMessage, для посылки сообщений "нормальному" окну, и SendDlgItemMessage, для посылки диалоговому окну от окна-родителя. Компонент класса EDIT может быть как однострочным, так и многострочным, всё зависит от стилей, которые вы задаете в функциях CreateWindow или CreateWindowEx. Все стили этого класса и их описание можно найти тут Чтобы сделать возможность работы с многострочным текстом нужно использовать стиль ES_MULTILINE, где вы можете контролировать выравнивание текста стилями ES_LEFT, ES_CENTER, и ES_RIGHT. Напоминаю, что более подробную информацию вы найдете тутТекстовой буфер
Когда ОС создает элемент EDIT, она автоматом создает текстовый буфер подключенный к этому элементу.Размер буфера устанавливается в 32 KB? Эта же цифра является максимально допустимым размером для однострочного элемента класса EDIT. Для многострочного-64KB Размер буфера может быть изменен (непревышая максимально допустимые значения), для этого следует послать компоненту класса EDIT сообщение EM_SETLIMITTEXT-установить размер буфера и EM_GETLIMITTEXT- чтобы получить текущий размер. Но ОС может сама вам сообщить о переполнение буфера, она посылает вашему приложению сообщение WM_COMMAND, где старший байт wParam содержит сообщение EN_ERRSPACE, а младший байт содержит индентификатор (Внимание не указатель!!!). Указатель на компонент класса EDIT содержится в lParam. Так как буфер распологается по некоторому адресу, то, естественно, этот адрес можно узнать. Для этого пошлем компоненту класса EDIT сообщение EM_GETHANDLE (только NT!!!). Для того, чтобы установить буфер используйте EM_SETHANDLE(только NT!!!), только перед этим создайте указаель на область памяти с помощью функции LocalAlloc(). Когда вы посылайте компоненту класса EDIT сообщение EM_SETHANDLE, все линии в нем стираются. Windows позволяет сделать компонент класса EDIT недоступнум для изменения текста в нем. Для этого она ставит флаг только чтение. Чтобы сделать это программно, нужно послать компоненту сообщение EM_SETREADONLY.
Изменение отображения
Windows позволяет изменить превычный режим отображения этого компонента, это делается посылкой ему трех сообщений:EM_SETRECT- устанавливает новое изображение (здесь используется структура RECT, о создании которой программист должен заранее позаботиться), EM_GETRECT-возвращает текущий режим, EM_SETRECTNP-устанавливает без перерисовки.
Выделенный текст Программист может узнать какой текст выделен в данный момент в компоненте. Опять же, для этого нужно всего лишь послать ему соответствующеи сообщения: EM_GETSEL-возвращает начальную и конечную позиции выделенного, EM_GETSEL -устанавливает начальную и конечную позиции выделенного, EM_REPLACESEL-заменяет выделенный тест. Так же программист может программным путем вырезать, копировать или вставить текст, используя следующие сообщения:WM_COPY(копировать), WM_CUT (вырезать), WM_PASTE (вставить) и WM_CLEAR (очистка). так же к этому компоненту привязаны флаги, отвечающие за изменения текста в нем. Чтобы узнать состояния флагов, нужно послать компоненту сообщение EM_GETMODIFY, чтоб изменить - EM_SETMODIFY
Операции над строками компонента Естественно, что в большенстве случаев компонент класса EDIT создается с целью предоставления пользователью возможности ввода и редактирования текста. Но по совершению какого-либо действия этот тест надо будет получить. Здесь как раз я и хотел бы рассмотреть сообщения, посылая которые программист может получать информацию о тексте.
Длина строки
WM_GETTEXTLENGTH - сообщение, посылаемое компоненту, когда нужно получить длину всего текста (не определенной строки!!!!). Если компонент класса EDITсоздавался многострочным, то это сообщение вернет количество символов во всем многострочном тексте (включая символы перевода каретки (это последовательность байт #13#10 по ASCII)) EM_LINELENGTH-возвращает количество символов в определенной!!! строке без учета символов перевода каретки.
Получение строки
Для этого так же существует три способа:
EM_GETFIRSTVISIBLELINE -Выводит индекс первой видимой строки. EM_GETLINE-выводит строку с индексом (первая строка имеет индекс 0). WM_GETTEXT-возвращает многострочный текст!!!
Остальные функции
Для того, чтобы использовать EM_GETLINE в цикле, нужно узнать количество строк, что делается с помощью сообщения EM_GETLINECOUNT. Для получения индекса определенной строки используйте сообщение EM_LINEINDEX. Чтобы найти строку с определенным символом посылайте компоненту EM_LINEFROMCHAR. Другие, менее значимые сообщения вы можете посмотреть тут.