Программирование для карманных компьютеров
Шрифт:
Манипуляции с текстом
С выделенным фрагментом можно производить все стандартные операции – копирование в буфер (Ctrl+C), удаление в буфер (Ctrl+X) и вставка текста из буфера (Ctrl+V). Нажатие клавиши Del удаляет выделенный фрагмент. Также можно пользоваться операциями отмены последнего действия (Ctrl+Z) и повторения удаленного действия (Ctrl+Y). Все эти действия являются стандартными, и их можно выполнить при помощи клавиатурных сочетаний или при помощи команд меню Edit.
Кроме этого, меню Edit содержит еще ряд интересных команд, которые перечислены в следующем списке.
? Команда Find выводит на экран диалог настройки поиска в текущем файле.
? Команда Find in Files выводит на экран диалог настройки поиска текста в файлах указанного каталога.
? Команда Replace выводит на экран диалоговое окно настройки поиска и замены текста в текущем файле.
? Команда Go To… выводит на экран окно перехода к выбранному типу ссылки. При этом поддерживается достаточно много типов ссылок.
• Adress – позволяет отыскивать любой доступный адрес памяти в окнах деассемблирования или просмотра содержимого памяти.
• Bookmark – имя ранее установленной в тексте закладки.
• Definition – любое используемое в коде имя. Будет осуществлен переход на место, где это имя объявлено.
• Reference – любое используемое в коде имя. Будет осуществлен переход на место, где это имя реализовано или впервые использовано.
ВНИМАНИЕ! Для того чтобы ссылки Reference и Definition работали, должны быть установлены соответствующие флаги Project ? Settings ? C\C++ ? Generate Browse Info, Project ? Settings ? Link ? Generate Debug Info и Project ? Settings ? Browse Info ? Built Browse Info File.
• Error/Tag – позволяет в режиме отладки ввести код сгенерированной ошибки. При этом будет осуществлен переход на строку кода, в которой возникла ошибка.
• Line – номер строки в коде.
• Offset – число в шестнадцатеричном формате, означающее сдвиг от базового адреса в окне просмотра содержимого памяти.
? Команда Bookmarks выводит на экран окно, позволяющее установить
? Команда Incremental Search позволяет прямо в окне редактирования кода начать ввод сочетания символов. По мере ввода в окне редактора будет выделено наиболее близкое сочетание. Это быстрый поиск, который осуществляется без использования окна Find.
• Команда Format Selection форматирует выделенный фрагмент текста в соответствии с установленными параметрами форматирования.
• Команда Tabify Selection указывает, что все используемые для отступа пробелы будут преобразованы в символы табуляции.
• Команда UnTabify Selection указывает, что все используемые для отступа символы табуляции будут преобразованы в пробелы.
• Команда Make Selection Uppercase позволяет перевести в верхний регистр все символы выделенного фрагмента.
• Команда Make Selection Lowercase позволяет перевести в нижний регистр все символы выделенного фрагмента.
• Команда View Witespace позволяет сделать видимыми символы пробела и табуляции.
? Команда Breakpoints выводит на экран диалоговое окно, позволяющее установить точки останова и задать их параметры.
? Команда List Members позволяет отобразить в выпадающем списке после имени структуры, класса или объекта список элементов данной структуры, класса или объекта.
? Команда Type Info показывает на всплывающем ярлычке, как было объявлено данное имя.
? Команда Parameter Info показывает на всплывающем ярлычке список параметров функции.
? Команда Complete Word показывает возможные варианты завершения набираемого в данный момент имени переменной или функции.
Работа с контекстным менюРяд команд, содержащихся в меню Edit, доступны из контекстного меню редактора кода. Это ускоряет работу с командами. Кроме того, в контекстном меню есть дополнительные команды, которые перечислены в списке.
? Команда Insert File Into Project позволяет внести ссылку на данный файл в структуру другого проекта. Конечно, она используется только тогда, когда в рабочем пространстве присутствует несколько проектов.
? Команда Open Document позволяет открыть документ, если выделенный фрагмент текста является его именем.
? Команда Insert/Remove Breakpoint устанавливает или удаляет точку останова на данной строке кода.
? Команда Enable/Disable Breakpoint включает или выключает точку останова, если она установлена на данной строке кода.
? Команда ClassWizard… выводит на экран мастер создания классов, который может использоваться только для приложений с использованием MFC.
Использование клавиатурных сочетанийПри редактировании кода вместо использования команд меню гораздо удобнее пользоваться «горячими» клавишами. В табл. 4.4 отображены некоторые сочетания «горячих» клавиш.
Таблица 4.4. Клавиатурные сочетанияCоздание интерфейса пользователя и работа с ресурсами
Когда после работы с Delphi или хотя бы с Visual Basic разработчик начинает создавать интерфейс пользователя в eVC, то у него неминуемо возникает вопрос, почему в названии этой среды есть слово Visual? Некоторые фрагменты интерфейса, конечно, можно сконструировать почти как в eVB, но далеко не все. Большую часть работы приходится делать при помощи объявления в коде. Это замедляет процесс разработки интерфеса, но при этом разрабточик получает максимально большой контроль над своим приложением. В этой части главы будет рассматриваться порядок создания интерфейса пользователя.
КнопкиБезусловно, кнопка является самой популярной частью пользовательского интерфейса. Поэтому в первом упражнении будет рассмотрено изготовление кнопок различного вида и стиля.
Упражнение 4.3
1. Создать новый проект (File ? New ? Projects ? WCE Pocket PC 2002 Application) и дать ему имя Buttons. Сохранить проект. На следующем шаге мастера нужно выбрать вариант A typical «Hello Word» application и нажать кнопку Finish.
2. Открыть файл Buttons.cpp, нажать сочетание клавиш Ctrl+F для вызова окна поиска, ввести строку case WM_CREATE и найти место в коде, где используется этот текст. Этот блок кода выглядит так, как показано в листинге 4.13.
Листинг 4.13case WM_CREATE:
g_hwndCB = CreateRpCommandBar(hWnd);
memset (&s_sai, 0, sizeof (s_sai));
s_sai.cbSize = sizeof (s_sai);
break;3. Этот блок кода обрабатывает событие создания формы. В этот момент на форме создается полоса меню. В этот блок кода будут добавлены строки, создающие на форме кнопки. Данный блок кода нужно изменить так, как это показано в листинге 4.14. Листинг 4.14
case WM_CREATE:
g_hwndCB = CreateRpCommandBar(hWnd);
memset (&s_sai, 0, sizeof (s_sai));
s_sai.cbSize = sizeof (s_sai);
CreateWindow(TEXT («BUTTON»), TEXT («Button»),
BS_PUSHBUTTON | BS_NOTIFY | WS_VISIBLE | WS_CHILD,
10, 20, 100,25, hWnd, (HMENU)200, g_hInst, NULL);
CreateWindow(TEXT («BUTTON»), TEXT («CheckBox»),
BS_CHECKBOX | WS_VISIBLE | WS_CHILD,
10, 50, 100,25, hWnd, (HMENU)201, g_hInst, NULL);
CreateWindow(TEXT («BUTTON»), TEXT («AutoCheck»),
BS_AUTOCHECKBOX | WS_VISIBLE | WS_CHILD,
10, 80, 100, 25, hWnd, (HMENU)202, g_hInst, NULL);
CreateWindow(TEXT («BUTTON»), TEXT («AutoChec_3State»),
BS_AUTO3STATE | WS_VISIBLE | WS_CHILD,
10, 110, 100, 25, hWnd, (HMENU)203, g_hInst, NULL);
CreateWindow(TEXT («BUTTON»), TEXT («RadioButton1»),
BS_AUTORADIOBUTTON | WS_VISIBLE | WS_CHILD,
10, 140, 100, 25, hWnd, (HMENU)204, g_hInst, NULL);
CreateWindow(TEXT («BUTTON»), TEXT («RadioButton2»),
BS_AUTORADIOBUTTON | WS_VISIBLE | WS_CHILD,
10, 170, 100, 25, hWnd, (HMENU)205, g_hInst, NULL);
CreateWindow(TEXT («BUTTON»), TEXT («OwnerDrawButton»),
BS_PUSHBUTTON | BS_OWNERDRAW | WS_VISIBLE | WS_CHILD,
10, 200, 100, 25, hWnd, (HMENU)206, g_hInst, NULL);
CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, TEXT («BUTTON»), TEXT («Button»),
BS_PUSHBUTTON | BS_NOTIFY | WS_VISIBLE | WS_CHILD,
125, 20, 100,25, hWnd, (HMENU)207, g_hInst, NULL);
CreateWindowEx(WS_EX_WINDOWEDGE, TEXT («BUTTON»), TEXT («Button»),
BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
125, 50, 100,25, hWnd, (HMENU)208, g_hInst, NULL);
CreateWindowEx(WS_EX_STATICEDGE, TEXT («BUTTON»), TEXT («Button»),
BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
125, 80, 100, 25, hWnd, (HMENU)209, g_hInst, NULL);
CreateWindowEx(WS_EX_TOOLWINDOW, TEXT («BUTTON»), TEXT («Button»),
BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
125, 110, 100, 25, hWnd, (HMENU)210, g_hInst, NULL);
CreateWindowEx(WS_EX_CLIENTEDGE, TEXT («BUTTON»), TEXT («Button»),
BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | WS_BORDER,
125, 140, 100, 25, hWnd, (HMENU)211, g_hInst, NULL);
CreateWindowEx(WS_EX_CLIENTEDGE, TEXT («BUTTON»), TEXT («Button»),
BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | WS_CAPTION,
125, 170, 100, 25, hWnd, (HMENU)212, g_hInst, NULL);
CreateWindowEx(WS_EX_CLIENTEDGE, TEXT («BUTTON»), TEXT («Button»),
BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | WS_OVERLAPPED,
125, 200, 100, 25, hWnd, (HMENU)213, g_hInst, NULL);
break;4. Следующий за этим блок кода, обрабатывающий событие прорисовки формы, приведен в листинге 4.15. Листинг 4.15
case WM_PAINT:
RECT rt;
hdc = BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &rt);
FillRect(hdc, &rt, CreateSolidBrush(0xFFFF00));
//LoadString(g_hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
//DrawText(hdc, szHello, _tcslen(szHello), &rt,
//DT_SINGLELINE | DT_VCENTER | DT_CENTER);
EndPaint(hWnd, &ps);
break;Следует обратить внимание на закомментированные строки. Это именно то изменение, которое нужно внести в код. Переведя эти строки в состояние комментария, можно предотвратить вывод на форму надписи «Hello, Word!». Добавленный в код метод FillRect закрашивает ее в цвет Magenta. Теперь нужно скомпилировать проект и запустить его. Результат выполнения программы показан на рис. 4.5.
Стоит заметить, что две нижние кнопки в правом ряду можно перетаскивать при помощи мыши. 5. Внимательно расмотрев код, можно понять, что, несмотря на разницу в поведении и внешнем виде, практически все кнопки были созданы одной и той же функцией CreateWindow. Правый ряд кнопок был создан при помощи усовершенствованного варианта этой функции CreateWindowEx.
ВНИМАНИЕ!
Несмотря на разницу в поведении и назначении, все основные элементы управления Windows (кнопки, полосы прокрутки, поля ввода текста и т. д.) представляют собой окна Windоws. Они генерируют сообщение WM_COMMAND, создаются при помощи функции Create-Window, и разница между создаваемыми элементами определяется только аргументами, которые передаются этой функции. Этот ряд элементов управления носит общее название Windows Control.
Функции CreateWindow и CreateWindowEx Синтаксис функции CreateWindow достаточно прост.HWND CreateWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HANDLE hInstance,
PVOID lpParam);Расшифровка аргументов этой функции приведена в следующем списке.
? Параметр IpClassName при создании элементов управления всегда получает одно из предопределенных значений.
• Значение BUTTON создает стандартную кнопку, которая посылает в родительское окно сообщение о том, что пользователь выбрал данную кнопку.
• Значение EDIT создает поле ввода текста, которое позволяет пользователю вводить и редактировать текст.
• Значение LISTB0X создает список, из которого пользователь может выбрать одну из строк.
• Значение C0MB0B0X действует как сочетание EDIT и LISTB0X. В получившемся органе управления пользователь может как выбрать одну из строк, так и ввести ее самостоятельно.
• Значение SCROLLBAR создает полосу прокрутки.
• Значение Image создает элемент управления, предназначенный для отображения
текста или графического изображения.? Параметр IpWindowName содержит текст, который должен быть отображен в элементе управления.
? Параметр dwStyle задает стиль окна, которое будет создано. Стиль задается при помощи сочетания предопределенных значений.
• Значение WS_B0RDER создает окно с тонкой рамкой.
• Значение WS_CAPTION создает окно со строкой заголовка (включает в себя стиль WSB0RDER).
• Значение WS_CHILD создает дочернее окно. Этот стиль несовместим со стилем WSP0PUP.
• Значение WS_CLIPCHILDREN для родительского окна отключает перерисовку тех зон окна, которые заняты дочерними окнами.
• Значение WS_CLIPSIBLINGS исключает рисование в перекрытых дочерних окнах. Если одно из перекрытых дочерних окон перерисовывается, то перекрытые им области других окон не будут перерисованы.
• Значение WS_DISABLED создает неактивное окно.
• Значение WS_DLGFRAME создает окно с рамкой, типичной для диалоговых окон. Это окно не может иметь заголовка.
• Значение WS_GR0UP задает первый элемент в группе элементов управления. Группа включает этот элемент и все элементы, объявленные после него, до следущего элемента, который будет создан со стилем WS_GR0UP. Первый элемент в группе обычно также имеет стиль WS_TABSTOP, чтобы пользователь мог переходить от одной группы к другой.
• Значение WSJHSCROLL создает окно с горизонтальной полосой прокрутки.
• Значение WS_OVERLAPPED определяет окно с заголовком и рамкой.
• Значение WS_P0PUP создает всплывающее окно. Этот стиль не может быть использован совместно со стилем WS_CHILD.
• Значение WS_SYSMENU создает окно с кнопкой закрытия на заголовке.
• Значение WS_TABSTOP создает окно, которое может принимать фокус от клавиатуры при нажатии клавиши TAB.
• Значение WS_VISIBLE определяет видимое окно.
• Значение WS_VSCROLL создает окно с вертикальной полосой прокрутки.
? Параметр х задает горизонтальную координату относительно левого верхнего угла страницы или родительского окна.
? Параметр у задает вертикальную координату относительно левого верхнего угла страницы или родительского окна.
? Параметр nWidth определяет ширину создаваемого окна.
? Параметр nHeight определяет высоту создаваемого окна.
? Параметр hWndParent задает идентификатор родительского окна.
? Параметр hMenu, в зависимости от стиля окна, может содержать или идентификатор меню, которое должно быть использовано с окном (для окон со стилем WS_OVERLAPPED или WS_P0PUP), или идентификатор окна внутри списка дочерних окон (для окон со стилем WS_CHILD).
? Параметр hlnstance определяет идентификатор модуля или приложения, который является владельцем данного окна.
? Параметр 1 pParam является дополнительным. Для органов управления семейства Windows control он равен NULL.
Функция CreateWindowEx идентична функции CreateWindow, за исключением того, что она позволяет первым параметром dwExStyle задать дополнительный стиль, предопределенные значения которого приведены в следующем списке.
? Значение WS_EX_ACCEPTFILES создает окно, способное принимать файлы при перетаскивании их мышью.
? Значение WS_EX_APPWINDOW создает окно, которое отображается на панели задач.
? Значение WS_EX_CLIENTEDGE определяет окно с утопленной рамкой.
? Значение WSEXDLGMODALFRAME создает окно с двойной рамкой. Это окно может иметь заголовок, если это определено в dwStyle.
? Значение WS_EX_LEFT создает окно с выравниванием по левому краю. Этот стиль задан по умолчанию.
? Значение WS_EX_LEFTSCROLLBAR применяется при использовании языков с обратным направлением чтения. Оно устанавливает полосу прокрутки с левой стороны.
? Значение WSEXLTRREADING задает направление отображения текста слева направо.
? Значение WS_EX_MDICHILD определяет дочернее окно в приложении MDI.
? Значение WSEXNOACTIVATE создает окно, которое принимает события от стилуса, но при этом не принимает фокус ввода.
? Значение WS_EX_NOANIMATION определяет окно, для которого не применяется анимация появления и сворачивания окна.
? Значение WS_EX_NOPARENTNOTIFY определяет окно, которое при создании и уничтожении не оповещает родительское окно при помощи сообщения WM_ PARENTNOTIFY.
? Значение WS_EX_OVERLAPPEDWINDOW создает окно, в котором совмещены стили WSEXCLIENTEDGE и WSEXWINDOWEDGE.
? Значение WS_EX_PALETTEWIND0W задает окно, в котором совмещены стили WSEXWINDOWEDGE, WSEXT00LWIND0W и WSEXT0PM0ST.
? Значение WS_EX_RIGHT создает окно с выравниванием по правому краю.
? Значение WS_EX_RIGHTSCROLLBAR указывает, что вертикальная полоса прокрутки будет расположена справа.
? Значение WS_EX_RTLREADING устанавливает вывод текста справа налево для языков обратного направления чтения. Для других языков этот стиль игнорируется.
? Значение WS_EX_STATICEDGE создает окно с объемной рамкой. Обычно это значение используется для элементов, которые не принимают ввода от пользователя.
? Значение WS_EX_T00LWIND0W создает инструментальное окно, которое обычно используется как плавающая панель инструментов.
? Значение WSEXT0PM0ST создает окно, которое всегда находится поверх других окон.
? Значение WS_EX_TRANSPARENT создает окно, которое является прозрачным для элементов, которые расположены под ним.
? Значение WS_EX_WINDOWEDGE создает окно с выпуклой рамкой.
Легко заметить, что при помощи функций CreateWindow и CreateWindowEx создаются не только кнопки, но и другие элементы управления, в том числе и окна. Стили стоит применять аккуратно. Так, совмещение стилей BS_PUSHBUTTON и WSJHSCROLL создаст кнопку с полосой прокрутки внутри, но кому же она будет нужна?
Стили элементов Window ControlКаждый элемент семейства Window Control, кроме типа, устанавливаемого параметром lpClassName, при помощи нескольких констант позволяет определять стили, свойственные конкретному типу элементов. Эти константы нужно указывать в свойстве dwStyle, совмещая их с оконными стилями.
BUTTONТип BUTTON имеет больше всего стилей, потому что с его помощью реализуются кнопки, радиокнопки и флажки. В следующем списке приведен набор стилей для кнопок.
? Стиль BS_B0TT0M выравнивает текст по нижнему краю кнопки.
? Стиль BS_CENTER выравнивает текст по горизонтальному центру кнопки.
? Стиль BS_DEFPUSHBUTTON определяет кнопку, как используемую по умолчанию на диалоговой форме. Когда пользователь нажимает клавишу ENTER, кнопка срабатывает, даже если она не имеет фокуса ввода.
? Стиль BSJ-EFT выравнивает текст по левому краю кнопки.
? Стиль BS_N0TIFY определяет кнопку которая посылает в родительское окно сообщения BNKILLFOCUS и BNSETFOCUS. Также генерируется сообщение BNCLICKED.
? Стиль BS_OWNERDRAW создает кнопку, поверхность которой перерисовывается программным путем. Родительское окно получает от кнопки сообщение WM_ MEASUREITEM при создании кнопки и сообщение WM_DRAWITEM при перерисовке.
? Стиль BS_PUSHBUTTON создает кнопку, которая герерирует сообщение WMCOMMAND при нажатии на нее.
? Стиль BS_RIGHT выравнивает текст по правому краю кнопки.
? Стиль BS_T0P выравнивает текст по верхней стороне кнопки.
? Стиль BS_VCENTER вертикально центрует текст на кнопке.
В следующем списке рассматриваются стили для создаваемых флажков.
? Стиль BS_3STATE создает флажок, состояние которого не может быть изменено пользователем. Подобный флажок используется для индикации состояний.
? Стиль BS_AUT03STATE создает флажок с тремя состояниями. Он может быть включен, выключен или недоступен. Состояния меняются при каждом щелчке мышью.
? Стиль BS_AUTOCHECKBOX создает флажок, в котором каждый щелчок взводит или сбрасывает его.
? Стиль BS_CHECKBOX создает пустой флажок, который не взводится при щелчке.
? Стиль BSJ-EFT отвечает за выравнивание текста по левому краю.
? Стиль BS_PUSHLIKE создает флажок, который нажимается как обыкновенная кнопка.
? Стиль BS_RIGHT отвечает за выравнивание текста по правому краю.
? Стиль BS_RIGHTBUTTON располагает флажок справа от поясняющей надписи.
Набор стилей для радиокнопок приведен в заключительном списке раздела.
? Стиль BSAUTORAD10BUTT0N создает радиокнопку, которая при выборе ее пользователем сбрасывает флаг у другой кнопки в этой же группе.
? Стиль BSJ-EFT отвечает за выравнивание текста в левую сторону.
? Стиль BS_RADI0BUTT0N создает пустую радиокнопку.
? Стиль BS_RIGHT отвечает за выравнивание текста в правую сторону.
? Стиль BS_RIGHTBUTTON создает радиокнопку, которая располагается справа от поясняющего текста.Упражнение 4.3 (продолжение)
6. Чтобы получить представление о том, какое большое влияние может оказывать сочетание стилей даже на такие простые элементы, как кнопки, нужно немного изменить код проекта. Нужно переписать последний вызов функции CreateWindowEx следующим образом:
CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, TEXT («BUTTON»), TEXT («Button»), BS_GROUPBOX | WS_VISIBLE | WS_CHILD, 2, 2, 235, 262, hWnd, (HMENU)213, g_hInst, NULL);
Если теперь запустить проект, то вместо кнопки будет отображен компонент, предназначенный для визуального выделения группы элементов. 7. Теперь следует изменить код этой же функции еще раз, добавив в нее еще один стиль, как показано ниже:
CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, TEXT («BUTTON»), TEXT («Button»), BS_GROUPBOX |
WS_VISIBLE | WS_CHILD | WS_OVERLAPPED, 2, 2, 235, 262, hWnd, (HMENU)213, g_hInst,
NULL);После запуска проекта на заднем плане будет размещено полноценное окно с заголовком, которое можно перемещать по экрану. Этот пример хорошо демонстрирует, что стиль BS_GR0UPB0X сам по себе не делает это окно контейнером компонентов, которые геометрически размещены внутри его границ. EDIT
Для создания поля ввода используется достаточно большой набор стилей, которые приведены в следующем списке.
? Стиль ES_AUT0HSCR0LL позволяет автоматически прокручивать текст вправо на десять символов после того, как пользователь дошел до конца строки. После нажатия клавиши ENTER текстовый курсор возвращается в начальную позицию.
? Стиль ES_AUT0VSCR0LL определяет прокручивание текста вниз на одну страницу, когда пользователь на последней строке текста нажимает клавишу ENTER.
? Стиль ES_CENTER задает выравнивание текста по центру для многострочного поля ввода.
? Стиль ESJ.EFT задает выравнивание влево.
? Стиль ES_LOWERCASE указывает, что все вводимые символы будут переводиться в нижний регистр.
? Стиль ES_MULTILINE создает многострочный текстовый редактор. По умолчанию элемент EDIT является однострочным полем ввода. Когда многострочный редактор находится в диалоговом окне, окно перехватывает нажатие клавиши ENTER, и для того чтобы компонент EDIT принимал это событие первым, надо использовать стиль ES_WANTRETURN. Когда многострочный редактор располагается не в диалоговом окне и для него задан стиль ES_AUTOVSCROLL, то редактор показывает максимально возможное количество строк, а прокручивать текст будет только при необходимости. Если стиль ES_AUTOVSCROLL не задан, то по достижении последней строки звучит предупредительный звуковой сигнал, а прокрутки не происходит. Когда задан стиль ES_AUTOHSCROLL, многострочный редактор включает горизонтальное прокручивание при достижении правого края. При выключенном стиле ES_AUTOHSCROLL при достижении правой границы происходит автоматический перенос на следующую строку по границе ближнего слова. Клавиша ENTER тоже осуществляет переход на новую строку.