Шаг 301 - Типы контекстов экранов и эффективность графики

Для экрана в Win32 API есть три типа контекстов. Кстати многие проблемы с графикой как раз связаны с использованием не того типа контекста. Поэтому они бывают:

Контекст класса и частный контекст нужен для программ интенсивно производящих работу с графикой, так как время на графические операции здесь очень значительны. Общий же контекст используется для обычных приложений, основу которых не составляет вывод сложных графических изображений на экран. Получаются все контексты одинаково вызовом функции BeginPaint() или GetDC(), только возвращается контекст с типом определенным классом окна, то есть от того как окно зарегистрировано. Возвращается контекст обратно с помощью функций EndPaint() или ReleaseDC(). Класс контекста существет только для совместимости со старыми версиями. Реально у нас два класса контекста общий и частный. Чем они различаются ? Ну, во-первых, общий контекст всегда инициализируется заново перед операциями вывода на экран по функциям получения контекста. Конечно параметры его можно поменять, но после окончания операций контекст нужно вернуть и все пропадет. А если не возвращать ??? Нельзя. Количество общих контекстов в системе ограничено. Надо. В случае же частного контекста все изменения будут сохранены. Частный контекст инициализируется один раз и удаляется только в самом конце.

Как же получить окно с нужным контекстом ??? Стиль надо нужный установить. Для получения окна с частным контекстом нужно установить стиль CS_OWNDC и все. Все остальные функции используются так же, как и с общим контекстом. Если в друг Вы захотите получить контекст типа контекст класса, то стиль нужен CS_CLASSDC.

Как сделать это в MFC ??? Вот так:

const LPCTSTR MYCLASSNAME = _T("MYView"); 

BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs) 
{
	if (CView::PreCreateWindow(cs)) // проверка первого раза
	{
		GetClassInfoEx(AfxGetInstanceHandle(), cs.lpszClass, &wc); 
		WNDCLASSEX wc; 
		wc.cbSize = sizeof(WNDCLASSEX); 
		wc.lpszClassName = MYCLASSNAME; 
		wc.style |= CS_OWNDC; 
		VERIFY(RegisterClassEx(&wc)); 
		cs.lpszClass = MYCLASSNAME; 
		return TRUE; 
	}
	return FALSE; 
}

Протестировать результат работы можно запустив SPY:

301.gif (12270 b)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 6.01.2001