Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

8.5.2 Коды уведомления управляющих окон редактирования

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

Ниже представлены коды уведомления управляющих окон редактирования:

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

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

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

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

EN_ERRSPACE Произошло переполнение буфера редактирования

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

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

EN_VSCROLL На вертикальной полосе прокрутки был щелчок мышью

В программе POPPAD1 обрабатываются только коды уведомления EN_ERRSPACE и EN_MAXTEXT. При получении этих уведомлений на экран выводится окно сообщений.

Управляющие окна редактирования хранят текст в области памяти программы их родительского окна. Как уже отмечалось ранее, содержимое управляющего окна редактирования ограничено примерно 32 килобайтами.

8.5.3 Использование управляющих окон редактирования

Если вы используете несколько однострочных управляющих окон редактирования на поверхности вашего главного окна, то для передачи фокуса ввода от окна к окну вам понадобится вводить новую оконную процедуру. Вы можете это сделать так же, как это делается в программе COLORS1, перехватывая нажатия клавиш <Tab> и <Shift>+<Tab>. (Другой пример введения новой оконной процедуры показан далее в этой главе в программе HEAD.) То, как использовать клавишу <Enter> — дело ваше. Вы можете управлять ею так же, как клавишей <Tab> или использовать ее как сигнал для программы, что все поля редактирования готовы.

Если вы хотите поместить в редактируемое поле текст, вы можете воспользоваться функцией SetWindowText. Для получения текста из окна редактирования используются функции GetWindowTextLength и GetWindowText. Мы рассмотрим примеры таких возможностей в более поздних версиях программы POPPAD.

8.5.4 Сообщения управляющему окну редактирования

Мы не станем обсуждать все сообщения, которые мы можем послать управляющему окну редактирования с помощью функции SendMessage, поскольку их достаточно много, а некоторые будут использоваться в следующих версиях программы POPPAD. Здесь дан общий обзор.

Эти сообщения позволяют вам удалять, копировать или очищать текущую выделенную часть текста. Пользователь выделяет текст для обработки, используя мышь или клавишу <Shift> с нужной клавишей управления курсором, выбранный текст подсвечивается в окне редактирования:

SendMessage(hwndEdit, WM_CUT, 0, 0);

SendMessage(hwndEdit, WM_COPY, 0, 0);

SendMessage(hwndEdit, WM_CLEAR, 0, 0);

Сообщение WM_CUT удаляет выделенный текст из окна редактирования и посылает его в папку обмена. Сообщение WM_COPY копирует выделенный текст в папку обмена, оставляя его неизменным в окне редактирования. Сообщение WM_CLEAR удаляет выделенный текст из окна редактирования без копирования его в папку обмена.

Вы также можете вставить текст из папки обмена в месте, соответствующем позиции курсора в окне редактирования:

SendMessage(hwndEdit, WM_PASTE, 0, 0);

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

SendMessage(hwndEdit, EM_GETSEL,(WPARAM) &iStart,(LPARAM) &iEnd);

Конечным положением фактически является положение последнего выделенного символа плюс 1.

Вы можете выделить текст:

SendMessage(hwndEdit, EM_SETSEL, iStart, iEnd);

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

SendMessage(hwndEdit, EM_REPLACESEL, 0,(LPARAM) szString);

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

iCount = SendMessage(hwndEdit, EM_GETLINECOUNT, 0, 0);

Для любой отдельной строки вы можете получить смещение текста от начала буфера редактирования:

iOffset = SendMessage(hwndEdit, EM_LINEINDEX, iLine, 0);

Строки нумеруются, начиная с 0. При значении iLine равном —1 функция возвращает смещение строки, содержащей курсор. Длину строки можно получить из:

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

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]