Доступ к буферу изображения
Объекты 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