Для отображения текста или отрисовки оформительских примитивов в окне диалога функции GDI, как правило, не используются. Вместо этого в Windows определен специальный « статический » класс дочерних окон - органов управления.
Органы управления этого класса могут быть созданы указанием функции CreateWindow имени класса «static». Дочерние окна этого типа являются, наверное, самым простым типом окон Windows. Статические органы управления не обрабатывают ни клавиатуру, ни мышь и не посылают сообщение WM_COMMAND функции родительского окна.
Единственное сообщение, которое обрабатывает статические органы управления - это сообщение WM_HITTEST, возвращаемое обратно Windows с установленным параметром HTTRANSPARENT. Это заставляет Windows посылать то же самое сообщение функции нижнего окна, т.е. функции окна диалога, где оно благополучно перерабатывается в сообщение рабочей области так же, как если бы статического органа управления не было вовсе.
Используя стандартно определенные стили статических примитивов Windows, можно отображать системными цветами прямоугольники и рамки, выводить в окно диалога текст и даже пиктограммы:
Прямоугольник цвета рамки окна (COLOR_WINDOWFRAME)
Прямоугольник цвета фона окна (COLOR_BACKGROUND)
Прямоугольник цвета окна (COLOR_WINDOW)
Рамка цвета рамки окна (COLOR_WINDOWFRAME)
Рамка цвета фона окна (COLOR_BACKGROUND)
Рамка цвета окна (COLOR_WINDOW)
Центрированный текст
Текст, выравненный по левому краю
Текст, выравненный по правому краю
Пиктограмма; функции CreateWindow указывается имя загруженной пиктограммы, не имя файла пиктограммы. Установленная ширина и высота органа управления в этом случае игнорируется; пиктограмма автоматически масштабирует себя по осям
То же, что и SS_LEFT, но проще: так, используя этот стиль, нельзя обрабатывать сообщение WM_CTLCOLOR.
Статический орган управления, отрисовываемый пользователем
Стандартный класс «edit» позволяет создать дочернее окно, внутри которого вы можете редактировать какой-либо текст. Когда фокус ввода принадлежит дочернему окну класса «edit» (редактору текста), вы можете набирать в окне текста, перемещать курсор по окну, выделять текст внутри окна при помощи клавиш Shift и клавиш перемещения курсора, перемещать выделенный текст из окна «в почтовый ящик» (clipboard) и обратно.
Используя класс окна «edit», можно создавать как многострочные редакторы текста (оконные редакторы), так и простейшие однострочные органы управления - строки редактирования.
Как и другие органы управления , редактор текста -это дочернее окно , поэтому первый идентификатор, который надо указать в параметре «тип окна » функции CreateWindow, должен быть WS_CHILD.
Текст, отображаемый в окне редактора, может быть выровнен по левой или правой границе окна или же отцентрирован. Для этого существуют следующие флаги типов окон: ES_LEFT,ES_RIGHT, ES_CENTER.
По умолчанию редактор текста может редактировать только одну строку, и если вы хотите создать многострочный редактор, то надо использовать тип ES_MULTILINE. Чтобы иметь возможность горизонтального перемещения текста в окне, добавьте тип ES_AUTOHSCROLL.В многострочном редакторе можно использовать вертикальное перемещение текста.
Для этого существует тип окна ES_AUTOVSCROLL. По умолчанию редактор текста не имеет рамки, и чтобы не отобразить, используют тип окна WS_BORDER.
Перечислим основные типы органов управления - редактора:
ES_AUTOHSCROLL
Этот стиль вызывает автоматически горизонтальный скроллинг вправо на 10 позиций, если курсор находиться в конце строки. По нажатии клавиши ENTER осуществляется обратный скроллинг на позицию 0.
ES_AUTOVSCROLL
При нажатии клавиши ENTER в конце страницы текст автоматически сдвигается вверх на один экран.
ES_CENTER
Текст автоматически центрируется.
ES_LEFT
Выравнивание текста по левому краю (подбор).
ES_LOWERCASE
Все символы автоматически переводятся в нижний регистр (строчные).
ES_MULTILINE
Этот стиль определяет многострочный редактор текста( по умолчанию определяется простейшая строка ввода). Если указан флаг ES_AUTOVSCROLL , то в окне показывается максимально возможное количество символов, и при нажатии клавиши ENTER в конце страницы текст перемещается на один экран вверх. Если флаг ES_AUTOVSCROLL не указан, то осуществляется автоматический горизонтальный скроллинг на 10 позиций, если курсор находиться в конце строки. По нажатии клавиши ENTER осуществляется обратный скроллинг на позиции 0 (начало новой строки). Если флаг ES_AUTOHSCROLL не указан то осуществляется автоматический перенос на новую строку: при нажатии ENTER, однако, так же начинается новая строка . Граница переноса зависти от ширины окна: если окно изменяет свои размеры, текст как бы «переформатируется». Многострочные редакторы могут иметь полосы просмотра; их сообщения обрабатываются автоматически. Если у многострочного редактора нет полос прокрутки, то он обрабатывает все сообщения о прокрутке, поступающие от родительского окна.
ES_NOHIDESEL
По умолчанию окно-редактор убирает выделения при потере фокуса ввода и возвращает его при возврате фокуса ввода. Флаг ES_NOHIDESEL отменяет это свойство.
ES_OEMCONVERT
Вводимый в окно текст сначала преобразуется из таблицы ANSI в таблицу OEM, затем обратно, после чего отображается на экране. Это гарантирует правильный перевод из одной таблицы в другую, например, при указании строки редактирования имени файла DOS.
ES_PASSWORD
Этот стиль предназначен для ввода паролей и кодов: вводимые символы отображаются в виде звездочки (*). Можно отображать и другой символ, для чего следует послать Windows сообщения ЕM_SETPASSWORDCHAR.
ES_RIGHT
Выравнивание текста по правому краю.
ES_UPPERCASE
Все символы автоматически переводятся в верхний регистр(прописные).
Сообщения класса «edit»
Редактор текста передает функции родительского окна сообщение WM_COMMAND. В параметре сообщения описаны ниже:
Параметр
Описание
wParam
LOWORD (lParam)
HIWORD (lParam)
Идентификатор дочернего окна
Индекс дочернего окна
Код сообщения
Различные коды сообщений приведены в следующей таблице:
Содержимое редактора текста изменено
Нажата полоса вертикального просмотра
Нажата полоса горизонтального просмотра
Редактору текста передали фокус ввода
Редактор текста потерял фокус ввода
Произошло переполнение буфера редактора текста
Код сообщения EN_ERRSPACE означает, что редактору текста не хватает отведенной для него памяти . Заметим, что содержимое редактора текста ограниченно 32 килобайтами.
Редактор текста - довольно сложный объект; программа общается с ним как и с другими органами управления, посредством сообщения . Если надо удалить , скопировать или переместить в «почтовый ящик» выделенный в настоящий момент времени участок текста, то можно предать окно редактора текста сообщение WM_CLEAR,WM_COPY,WM_CUT соответственно:
Send Message (hEditWnd,WM_CLEAR,0,0L);
Send Message ( hEditWnd, WM_COPY,0,0L);
Send Message (hEditWnd, WM_CUT,0,OL);
Текст из «почтового ящика» можно вставить в текст внутри окна редактора в месте нахождения курсора:
SendMessage (hEditWnd, EM_GETSEL,0,0L);
Выделить текст внутри окна редактора может либо пользователь при помощи клавиши Shift и клавиш перемещения курсора, либо само приложение, передав окну редактора сообщение EM_SETSEL с параметром lParam, содержащим начальную и конечную позицию выделяемого текста: