else Ellipse(hdc2.xi-2. yi-2. xi+2. yi+2);
}
DeleteObj ect(SeiectObject(hdc.hpen));
ReleaseDC(hWnd.hdc);
DeleteObject(SeiectObject(hdc.hpen2));
ReleaseDC(hWnd.hdc2);
QueryPerformanceCounter(&Fi ni sh);
Wremja - (int)( Finish.QuadPart- Start.QuadPart);

sprintf(s."Два контекста Xi".Wremja);

hdc - GetDC(hWnd);

TextOut(hdc.x0.y0.s.strlen(s)); продолжение J

Изменение элементов контекста

Листинг 12.3 {продолжение)

ReleaseDC(hWnd.hdc);

//Вариант 3. Временное сохранение контекста в стеке: int del:

QueryPerformanceCounter(&Start): хО - rect.right*3/4: уО - rect.bottom*2/5; hdc - GetDC(hWnd);

hpen - CreatePen(PS_SOLID.2.RGB(255.200.0)): HPEN Old -(HPEN)SelectObject(hdc. hpen); hpen2-CreatePen(PSJOLID.2.RGB(0.200.255)): 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) {
dcl-SaveDC(hdc);

Select0bject(hdc.hpen2); //Модификация исходного контекста. }

else RestoreDC(hdc.dcl); //Восстановление исходного контекста.

Ellipse(hdc.xi-2.yi-2.xi+2.yi+2);
}

SelectObject(hdc.Old); //Неизвестно, какое из перьев было в контексте.

DeleteObject(hpen);
DeleteObject(hpen2);
ReleaseDC(hWnd.hdc);
QueryPerformanceCounter(&Finish);
Wremja «(int)(Finish.QuadPart - Start.QuadPart);

sprintf(s."Сохранение/восстановление *i".Wremja);

TextOut(hdc.xO.yO.s.st r1 en(s));
}
break;

Для нас важны относительные значения, поэтому затраты времени на рисование (см. рис. 12.2) не переведены в микросекунды. Легко заметить, что рисование с повторным запросом контекста выполняется несколько медленнее, а рисование с использованием предварительно созданных контекстов - быстрее, чем при сохранении контекста в стеке. Насколько важна эта разница в скорости, должен, в конечном счете, решать разработчик приложения. Чтобы сформулировать ориентировочные рекомендации, стоит рассмотреть два случая. Нужно рассмотреть

Оценка времени рисования

Рис. 12.2. Оценка времени рисования Изменение контекста и скорость рисования вариант, в котором вывод примитивов сопровождается трудоемкими вычислениями (у нас для вычисления центра эллипса производятся умножение, деление, вычисления синуса и косинуса), и вариант, когда после каждого запроса и формирования контекста выводится только один примитив.


⇐ Предыдущая| |Следующая ⇒