Сравнение этих вариантов выполняется в программе (папка ContSpeed), которая тремя способами рисует несколько размещенных по окружности желтых и голубых эллипсов (рис. 12.2). Для создания этого проекта нужно было лишь добавить в проект Template модуль ContSpeed.срр с функцией, которая выполняется при выборе пользователем первого пункта меню. Код соответствующей функции приведен в листинге 12.3.
Изменение контекста и скорость рисования Листинг 12.3
void ContSpeedCHWND hWnd) {
RECT rect;
HDC hdc.hdc2;
HPEN hpen,hpen2;
LARGE JNTEGER Start .Finish;
int xO.yO.xi,yi.Wremja;
GetClientRect(hWnd.rect); //Запоминаем размеры окна.
//Вариант 1. Рисование каждого эллипса с запросом и освобождением
// контекста устройства
тележка с поворотными колесами.
QueryPerformanceCounter(&Start); //Фиксация времени начала рисования. хО - rect.right/2;у0 - rect.bottom*3/5; //Центр круга зависит от размеров окна, for ( i-1; i<-N;i++) {
xi - хО + rect.bottom/3*cos(i*6.283/N); yi - yO + rect.bottom/3*sin(i*6.283/N); hdc - GetDC(hWnd); //Запрос контекста.
HPEN hpen - CreatePen(PS_SOLID.2.i&l?RGB(255.200.0):RGB(0.200.255)); hpen - (HPEN)SelectObject(hdc.hpen); EllipseChdc.xi-2.yi-2.xi+2.yi+2); DeleteObject(SeiectObject(hdc.hpen); ReleaseDC(hWnd.hdc); //Освобождение контекста.
}
QueryPerformanceCounter(&Finish);
Wremja - (int)( Finish.QuadPart- Start.QuadPart);
sprintf(s." Повторный запрос Xi".Wremja); //Преобразование
hdc-GetDC(hWnd); //времени рисования в строку символов
TextOut(hdc.хО.yO.s.strlen(s));
ReleaseDC(hWnd.hdc): //Вывод сообщения на экран.
//Вариант 2. Два контекста, hdc и hdc2. созданы и настроены
//перед началом рисования:
QueryPerformanceCounter(&Sta rt);
hdc - GetDC(hWnd);
hpen - (HPEN)SelectObject(hdc. CreatePen(PS_SOLID.2.RGB(255.200.0))); hdc2 - GetDC(hWnd);
hpen2 - (HPEN)Select0bject(hdc2. CreatePen(PS_SOLID.2.RGB(0.200.255))); xO - rect.right/4; yO - rect.bottom*2/5; for (i-1; i<-N; i++) {
xi - xO+rect.bottom/3*cos(i*6.283/N);
yi - yO+rect.bottom/3*sin(i*6.283/N);
if(i&l) Ellipse(hdc. xi-2. yi-2. xi+2. yi+2);