- •Тема: Работа с элементами управления в Windows-программах
- •Кнопки различных стилей (класс button)
- •Радио-переключатели
- •Статические поля (класс static)
- •Текстовые редакторы (класс edit)
- •Cписки разных стилей (класс listbox)
- •Выпадающие списки (класс combobox)
- •Полосы прокрутки (класс scrollbar)
- •Тема: Работа с таймерами в Windows
- •Создание элементов управления визуально
- •Задания
- •1. Создать оконное приложение, которое спрашивает имя и выводит текст: «Введенное_имя? Не, не знаю такого»
Текстовые редакторы (класс edit)
В Windows зарегистрирован класс окна с именем “edit”, на базе которого можно создать однострочный или многострочный текстовый редактор.
Для того чтобы после создания поместить в редактируемое поле текст, можно воспользоваться функцией SetWindowText. Для получения текста из окна редактирования используются функции GetWindowTextLength и GetWindowText.
Управляющие окна редактирования хранят текст в области памяти программы (в адресном пространстве программы). Содержимое управляющих полей редактирования ограничено примерно 32 килобайтами.
Рассмотрим стили окон редактирования
Текст в управляющих окнах редактирования может быть выравнен либо по правому краю, либо по правому, либо по центру. Формат можно задать с помощью стилей окна ES_LEFT, ES_RIGHT и ES_CENTER.
По умолчанию в управляющем окне редактирования имеется одна строка. Для создания такого окна с автоматической горизонтальной прокруткой следует добавить стиль ES_AUTOHSCROLL.
Приложение может создать многострочное управляющее окно редактирования, используя стиль окна ES_MULTILINE. Для многострочного окна редактирования, если не задан стиль ES_AUTOHSCROLL, то текст автоматически переносится на новую строку при достижении правого края окна.
При задании стиля ES_AUTOHSCROLL в многострочном редакторе для перехода на новую строку нужно нажимать клавише <Enter> (т.е. появляется возможность горизонтальной прокрутки). Используя стиль окна ES_AUTOVSCROLL, в многострочное окно редактирования можно включить возможность вертикальной прокрутки.
Если стили ES_AUTOHSCROLL и ES_AUTOVSCROLL включены в многострочные управляющие окна, то можно добавить и сами полосы прокрутки.
Добавление полос прокрутки делается путем использования тех же идентификаторов стиля окна, что и для недочерних окон: WS_HSCROLL и WS_VSCROLL.
Чаще всего для многострочных редакторов используется следующая комбинация стилей:
WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_BORDER|
ES_MULTILINE|ES_ AUTOHSCROLL |ES_AUTOVSCROLL |WS_HSCROLL| WS_VSCROLL
Рассмотрим, как окна редактирования уведомляют родительское окно о тех изменениях, которые с ними происходят
Поля редактирования посылают оконной процедуре родительского окна сообщения WM_COMMAND. Значения параметров сообщения wParam и lParam такие же, как и для кнопок. Ниже представлены коды уведомления управляющих окон редактирования:
EN_SETFOCUS – окно получило фокус ввода.
EN_KILLFOCUS – окно потеряло фокус ввода.
EN_CHANGE – содержимое окна будет меняться.
EN_UPDATE – содержимое окна изменилось.
EN_ERRSPACE – произошло переполнение буфера редактирования.
EN_MAXTEXT – произошло переполнение буфера редактирования при вставке.
EN_HSCROLL – на горизонтальной полосе прокрутки был щелчок мышью.
EN_VSCROLL – на вертикальной полосе прокрутки был щелчок мышью.
Для обработки сообщения от поля редактирования оконная функция родительского окна может содержать код следующего вида:
case WM_COMMAND:
{ UINT idCtl=LOWORD(wParam); // идентификатор дочер. окна
UINT code=HIWORD(wParam); // код уведомления
HWND hChild=(HWND)lParam; // дескриптор дочер. окна
if(idCtrl==ID_edit&&code==EN_CHANGE)
{
// текст поля сейчас будет меняться
. . .
}
}; return 0;
Родительские окна также могут посылать окнам редактирования сообщения
Специфических сообщений, которые родительское окно может послать окну редактирования при помощи функции SendMessage, достаточно много. Рассмотрим наиболее часто употребляемые:
WM_CUT - для удаления с пересылкой в буфер обмена;
WM_COPY - копирования в буфер обмена;
WM_CLEAR - очищения выделенной части текста из окна редактирования;
WM_PASTE - для вставки текста из буфера обмена в окно редактирования;
EM_GETSEL - для получения начальной и конечной позиции текущего выделения текста;
EM_SETSEL - для выделения некоторого участка текста;
EM_REPLACESEL - для замены текущего выделенного текста другим текстом;
EM_GETLINECOUNT - для получения число строк многострочного редактора;
EM_LINEINDEX - для получения смещения от начала буфера до некоторой строки;
EM_LINELENGTH - для получения длины некоторой строки;
EM_GETLINE - для копирования некоторой строки в буфер программы.
