Учебное пособие: Работа с окнами приложений
или сообщениями WM_SETTEXT, WM_GETTEXT и WM_GETTEXTLENGTH, которые в случае платформы Win32 позволят получить или изменить текст в окне, принадлежащем другому процессу, в то время как рассмотренные функции могут работать только с окнами, принадлежащими данному процессу.
Однако с большими текстами удобнее работать как с отдельными блоками памяти. Для этого надо будет воспользоваться сообщениями:
EM_GETHANDLE 0 0L
для получения хендла блока, содержащего текст;
EM_SETHANDLE hLocal 0L
для задания хендла блока, содержащего текст;
EM_LIMITTEXT nMaxChars 0L
для задания максимального размера текста;
Как все стандартные классы дочерних окна, окна EDIT посылают родительскому окну извещения о происходящих событиях – ошибке из‑за нехватки памяти, получении и потере фокуса, изменении редактируемого текста и о “прокрутке” текста в окошке редактора.
Полосы прокрутки
Последний рассматриваемый нами стандартный класс дочерних окон – полосы прокрутки, принадлежащие к классу SCROLLBAR. Взаимодействие полос прокрутки с родительским окном отличается от взаимодействия всех остальных стандартных классов.
Вы можете сами создавать полосы прокрутки, но, если вам надо одну-две полосы прокрутки снизу и справа от окна, то проще создать окно со стилями WS_VSCROLL и/или WS_HSCROLL. При этом окно автоматически получит нужные полосы прокрутки. Удобство заключается еще и в том, что эти полосы прокрутки размещаются вне внутренней области окна, то есть Вам не надо учитывать их размер.
Для извещения родительского окна полосы прокрутки посылают сообщения WM_VSCROLL и WM_HSCROLL в зависимости от типа полосы - горизонтальная или вертикальная, а для управления полосами прокрутки используются специальные функции.
Сначала рассмотрим сообщения полосы прокрутки:
WM_VSCROLL ScrollCode wndScroll & nPos
WM_HSCROLL ScrollCode wndScroll & nPos
в параметре wPar размещается код, указывающий что происходит с полосой прокрутки, старшее слово lPar содержит хендл полосы прокрутки, а младшее слово может указывать на положение “движка” полосы.
Коды полосы прокрутки могут быть следующие:
Для всех кодов, кроме SB_THUMBTRACK и SB_THUMBPOSITION, младшее слово lPar не используется. Коды SB_THUMBTRACK посылаются когда Вы, “зацепив” мышкой движок полосы прокрутки, начинаете перемещать его. При этом они посылаются так часто, как успевают обрабатываться - информируя Вас о текущем положении движка. Код SB_THUMBPOSITION посылается только в тот момент, когда Вы отпускаете кнопку мыши для позиционирования движка в новом месте.
Помимо этих кодов зарезервировано еще два - SB_TOP и SB_BOTTOM, которые никогда не посылаются полосой прокрутки. Собственно полосы прокрутки поддерживают интерфейс только с мышью, фокуса ввода они не получают, поэтому при использовании полос прокрутки возникает необходимость добавления интерфейса с клавиатурой.
Часто делают так, что родительское окно, обрабатывая сообщения от клавиатуры просто посылает само себе сообщения “от имени” полосы прокрутки. Вся обработка прокрутки окна сосредоточена на сообщениях WM_VSCROLL и WM_HSCROLL. В этом случае клавишам Home и End должны соответствовать какие-то коды полосы прокрутки, для чего и добавлены коды SB_TOP и SB_BOTTOM.
Конечно, Вы можете идти иным путем, тогда эти два кода Вам не понадобятся.
Приведем небольшой пример обработки сообщения WM_KEYDOWN родительским окном:
UINT n;
switch ( wMsg ) {
...
case WM_KEYDOWN:
switch ( wPar ) {
case VK_HOME: n= SB_TOP; goto post_vscroll;
case VK_END: n= SB_BOTTOM; goto post_vscroll;