Лабораторна робота №4
Тема:Вивід вікна, керованого методами DirectDraw бібліотеки Direct v.7
Мета: Отримати та закріпити практичні навички роботи з режимами адаптеру.
Індивідуальне завдання:
Вивести на екран та в файл перечня підтримуємих графічним адаптером режимів з вказівкою для кожного дозволення екрану, формату пікселя, частоти розгортки кадрів.
Текст програми:
#define WIN32_LEAN_AND_MEAN // для ускорения запуска процесса
#include <windows.h> // для доступа к API функциям Windows
#include <stdio.h> // для доступа к sprintf()
#include <ddraw.h> // для доступа к DirectX
#include <mmsystem.h> // для доступа к Multimedia API's DirectX
#include <winbase.h> // для записи в файл
//ГЛОБАЛЬНЫЕ ОБЪЯВЛЕНИЯ для использования во всех функциях проекта
static LPDIRECTDRAW7 pDirectDraw7=NULL; // для pointer-а на класс DirectDraw
static LPDIRECTDRAWSURFACE7 pPrimarySurface=NULL;// для pointer-а на первичную поверхность (Surface)
static DDSURFACEDESC2 DDSurfaceDesc={NULL};//структура для параметров поверхности c обнулением ее полей !!!
static HDC hDC; //для GDI контекста вывода на экран
static int nF1=0;//счетчик подсчета числа нажатий клавиши 'F1'
HANDLE hMyOutFile;//для работы с файлом
HRESULT hRet; //Переменная для возвращаемых функциями кодов ошибок
//[ использовать (обычно) не будем, НО НАДО! ]
char Str[150],*pStr=NULL;// для формирования текстовых строк
HWND hWndG; // для использования значения hWnd в разных функциях проекта
/****************************************************************************/
//ФУНКЦИЯ1 "обратного вызова"(Callback) для обеспечения работы метода DirectDrawEnumerateEx() (используется в WndProc() )
BOOL WINAPI DDEnumCallbackEx(GUID FAR *lpGUID,//значение GUID идентификатора объекта DirectDraw
LPSTR lpDriverDescription,//строка с описанием очередного найденного драйвера
LPSTR lpDriverName,//строка с именем очередного найденного драйвера
LPVOID lpContext,//
HMONITOR hm //номер описываемого монитора (0 = текущий)
)
{ static int N=0;//для смещения текста по оси y
//Блокируем ПЕРВИЧНУЮ поверхность (== рабочую область экрана)
hRet=pPrimarySurface->Lock(
NULL,//блокируем ВСЮ поверхность (можно только RECT)
&DDSurfaceDesc,//адрес структуры с параметрами РЕАЛЬНОЙ ПЕРВИЧНОЙ поверхности(выводимой сейчас)- объявлена в ГЛОБАЛЬНЫХ переменных
DDLOCK_SURFACEMEMORYPTR | //флаг получения поинтера на начало поверхности
DDLOCK_WAIT,//ожидать до получения реального доступа к поверхности
NULL); // не используется
//Получение GDI контекста для вывода
hRet=pPrimarySurface->GetDC(&hDC);
//ВЫВОД текста средствами GDI (выводим текущие значения, полученные этой функцией)
sprintf(Str,"lpGUID=%x DriverDescription=%s DriverName=%s Handle to device=%x",
lpGUID, lpDriverDescription, lpDriverName, hm);
TextOut(hDC,20,(150+N),Str,strlen(Str));//вывод очередной записи
//смещения текста по y для вывода при следующем вызове этой функции
N=N+20;//20 - шаг смещения текста по y
pPrimarySurface->ReleaseDC(hDC);//удаляем GDI контекст
pPrimarySurface->Unlock(NULL);//прекращаем блокирование доступа к ПЕРВИЧНОЙ поверхности
return TRUE;//продолжать вывод следующих строк
// return FALSE;//прекратить вывод (прекратить вызов этой (Callback) функции - DDEnumCallbackEx)
};
/****************************************************************************/
//ФУНКЦИЯ2 "обратного вызова"(Callback) для обеспечения работы метода EnumDisplayModes() (используется в WndProc() )
HRESULT WINAPI EnumModesCallback2(
LPDDSURFACEDESC2 lpddSurfaceDesc,//поинтер на структуру параметров очередной из возможных первичных поверхностей
LPVOID lpContext //вспомогательные данные из программы проекта(не используем этот канал)
)
{ static int K=0;//для смещения текста по оси y (в TextOut() )
static int M=0;//для нумерации режимов
//Блокируем ПЕРВИЧНУЮ поверхность (== рабочую область экрана)
hRet=pPrimarySurface->Lock(
NULL,//блокируем ВСЮ поверхность (можно только RECT)
&DDSurfaceDesc,//адрес структуры с параметрами РЕАЛЬНОЙ ПЕРВИЧНОЙ поверхности(выводимой сейчас)- объявлена в ГЛОБАЛЬНЫХ переменных
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.