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

8.3 Класс статических дочерних окон

Вы можете создать статическое дочернее окно управления, используя класс окна "static" при вызове функции CreateWindow. Это совершенно обычные дочерние окна. Они не получают информации от клавиатуры или мыши, и они не посылают сообщений WM_COMMAND обратно родительскому окну. (Когда вы перемещаете мышь или щелкаете мышью над статическим дочерним окном, дочернее окно обрабатывает сообщение WM_NCHITTEST и возвращает в Windows значение HTTRANSPARENT. Это заставляет Windows послать то же сообщение WM_NCHITTEST расположенному внизу окну, которым обычно является родительское окно. Родительское окно, как правило, передает сообщение в DefWindowProc, где оно преобразуется в сообщение мыши рабочей области.)

Первые шесть стилей статического окна рисуют прямоугольник или рамку в рабочей области дочернего окна. В приведенной ниже таблице статические стили "RECT" (левый столбец) являются закрашенными прямоугольниками; три статических стиля "FRAME" (правый столбец) представляют из себя прямоугольные рамки без закрашивания прямоугольника:

SS_BLACKRECT SS_BLACKFRAME

SS_GRAYRECT SS_GRAYFRAME

SS_WHITERECT SS_WHITEFRAME

"BLACK", "GRAY" и "WHITE" не означает, что цветами являются соответственно черный, серый и белый. Эти цвета основаны на системных цветах так, как это показано ниже:

Поле текста окна функции CreateWindow для этих стилей игнорируется. Верхний левый угол прямоугольника расположен в точке с координатами х и у по отношению к родительскому окну. (Вы также можете пользоваться стилями SS_ETCHEDHORZ, SS_ETCHEDVERT или SS_ETCHEDFRAME для создания рамки с тенью, состоящей из серого и белого цветов.)

Статический класс также включает в себя три стиля текста: SS_LEFT, SS_RIGHT и SS_CENTER. Они предназначены для выравнивания текста соответственно по левому краю, по правому краю и по центру. Текст задается в параметре текста окна функции CreateWindow, и позднее он может быть изменен с помощью функции SetWindowText. Когда оконная процедура кнопки управления статического класса выводит на экран этот текст, она использует функцию DrawText с параметрами DT_WORDBREAK, DT_NOCLIP и DT_EXPANDTABS. Текст помещается внутрь прямоугольника дочернего окна.

Фоном дочерних окон этих трех стилей обычно является COLOR_BTNFACE, а самого текста — COLOR_WINDOWTEXT. Вы можете обрабатывать сообщения WM_CTLCOLORSTATIC для изменения цвета текста с помощью вызова функции SetTextColor, а для изменения цвета фона текста — с помощью вызова функции SetBkColor, возвращая при этом описатель кисти фона. Это будет вскоре продемонстрировано в программе COLORS1.

И наконец, статический класс также содержит стили окна SS_ICON и SS_USERITEM. Однако, эти стили не имеют смысла при использовании в качестве дочерних окон управления. К этим стилям мы вернемся при изучении окон диалога.

8.4 Класс полос прокрутки

Когда в главе 3 при написании программ серии SYSMETS, мы впервые коснулись темы полос прокрутки (scrollbar), там говорилось о некоторых отличиях между "полосами прокрутки окна" и "полосами прокрутки — элементами управления". В SYSMETS использовались полосы прокрутки окна, которые появлялись в правой и нижней частях окна. Вы добавляете к окну при его создании полосы прокрутки путем включения в стиль окна идентификаторов WS_VSCROLL или WS_HSCROLL, или обоих сразу. Теперь мы готовы создать некие полосы прокрутки, которые являются дочерними окнами управления, и которые могут располагаться в любом месте рабочей области родительского окна. Вы создаете полосы прокрутки, являющиеся дочерними окнами управления, используя предопределенный класс окна "scrollbar", и один из двух стилей для полос прокрутки: SBS_VERTS и BS_HORZ.

В отличие от кнопок — элементов управления (и окон редактирования и списков, которые будут обсуждаться позже), полосы прокрутки — элементы управления не посылают родительскому окну сообщений WM_COMMAND. Вместо этого они, также как и полосы прокрутки окна, посылают ему сообщения WM_VSCROLL и WM_HSCROLL. При обработке сообщений полос прокрутки с помощью параметра lParam вы можете различать сообщения полос прокрутки окна и полос прокрутки — элементов управления. Для полос прокрутки окна lParam равен 0, а для полос прокрутки — элементов управления он является описателем этих полос прокрутки или описателем дочернего окна управления — полосы прокрутки. Что же касается параметра wParam, то значения его старшего и младшего слова для полос прокрутки окна и для полос прокрутки — элементов управления имеют одинаковый смысл.

Несмотря на то, что полосы прокрутки окна имеют фиксированную ширину, для задания размеров полос прокрутки — элементов управления в Windows используются размеры всего прямоугольника, задаваемые при вызове функции CreateWindow (или позже при вызове функции MoveWindow). Вы можете сделать полосы прокрутки управления длинными и узкими, или короткими и широкими.

Если вы захотите создать полосы прокрутки — элементы управления с теми же размерами, что и полосы прокрутки окна, вы можете использовать для получения высоты горизонтальной полосы прокрутки функцию GetSystemMetrics:

GetSystemMetrics(SM_CYHSCROLL);

или для получения ширины вертикальной полосы прокрутки:

GetSystemMetrics(SM_CXVSCROLL);

(Для задания стандартных размеров полосам прокрутки предназначены идентификаторы стиля окон полос прокрутки SBS_LEFTALIGN, SBS_RIGHTALIGN, SBS_TOPALIGN и SBS_BOTTOMALIGN. Однако, эти стили применимы только для полос прокрутки в окнах диалога.)

Вы можете установить диапазон и положение полосы прокрутки — элемента управления с помощью тех же вызовов функций, что и для полос прокрутки окна:

SetScrollRange(hwndScroll, SB_CTL, iMin, iMax, bRedraw);

SetScrollPos(hwndScroll, SB_CTL, iPos, bRedraw);

SetScrollInfo(hwndScroll, SB_CTL, &si, bRedraw);

Отличие состоит в том, что для полос прокрутки окна в качестве первого параметра используется описатель главного окна, а в качестве второго SB_VERT или SB_HORZ.

Достаточно удивительно то, что системный цвет COLOR_SCROLLBAR более для полос прокрутки не используется. Цвета концевых кнопок и бегунка основаны на COLOR_BTNFACE, COLOR_BTNHIGHLIGHT, COLOR_BTNSHADOW, COLOR_BTNTEXT (для маленьких стрелок), COLOR_BTNSHADOW и COLOR_BTNLIGHT. Цвет большого участка между верхней и нижней концевыми кнопками основан на сочетании цветов COLOR_BTNFACE и COLOR_BTNHIGHLIGHT.

Если вы обрабатываете сообщения WM_CTLCOLORSCROLLBAR, то вы можете возвратить кисть из сообщения для изменения цвета определенной области. Давайте это проделаем.

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