Microsoft DirectX 2

         

Доступ к буферу изображения


Объекты DirectDrawSurface представляют поверхностную память в архитектуре DirectDraw. DirectDrawSurface позволяет прикладной программе непосредственно получать доступ к этой поверхностной памяти через IDirectDrawSurface::Lock. Программа вызывает этот метод, передавая структуру RECT, которая определяет прямоугольник на поверхности, к которому требуется доступ. Если вызов IDirectDrawSurface::Lock происходит с параметром  RECT NULL, принимается, что запрашивается исключительный доступ ко всей поверхностной памяти. Этот метод заполняет структуру DDSURFACEDESC информацией, необходимой для прикладной программы, чтобы получить доступ к поверхностной памяти. Эта информация включает размер и формат пикселя поверхности, если от отличен от формата пикселя основной поверхности. Когда прикладная программа закончила работу с поверхностной памятью, поверхностная память должна быть сделана доступной методом IDirectDrawSurface::Unlock.

Опыт показывает что имеется несколько общих проблем, с которыми Вы можете столкнуться при записи непосредственно в DirectDrawSurface. Следующий список описывает некоторые решения для этих проблем:

Никогда не принимайте шаг дисплея постоянным. Всегда исследуйте информацию шага, возвращенную  IDirectDrawSurface::Lock. Этот шаг может измениться по ряду причин, включая расположение поверхностной памяти, тип платы дисплея, или даже версию используемого драйвера DirectDraw.

Существуют ограничения по обращению к IDirectDrawSurface:: Lock и IDirectDrawSurface::Unlock. IDirectDrawSurface::Lock проводит блокировку WIN16 при получении доступа к памяти поверхности для безопасного прохождения операции и IDirectDrawSurface:: GetDC метод неявно называет IDirectDrawSurface:: Lock. Блокировка WIN16 преобразовывает в последовательную форму доступ к GDI и USER, закрывая Windows для продолжительных задержках между операциями Lock и Unlock, а также между операциями GetDC и ReleaseDC.

Убедитесь, что Вы копируете выравненные данные в память. Windows 95 использует драйвер неисправности страниц, Vflatd. 386, чтобы переслать виртуальный плоский буфер для плат дисплея с  банками переключаемой памяти. Этот модуль позволяет этим устройствам  представлять линейный буфер фреймов(LFB) в DirectDraw. Копирование невыравненных данных в  память может заставить систему приостановить операции, если копия охватывает несколько банков памяти.



Драйвер независимые ограничители


Вы можете создавать объекты ограничителя, которые непосредственно не принадлежат никакому специфическому объекту DirectDraw. Такие объекты ограничителя могут быть разделены  многими объектами DirectDraw. Драйвер независимые объекты ограничителя создаются новой функцией DirectDraw API DirectDrawCreateClipper. Эта функция должна вызываться прежде, чем созданы любые объекты DirectDraw.

Так как эти ограничители не принадлежат никакому объекту DirectDraw, они автоматически не уничтожаются, когда объекты вашей прикладной программы уничтожены. Если они не выпущены явно прикладной программой, ограничители будут выпущены DirectDraw при завершении программы.

Вы можете все еще создавать ограничители методом IDirectDraw:: CreateClipper. Объекты  DirectDrawClipper автоматически разрушаются, когда рузрушается объект DirectDraw, из которого они были созданы.



EnumCallback


HRESULT WINAPI lpEnumCallback(LPDIRECTDRAWSURFACE lpDDSurface,

LPDDSURFACEDESC lpDDSurfaceDesc,LPVOID lpContext);

Определенная прикладная программой процедура callback для IDirectDraw:: EnumSurfaces.

Возвращает DDENUMRET_OK, чтобы продолжить перечисление, или DDENUMRET_CANCEL, чтобы остановить его.

lpDDSurface

Адрес DirectDrawSurface, в настоящее время перечислимой, если это - существующая поверхность (DDENUMSURFACES_DOESEXIST). Значение будет NULL, если перечисляется потенциальная поверхность (DDENUMSURFACES_CANBECREATED).



lpDDSurfaceDesc

Адрес DDSURFACEDESC структуры для существующей или потенциальной поверхности, которая наиболее близко соответствует запрошенной поверхности.

lpContext

Адрес caller-определенной структуры, переданной члену при каждом вызове.



EnumModesCallback


HRESULT WINAPI lpEnumModesCallback (LPDDSURFACEDESC lpDDSurfaceDesc,

LPVOID lpContext);

Определенная прикладная программой процедура callback для IDirectDraw2:: EnumDisplayModes.

Возвращает DDENUMRET_OK, чтобы продолжить перечисление, или DDENUMRET_CANCEL, чтобы остановить его.

lpDDSurfaceDesc

Адрес структуры DDSURFACEDESC, которая обеспечивает частоту монитора и режим который может быть создан. Эти данные только для чтения.

lpContext

Адрес caller-определенной структуры, которая будет передана к функции callback каждый раз, когда функция  вызывается.



FnCallback


HRESULT WINAPI lpfnCallback (LPDIRECTDRAWSURFACE lpDDSurface,

LPVOID lpContext);

Определенная прикладной программой процедура callback для IDirectDrawSurface:: EnumOverlayZOrders.

Возвращает DDENUMRET_OK, чтобы продолжить перечисление, или DDENUMRET_CANCEL, чтобы остановить его.

lpDDSurface

Адрес поверхности, являющейся оверлеем на этой поверхности.

lpContext

Адрес определяемого пользователем контекста, определенного пользователем.



FourCC YUV режим


// любой YUV цвет, где Y - между 100 и 110 и U

//or V - между 50, и 55 прозрачны

dwColorSpaceLowValue = YUVQUAD(100,50,50);

dwColorSpaceHighValue = YUVQUAD(110,55,55);

Переключающиеся поверхности и количество фреймов GDI

DirectDraw расширил понятие переключающейся  поверхности, которая теперь больше, чем видимая поверхность. Теперь любая поверхность может быть создана как переключающаяся. Этот подход имеет много преимуществ над традиционным, ограниченным контекстом переключающейся страницы.

При вызове IDirectDrawSurface::Flip, поверхности, связанные с DirectDrawSurface переключаются. Поверхности, присоединенные к объектам DirectDrawSurface не изменяются. Например, в ситуации с двойным буфером, программа, рисующая в обратный буфер всегда использует тот же самый объект DirectDrawSurface. Поверхностьбудет переключена на передний буфер, когда вызовется метод  IDirectDrawSurface::Flip.

Если передний буфер видим, потому что он первичная поверхность или оверлей, который является в настоящее время видимым, при обращение к обратному буферу методами IDirectDrawSurface::Lock или IDirectDrawSurface:: Blt, будет возвращаться с значением возврата DDERR_WASSTILLDRAWING, пока не произойдет следующая вертикальная регенерация. Это происходит, потому что предыдущая поверхностная память переднего буфера, которая больше не присоединена к обратному буферу, все еще выводится на физический дисплей аппаратными средствами. Эта ситуация исчезает в течение следующей вертикальной регенерации, потому что аппаратные средства, которые модифицируют физический дисплей, повторно читают память дисплея на каждой регенерации.

Это физическое требование делает вызов IDirectDrawSurface::Flip на видимых поверхностях асинхронной командой. Хорошо при построении игр, например, выполнить все не-визуальные элементы игры после того, как этот метод вызыван. Когда ввод, звук и операции с рисованием в памяти системы был завершены, начинают выполняться задачи, которые требуют получения доступа к видимым обратным буферам.


Когда ваша прикладная программа должна выполниться в окне и все еще требует переключающейся среды, DirectDraw будет пытаться создать переключающуюся оверлейную поверхность. Если аппаратные средства не поддерживают оверлеи, Вы можете создать основную поверхность с переключающимися страницами, и когда поверхность, о чем GDI не знает,  собирается стать первичной поверхностью, blit содержится в основной  поверхности, а GDI записывает в буфер, который собирается стать видимым. Это занимеат не много времени , потому что blits выполняется асинхронно. Это может, однако, потреблять значительную blitter bandwidth, которая зависит от экранной разрешающей способности и размера окна, которое переключается. Когда число кадров в секунду не опускается ниже 20 fps, GDI действует правильно.

Прежде, чем Вы инициализируете объект DirectDraw, GDI уже используете вашу память дисплея для отображения. Когда Вы вызываете DirectDraw к инициализированию основной  поверхности, адрес памяти той поверхности будет  использовать также и GDI.

Если Вы создаете сложную поверхность с обратным буфером, GDI сначала укажет на память дисплея для основной поверхности. После этого GDI не имеет никакой информации относительно DirectDraw и продолжит действовать на этой поверхности, даже если Вы ее переключили, и это теперь невидимый обратный буфер.

Много прикладных программ начинают с создания одного большого окна, которое покрывает весь экран. Как только ваша прикладная программа активна и имеет фокус, GDI не будет пытаться писать в копию буфера, так как ничто не требует перерисовки.

Всегда необходимо помнить, что знает GDI только относительно первоначальной поверхности, и никогда не знает, - в настоящее время это первичная поверхность или обратный буфер. Если Вы не нуждаетесь в GDI экране, используйте вышеупомянутую методику. Если Вы нуждаетесь в GDI, Вы можете пробовать эту методику:

Создать первичную поверхность с двумя обратными буферами.

Blit начальную первичную поверхность (GDI поверхность) на средний обратный буфер.

Flip (NULL) чтобы поместить GDI на последнее место и сделать вашу начальную копию видимой.

После того, как Вы сделали это, копируйте с буфера GDI на средний буфер, выведите то, что Вы хотите чтобы  пользователь видел на том буфере, затем используйте код ниже, который хранит GDI безопасно в нижней части и колеблется между другими двумя буферами.

рPrimary- > Flip (pMiddle)


Функции


Две из функций DirectDraw инициализируют контроль над памятью дисплея через интерфейс IDirectDraw. Первая функция  DirectDrawCreate, создает образец объекта DirectDraw, который представляет специфическую часть аппаратных средств дисплея. Вторая функция, DirectDrawEnumerate, получает список всех объектов DirectDraw, установленных в системе. Эти функции - механизмы DirectDraw использования, чтобы поддерживать разнообразные части аппаратных средств дисплея. Чтобы поддерживать многочисленные устройства дисплея, ваша прикладная программа только выбирает специфический объект DirectDraw и инициализирует его.

Третья функция, DirectDrawCreateClipper, создает образец DirectDraw ограничителя, который непосредственно не принадлежит объекту DirectDraw, и может быть разделен между многими объектами драйвера.



Возможности поверхностей 


Возможности поверхностей             GetCaps        

                       

Ограничители поверхностей           GetClipper     


Все интерфейсы COM наследуют методы


Все интерфейсы COM наследуют методы интерфейса IUnknown, которые перечислены в группе “IUnknown” выше. Эти три метода позволяют дополнительным интерфейсам быть добавленными к объекту DirectDraw без того, чтобы воздействовать на функциональные возможности первоначального интерфейса.


Группы методов интерфейса IDirectDraw


Прикладные программы используют методы интерфейса IDirectDraw, чтобы создать объекты DirectDraw и работать с переменными уровня системы. Методы могут быть собраны в следующие группы:

Распределение памяти         Compact        



Группы методов интерфейса IDirectDrawClipper


Прикладные программы используют методы интерфейса IDirectDraw, чтобы создавать объекты DirectDraw и для работы с переменными уровня системы. Методы могут быть организованы в следующие группы:

Распределение памяти         Initialize        

                       

Списки отсекания      IsClipListChanged     



Группы методов интерфейса IDirectDrawPalette


Прикладные программы используют методы интерфейса IDirectDrawPalette, чтобы создавать объекты DirectDrawPalette и для работы с переменными уровня системы. Методы могут быть организованы в следующие группы:

Распределение памяти         Initialize        

                       

IUnknown        AddRef          



Группы методов интерфейса IDirectDrawSurface


Прикладные программы используют методы интерфейса IDirectDrawSurface для создания объектов DirectDrawSurface и работы с переменными уровня системы. Методы могут быть собраны в следующие группы:

Распределение памяти         Initialize        



HRESULT AddAttachedSurface (


LPDIRECTDRAWSURFACE lpDDSAttachedSurface);

Присоединяет поверхность к другой поверхности.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:



HRESULT Flip(


LPDIRECTDRAWSURFACE lpDDSurfaceTargetOverride,

DWORD

dwFlags);

Делает поверхностную память, связанную с поверхностью DDSCAPS_BACKBUFFER,  связанной с передней буферной поверхностью.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_GENERIC         DDERR_INVALIDOBJECT      

DDERR_INVALIDPARAMS       DDERR_NOTFLIPPABLE        

DDERR_NOFLIPHW     DDERR_SURFACEBUSY        

DDERR_SURFACELOST            DDERR_WASSTILLDRAWING           



HRESULT GetClipper (


LPDIRECTDRAWCLIPPER FAR * lplpDDClipper);

Возвращает DirectDrawClipper, связанный с этой поверхностью. Возвращается ошибка , если никакой DirectDrawClipper не связан.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    



HRESULT GetGDISurface (


LPDIRECTDRAWSURFACE FAR * lplpGDIDDSSurface);

Возвращает объект DirectDrawSurface, который в настоящее время представляет поверхностную память,  обрабатываемую GDI как первичная поверхность.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    



HRESULT GetPalette (


LPDIRECTDRAWPALETTE FAR * lplpDDPalette);

Возвращает структуру DirectDrawPalette, связанную с этой поверхностью.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_GENERIC         DDERR_INVALIDOBJECT      

DDERR_INVALIDPARAMS       DDERR_NOEXCLUSIVEMODE           

DDERR_NOPALETTEATTACHED           DDERR_SURFACELOST         



HRESULT WINAPI lpEnumSurfacesCallback (


LPDIRECTDRAWSURFACE lpDDSurface,

LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext);

Определенная прикладная программой процедура callback для IDirectDrawSurface:: EnumAttachedSurfaces.

Возвращает DDENUMRET_OK, чтобы продолжить перечисление, или DDENUMRET_CANCEL, чтобы остановить его.

lpDDSurface

Адрес поверхности, присоединенной к этой поверхности.

lpDDSurfaceDesc

Адрес структуры DDSURFACEDESC, которая описывает присоединенную поверхность.

lpContext

Адрес определяемого пользователем контекста, определенного пользователем.



IDirectDraw:: AddRef


ULONG

AddRef ();

Увеличивает счет ссылки объекта DirectDraw на 1. Этот метод - часть интерфейса IUnknown, унаследованного DirectDraw.

Возвращает новый счет ссылки объекта.

Когда объект DirectDraw создан, счет ссылки установлен в 1. Каждый раз, когда прикладная программа получает интерфейс к объекту или вызывает AddRef метод, счет ссылки объекта увеличивается на 1. Используйте IDirectDraw::Release, чтобы уменьшить счет ссылки объекта на 1.

См. также IDirectDraw:: Initialize, IDirectDraw:: QueryInterface, IDirectDraw:: Release



IDirectDraw:: Compact


HRESULT

Compact ();

В настоящее время этот метод не выполнен.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    

DDERR_SURFACEBUSY           DDERR_NOEXCLUSIVEMODE           

Этот метод перемещает все части поверхностной памяти на плате дисплея в непрерывный блок, чтобы сделать самое большое место из свободной доступной памяти. Это обращение будет терпеть неудачу, если любые операции находятся в прогрессе.

Прикладная программа, вызывающая этот метод должна иметь совместный(кооперативный) уровень установленный в исключительный.



IDirectDraw:: CreateClipper


HRESULT CreateClipper(DWORD dwFlags,

LPDIRECTDRAWCLIPPER FAR * lplpDDClipper,

IUnknown FAR * pUnkOuter);

Создает объект DirectDrawClipper.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:          

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    

DDERR_OUTOFMEMORY         DDERR_NOCOOPERATIVELEVELSET            

dwFlags

Этот параметр в настоящее время не используется и должен быть установлен в 0.

lplpDDClipper

Адрес указателя, который будет заполнен с адресом нового объекта DirectDrawClipper, если IDirectDraw:: CreateClipper успешен.

pUnkOuter

Учитывает будущую совместимость с COM особенностями соединения частей. Сейчас IDirectDraw:: CreateClipper возвратит ошибку, если этот параметр не NULL.

Объект DirectDrawClipper может быть присоединен к DirectDrawSurface и использоваться в течение операций  IDirectDrawSurface::Blt, IDirectDrawSurface::BltBatch, и IDirectDrawSurface::UpdateOverlay

Чтобы создать объект DirectDrawClipper, который не принадлежит специфическому объекту DirectDraw, используйте функцию DirectDrawCreateClipper.



IDirectDraw:: CreatePalette


HRESULT CreatePalette(DWORD dwFlags,

LPPALETTEENTRY lpColorTable,

LPDIRECTDRAWPALETTE FAR * lplpDDPalette,

IUnknown FAR * pUnkOuter);

Создает объект DirectDrawPalette для этого объекта DirectDraw.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_NOEXCLUSIVEMODE           

DDERR_INVALIDPARAMS       DDERR_NOCOOPERATIVELEVELSET            

DDERR_OUTOFCAPS  DDERR_OUTOFMEMORY      



IDirectDraw:: CreateSurface


HRESULT CreateSurface (LPDDSURFACEDESC lpDDSurfaceDesc,

LPDIRECTDRAWSURFACE FAR * lplpDDSurface,

IUnknown FAR * pUnkOuter);

Создает объект DirectDrawSurface для этого объекта DirectDraw.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:



IDirectDraw:: DuplicateSurface


HRESULT DuplicateSurface (LPDIRECTDRAWSURFACE lpDDSurface,

LPLPDIRECTDRAWSURFACE FAR * lplpDupDDSurface);

Дублирует DirectDrawSurface.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_CANTDUPLICATE        DDERR_INVALIDOBJECT      

DDERR_INVALIDPARAMS       DDERR_OUTOFMEMORY      



IDirectDraw:: EnumSurfaces


HRESULT

EnumSurfaces (DWORD

dwFlags,

LPDDSURFACEDESC lpDDSD, LPVOID

lpContext,

LPDDENUMSURFACESCALLBACk lpEnumCallback);

Перечисляет все существующие или возможные поверхности, которые отвечают определенному критерию поиска.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    

dwFlags



IDirectDraw:: FlipToGDISurface


HRESULT FlipToGDISurface ();

Делает поверхность, в которую пишет GDI, первичной поверхностью.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    



IDirectDraw:: GetCaps


HRESULT

GetCaps (LPDDCAPS lpDDDriverCaps,

LPDDCAPS lpDDHELCaps);

Заполняет возможности драйвера устройства для аппаратных средств и аппаратного уровня эмуляции (HEL).

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    

lpDDDriverCaps

Адрес DDCAPS структуры для заполнения возможностями аппаратных средств, как сообщено драйвером устройства.

lpDDHELCaps

Адрес структуры DDCAPS для заполнения возможностями HEL.

См. также DDCAPS



IDirectDraw:: GetDisplayMode


HRESULT GetDisplayMode (LPDDSURFACEDESC lpDDSurfaceDesc);

Возвращает текущий режим дисплея.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    



IDirectDraw:: GetFourCCCodes


HRESULT

GetFourCCCodes (LPDWORD

lpNumCodes,

LPDWORD lpCodes);

Возвращает коды FourCCCodes, поддерживаемые объектом DirectDraw. IDirectDraw:: GetFourCCCodes может также возвращать число поддерживаемых кодов.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    

lpNumCodes

Адрес двойного слова, которое содержит число элементов массива lpCodes. Если число элементов слишком мало, чтобы разместить все коды, lpNumCodes будет содержать требуемое число, и массив lpCodes будет заполнен.

lpCodes

Адрес массива двойных слов, который будет заполнен кодами FourCC, поддерживаемых этим объектом DirectDraw. Если передан NULL, lpNumCodes будет содержать число поддерживаемных FourCC кодов.



IDirectDraw:: GetMonitorFrequency


HRESULT

GetMonitorFrequency (LPDWORD

lpdwFrequency);

Возвращает частоту монитора,  управляемого объектом DirectDraw. Значение частоты возвращено в Hz, умноженном на 100. Например, 60Hz возвращается как 6000.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    



IDirectDraw:: GetScanLine


HRESULT

GetScanLine (LPDWORD

lpdwScanLine);

Возвращает линию сканирования, которая в настоящее время рисуется на мониторе.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    

DDERR_UNSUPPORTED          DDERR_VERTICALBLANKINPROGRESS        

lpdwScanLine

Адрес двойного слова, содержащего сканирующую строку.

См. также IDirectDraw:: GetVerticalBlankStatus, IDirectDraw:: WaitForVerticalBlank



IDirectDraw:: GetVerticalBlankStatus


HRESULT GetVerticalBlankStatus (LPBOOL lpbIsInVB);

Возвращает состояние вертикального пробела.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    

lpbIsInVB

Адрес BOOL, который будет заполнен состоянием вертикального пробела.

Этот метод устанавливается в TRUE, если встречается вертикальный пробел или иначе FALSE. Чтобы синхронизировать с вертикальным пробелом, используйте метод IDirectDraw:: WaitForVerticalBlank.



IDirectDraw:: Initialize


HRESULT

Initialize(GUID FAR * lpGUID);

Инициализирует объект DirectDraw.



IDirectDraw:: QueryInterface


HRESULT QueryInterface(REFIID riid, LPVOID FAR * ppvObj);

Определяет, поддерживает ли объект DirectDraw COM интерфейс. Если он это делает, система увеличивает счет ссылки на объект, и прикладная программа может начинать использовать этот интерфейс немедленно. Этот метод - часть интерфейса IUnknown, унаследованного DirectDraw.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    

riid

Идентификатор ссылки запрашиваемого интерфейса.

ppvObj

Адрес указателя будет заполнен указателем интерфейса, если запрос успешен.

Если прикладная программа не должна использовать интерфейс, установленный обращением к этому методу, она должна вызвать метод Release для того интерфейса, чтобы освободить его. Метод IDirectDraw:: QueryInterface позволяет объектам DirectDraw быть расширенными Microsoft и третьими лицами без столкновения с существующими или будущими функциональными возможностями каждого элемента.



IDirectDraw:: Release


ULONG

Release();

Уменьшает счет ссылки объекта DirectDraw на 1. Этот метод - часть интерфейса IUnknown, унаследованного DirectDraw.

Возвращает новый счет ссылки объекта.

Объект DirectDraw освобождает себя, когда счет ссылки достигает 0. Используйте  метод IDirectDraw:: AddRef, чтобы увеличить счет ссылки объекта на 1.

См. также IDirectDraw:: AddRef, IDirectDraw:: QueryInterface, IDirectDraw:: Initialize



IDirectDraw:: RestoreDisplayMode


HRESULT

RestoreDisplayMode ();

Сбрасывает режим аппаратных средств устройства дисплея для первичной поверхности на предшествующий вызову метода IDirectDraw2:: SetDisplayMode.Требуется уровень исключительного доступа , чтобы использовать этот метод.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_GENERIC         DDERR_INVALIDOBJECT      

DDERR_INVALIDPARAMS       DDERR_LOCKEDSURFACES  



IDirectDraw:: SetCooperativeLevel


HRESULT

SetCooperativeLevel (HWND hWnd, DWORD

dwFlags);

Определяет высокопоставленное поведение прикладной программы.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_HWNDALREADYSET    DDERR_INVALIDPARAMS    

DDERR_HWNDSUBCLASSED  DDERR_INVALIDOBJECT      

DDERR_EXCLUSIVEMODEALREADYSET          DDERR_OUTOFMEMORY      

hWnd

Определяет программу обработки окна, используемую для прикладной программы.

dwFlags



IDirectDraw:: WaitForVerticalBlank


HRESULT WaitForVerticalBlank (DWORD dwFlags,

HANDLE hEvent);

Помогает вызывающему синхронизировать себя с вертикальным пустым интервалом (ожидание вертикального синхроимпульса).

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    

DDERR_UNSUPPORTED          DDERR_WASSTILLDRAWING           

dwFlags

Определяет, как долго ждать вертикальный пробел.



IDirectDraw2:: EnumDisplayModes


HRESULT EnumDisplayModes (DWORD dwFlags,

LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext,

LPDDENUMMODESCALLBACK lpEnumModesCallback);

Перечисляет все режимы дисплея, которые аппаратные средства поддерживают через объект DirectDraw, которые являются совместимыми с обеспечиваемым поверхностным описанием. Если передан NULL для поверхностного описания, все выставленные режимы будут перечислены.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    

dwFlags



IDirectDraw2:: GetAvailableVidMem


HRESULT GetAvailableVidMem (LPDDSCAPS lpDDSCaps,

LPDWORD lpdwTotal, LPDWORD lpdwFree);

Возвращает общую сумму доступной памяти дисплея и количество свободной памяти дисплея в настоящее время. Если передан NULL или  lpdwTotal или lpdwFree , значение для этого параметра не возвращается.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_NODIRECTDRAWHW           

DDERR_INVALIDPARAMS       DDERR_INVALIDCAPS          

lpDDSCaps

Адрес структуры DDSCAPS, которая содержит аппаратные возможности поверхности.

lpdwTotal

Адрес двойного слова, которое будет заполнено общей суммой доступной памяти дисплея.

lpdwFree

Адрес двойного слова, которое будет заполнено количеством свободной памяти дисплея в настоящее время .

Следующий пример на C ++ показывает использование IDirectDraw2:: GetAvailableVidMem, чтобы определить и общее количество и свободную память дисплея, доступную для поверхностей карты текстуры:

LPDIRECTDRAW2 lpDD2;

DDSCAPS ddsCaps;

DWORD dwTotal;

DWORD dwFree;

ddres = lpDD->QueryInterface(IID_IDirectDraw2,

&lpDD2); if (FAILED(ddres))

                         ...

ddsCaps.dwCaps = DDSCAPS_TEXTURE;

ddres = lpDD2->GetAvailableVidMem(&ddsCaps,

&dwTotal, &dwFree);

if

(FAILED(ddres))

                ...

Этот метод дает только текущее состояние памяти дисплея. Количество свободной памяти дисплея подчинено изменению, поскольку поверхности создаются и разрушаются. Следовательно, свободное значение памяти должно использоваться только как грубая оценка. Кроме того, специфическая плата адаптера дисплея не может делать никакого различия между двумя различными типами памяти. Например, она может использовать ту же самую часть памяти дисплея, чтобы хранить z-буфера и текстуры. Следовательно, распределение одного типа поверхности (например, z-буфера) может воздействовать на количество памяти дисплея, доступной для другого типа поверхности (например, текстуры). Следовательно, самое лучшее - это сначала распределить фиксированные ресурсы прикладной программы (типа переднего, обратного и z-буферов) перед определением сколько памяти доступно для динамического использования (типа отображения текстуры).

Чтобы гарантировать согласованность с COM интерфейсом, этот метод - не,  член интерфейса IDirectDraw, но - часть интерфейса IDirectDraw2. Чтобы использовать этот метод, Вы должны сначала сделать запрос для интерфейса IDirectDraw2. Для большего количества информации, см. Интерфейс IDirectDraw2.



IDirectDraw2:: SetDisplayMode


HRESULT SetDisplayMode (DWORD dwWidth, DWORD dwHeight,

DWORD dwBPP, DWORD dwRefreshRate, DWORD dwFlags);

Устанавливает режим аппаратных средств устройства дисплея.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_GENERIC         DDERR_INVALIDMODE        

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    

DDERR_LOCKEDSURFACES     DDERR_NOEXCLUSIVEMODE           

DDERR_SURFACEBUSY           DDERR_UNSUPPORTED       

DDERR_UNSUPPORTEDMODE            DDERR_WASSTILLDRAWING           

dwWidth

Определяет ширину нового режима.

dwHeight

Определяет высоту нового режима.

dwBPP

Определяет биты на пиксель нового режима.

dwRefreshRate

Определяет частоту регенерации нового режима. Если этот параметр установлен в 0, используется версия интерфейса IDirectDraw этого метода.

dwFlags

Этот параметр в настоящее время не используется и должен быть установлен в 0.

Должен использоваться метод IDirectDraw:: SetCooperativeLevel , чтобы установить исключительный доступ уровня прежде, чем изменять режим. Если другие прикладные программы создали объект DirectDrawSurface на основной поверхности, и режим изменен, основные поверхностные объекты тех прикладных программ возвратят DDERR_SURFACELOST.

Чтобы гарантировать совместимость с COM , этот метод - не, часть интерфейса IDirectDraw, но принадлежит интерфейсу IDirectDraw2. Чтобы использовать этот метод, Вы должны сначала сделать запрос для интерфейса IDirectDraw2. Для большего количества информации, см. Интерфейс IDirectDraw2.

См. также IDirectDraw:: RestoreDisplayMode, IDirectDraw:: GetDisplayMode, IDirectDraw2:: EnumDisplayModes, IDirectDraw:: SetCooperativeLevel



IDirectDrawClipper:: AddRef


ULONG

AddRef ();

Увеличивает счет ссылки объекта DirectDrawClipper на 1. Этот метод - часть интерфейса IUnknown, унаследованного DirectDraw.

Возвращает новый счет ссылки объекта.

Когда объект DirectDraw создан, счет ссылки установлен в 1. Каждый раз когда прикладная программа получает интерфейс к объекту или вызывает AddRef, счет ссылки объекта увеличивается на 1. Используйте IDirectDrawClipper::Release , чтобы уменьшить счет ссылки объекта на 1.

См. также IDirectDraw:: CreateClipper, IDirectDrawClipper:: Initialize, IDirectDrawClipper:: QueryInterface, IDirectDrawClipper:: Release



IDirectDrawClipper:: GetClipList


HRESULT GetClipList (LPRECT lpRect,

LPRGNDATA lpClipList, LPDWORD lpdwSize);

Возвращает копию отсекающегося списка, связанного с объектом DirectDrawClipper. Может быть выбрано подмножество отсекающегося списка,  передавая прямоугольник, который отсекает отсекающийся список.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_GENERIC         DDERR_INVALIDCLIPLIST   

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    

DDERR_NOCLIPLIST    DDERR_REGIONTOOSMALL  

lpRect

Адрес прямоугольника, который будет использоваться, чтобы отсечь отсекающийся список.

lpClipList

Адрес структуры RGNDATA, которая будет содержать возникающую в результате копию отсекающегося списка.

lpdwSize

Установите IDirectDrawClipper:: GetClipList, чтобы указат размер возникающего в результате отсекания списка.



IDirectDrawClipper:: GetHWnd


HRESULT

GetHWnd (HWND FAR * lphWnd);

Возвращает hWnd, предварительно связанный с этим объектом DirectDrawClipper методом IDirectDrawClipper:: SetHWnd.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    

lphWnd

Адрес hWnd, предварительно связанного с этим DirectDrawClipper методом IDirectDrawClipper:: SetHWnd.



IDirectDrawClipper:: Initialize


HRESULT Initialize (LPDIRECTDRAW lpDD, DWORD dwFlags);

Инициализирует DirectDrawClipper.



IDirectDrawClipper:: IsClipListChanged


HRESULT

IsClipListChanged (BOOL

FAR * lpbChanged);

Контролирует состояние отсекающегося списка, если hWnd связан с DirectDrawClipper.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    

lpbChanged

Адрес Boolean переменной. Возвращается TRUE, если отсекающийся список изменился.



IDirectDrawClipper:: QueryInterface


HRESULT QueryInterface (REFIID riid, LPVOID FAR * ppvObj);

Определяет, поддерживает ли объект DirectDrawClipper COM интерфейс. Если поддерживает, то система увеличивает значение ссылки на объект, и прикладная программа может начинать использовать тот интерфейс. Этот метод - часть интерфейса IUnknown, унаследованного DirectDraw.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    

riid

Идентификатор ссылки запрашиваемого интерфейса.

ppvObj

Адрес указателя, который получает указатель интерфейса если запрос успешен.

Если прикладной программе не нужно использовать интерфейс, восстановленный обращением к этому методу, она должна вызвать метод Release для этого интерфейса, чтобы освободить его. IDirectDrawClipper:: QueryInterface позволяет объектам DirectDrawClipper быть расширенным Microsoft и третьими лицами без столкновения с существующими или будущими функциональными возможностями.

См. также IDirectDrawClipper:: AddRef, IDirectDrawClipper:: Release, IDirectDrawClipper:: Initialize



IDirectDrawClipper:: Release


ULONG

Release ();

Уменьшает счет ссылки объекта DirectDrawClipper на 1. Этот метод - часть интерфейса IUnknown, унаследованного DirectDraw.

Возвращает новый счет ссылки объекта.

Объект DirectDrawClipper освобождает себя, когда счет ссылки достигает 0. Используйте метод IDirectDrawClipper:: AddRef, чтобы увеличить счет ссылки объекта на 1.

См. также IDirectDrawClipper:: AddRef, IDirectDrawClipper:: Initialize, IDirectDrawClipper:: QueryInterface



IDirectDrawClipper:: SetClipList


HRESULT SetClipList (LPRGNDATA lpClipList, DWORD dwFlags);

Устанавливает или удаляет отсекающийся список, используемый IDirectDrawSurface:: Blt, IDirectDrawSurface:: BltBatch, и IDirectDrawSurface:: UpdateOverlay на поверхностях, к которым присоединен родительский DirectDrawClipper.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_CLIPPERISUSINGHWND     

DDERR_INVALIDPARAMS       DDERR_INVALIDCLIPLIST   



IDirectDrawClipper:: SetHWnd


HRESULT SetHWnd (DWORD dwFlags, HWND hWnd);

Устанавливает hWnd, который получает информацию отсечения.

Возвращает DD_OK если успешно, или одно из следующих значений ошибки:

DDERR_INVALIDOBJECT         DDERR_INVALIDPARAMS    

DDERR_INVALIDCLIPLIST      DDERR_OUTOFMEMORY      

dwFlags

Этот параметр не используется внастоящее время и должен быть установлен в 0.

hWnd

HWnd, который получает информацию отсечения.



IDirectDrawPalette:: AddRef


ULONG

AddRef ();

Увеличивает счет ссылки объекта DirectDrawPalette на 1. Этот метод - часть интерфейса IUnknown, унаследованного DirectDraw.

Возвращает новый счет ссылки объекта.

Когда объект DirectDraw создан, счет ссылки установлен в 1. Каждый раз когда прикладная программа получает интерфейс к объекту или вызывает AddRef, счет ссылки объекта увеличивается на 1. Используйте IDirectDrawPalette::Release чтобы уменьшить счет ссылки объекта на 1.

См. также IDirectDrawPalette:: Initialize, IDirectDrawPalette:: QueryInterface, IDirectDrawPalette:: Release