Реализовать рассмотренные режимы можно, корректируя в соответствии с изменением окна область просмотра или матрицу проецирования.
Чтобы изменение окна не влияло на линейные размеры элементов изображения, можно задать при инициализации область вывода размером во весь экран и в дальнейшем ее не изменять ни в функции RenderO (), ни при обработке сообщений WM_SIZE. Для этого потребуется определять разрешение экрана вызовами функций GetSystemMetrics(SM_CXSCREEN) и GetSystemMetri cs (SM_CYSCREEN).
Если область просмотра функцией gl Vi ewPort () совмещать с рабочей областью окна перед началом вывода примитивов или по каждому сообщению WM_SIZE, то получим режим линзы, в котором изображение будет автоматически масштабироваться при изменении размеров окна, как показано в листинге 22.6.
Листинг 22.6
void OnSizeCHWND hWnd.UINT message.WPARAM wParam.LPARAM lParam) {
g1V i ewpo rt(0.0.LOWORD(wP а г am).HIWORD(wP a ram)); }
Программа, позволяющая изменять режим при помощи выбора пункта меню, находится в папке Линза_Шторка_61_.
Использование расширений Использование расширений Измерение временных характеристик Чтобы оценить затраты времени на очистку буферов, вывод примитивов и смену страниц, в файле Utils.h объявлены класс LogTime, позволяющий разместить в тексте программы контрольные точки для фиксации временных интервалов, и класс LogHead, который содержит заголовок списка контрольных точек типа LogTi me. Код этого класса приведен в листинге 22.7.
Листинг 22.7
class LogTime {
friend class LogHead: //Заголовок списка контрольных точек. _int64 S; //Время начала выполнения фрагмента программы.
_int64 F; //Время окончания выполнения фрагмента программы.
char *R; //Пояснительный текст, public:
LogTime *next; //Адрес следующей контрольной точки. LogTimeCLogHead *L,char *):
void StartCvoid){S - HightTimeC);} //Запись времени начала фрагмента в S. void Periode void):
void Finish(void) {S=HightTime():} //Запись времени конца фрагмента в F. }: Можно включить в программу макрос START(<Mma заголовка списка>. Пояснительная