554 _________________Часть IV. Новые возможности С++
мое верхнее деление, если нам потребуется показывать деления. Мы выбираем перо (pen) цвета системного фона и рисуем полукруг; заметьте, что для того, чтобы он плотно вписался в прямоугольник, в действительности приходится создать другой прямоугольник, в два раза больше (по высоте) клиентского (чтобы центр эллипса был на нижней стороне нашего клиентского прямоугольника, а не в его центре). Наконец, если нам нужно отобразить деления, мы размещаем их на равном расстоянии по дуге, используя тригонометрические функции для вычисления пар (х, у); деления рисуются тем же цветом, каким будет изображаться стрелка индикатора в функции-члене paint. Помните, что наш базовый класс TGauge предоставляет функцию-член для изменения этого цвета BarColor; просто вызовите SetColor, и цвет делений и индикатора изменится.
Функция-член paint очень сходна с рассмотренной функцией paintBorder. Практически идентичным образом вычисляется точка (х, у), куда указывает стрелка. Чтобы стрелка была немного потолще, мы чертим пять линий цветом BarCoior. Стоит обратить внимание также на переменные Мах, Min и value, являющиеся защищенными членами TGauge. мах и Min устанавливаются функцией setRange и содержат начальное и конечное значения индикатора, a Value устанавливается функцией set-value и содержит, ясное дело, текущее значение; В исходном файле Chordg.cpp вы также можете увидеть дополнительный код тестового приложения, с помощью которого можно полюбоваться на наш индикатор; этот код типичен для приложений в \Bc5\Examples\Owl\Classes. Указав в конструкторе TChordGauge 10 делений и запустив Chordg.exe, вы получите картинку, показанную на рис. 20.7.
Рис. 20.7
Выполняется пример, реализующий элемент управления TChordGauge с 10 делениями
Полиморфизм в действии
Полиморфизм в примере с машиностроительной фирмой заключался в том, что мы объявили в базовом классе Employee виртуальную , функцию printData, а затем адаптировали ее для различных производных классов, таких как SalariedEmployee, Manager и т. д. Теперь, "пробегая" по массиву указателей на класс Employee, объявленному как
Employee *companyEmployee[maxMumberO?Employees];