Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programming_Windows_95_Part_I.pdf
Скачиваний:
96
Добавлен:
05.06.2014
Размер:
4.61 Mб
Скачать

269

Щелчок на кнопках заставляет их генерировать сообщение WM_COMMAND. Для обработки сообщения WM_COMMAND программа вызывает функцию GetWindowRect, чтобы сохранить положение и размер всего окна (а не только рабочей области) в структуре RECT (прямоугольник). Это положение определяется относительно экрана. Затем программа OWNERDRW модифицирует поля этой структуры в соответствии с тем, на левой или на правой кнопке был щелчок. Затем программа с помощью функции MoveWindow меняет положение и размер окна, что генерирует другое сообщение WM_SIZE, и кнопки перемещаются в центр рабочей области.

Если бы это было все, что делает программа, она была бы полностью работоспособной, но кнопки были бы невидимы. Кнопки стиля BS_OWNERDRAW при необходимости перерисовки посылают своему родительскому окну сообщение WM_DRAWITEM. Это происходит при первоначальном создании кнопки, при ее нажатии или отпускании, при получении или потере фокуса ввода и во всех других случаях, когда требуется перерисовка.

При обработке сообщения WM_DRAWITEM параметр lParam этого сообщения является указателем на структуру типа DRAWITEMSTRUCT. Программа OWNERDRW хранит этот указатель в переменной pdis. Эта структура содержит информацию, необходимую программе для рисования кнопки. (Такая же структура используется для создания определяемых пользователем списков.) Полями структуры, которые важны для работы с кнопками, являются hDC (контекст устройства для кнопки), rcItem (структура RECT с размерами кнопки), CtlID (идентификатор окна управления) и itemState (которое показывает, нажата ли кнопка и имеет ли она фокус ввода).

Программа OWNERDRW начинает обработку сообщения WM_DRAWITEM с вызова функции FillRect для обновления поверхности кнопки белой кистью и с вызова функции FrameRect для рисования черной рамки вокруг кнопки. Затем, вызывая функцию Polygon, программа OWNERDRW рисует четыре черных треугольника. Это обычный случай.

Если кнопка в данный момент нажимается, то в поле itemState структуры DRAWITEMSTRUCT устанавливается бит. Вы можете выяснить, установлен ли этот бит, используя константу ODS_SELECTED. Если бит установлен, программа OWNERDRW, вызывая функцию InvertRect, меняет цвет кнопки на обратный. Если кнопка имеет фокус ввода, тогда будет установлен бит ODS_FOCUS поля itemState. В этом случае программа OWNERDRW с помощью вызова функции DrawFocusRect рисует точечный прямоугольник внутри кнопки точно вдоль ее сторон.

Предупреждение, связанное с использованием кнопок, определяемых пользователем: Windows получает для вас контекст устройства и включает его в виде поля в структуру DRAWITEMSTRUCT. После использования контекста устройства, оставляйте его в том же состоянии, в каком он находился до этого. Все объекты GDI, выбранные в контекст устройства, должны быть удалены из контекста. Кроме того, будьте внимательны, не рисуйте вне прямоугольника, задающего границы кнопки.

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

Вы можете создать статическое дочернее окно управления, используя класс окна "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" не означает, что цветами являются соответственно черный, серый и белый. Эти цвета основаны на системных цветах так, как это показано ниже:

Кнопка статического класса

Системный цвет

BLACK

COLOR_3DDKSHADOW

GRAY

COLOR_BTNSHADOW

WHITE

COLOR_BTNHIGHLIGHT

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

Соседние файлы в предмете Операционные системы