Вивід вікна, керованого методами DirectDraw бібліотеки Direct v.7

Страницы работы

Содержание работы

Лабораторна робота №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,//адрес структуры с параметрами РЕАЛЬНОЙ ПЕРВИЧНОЙ поверхности(выводимой сейчас)- объявлена в ГЛОБАЛЬНЫХ переменных

Похожие материалы

Информация о работе