Ddraw setdisplaymode ошибка как исправить

Советы и рекомендации

В этом разделе рассматривается несколько не связанных друг с другом, но полезных тем. Сначала мы поговорим об одной ошибке DirectDraw, а затем узнаем кое-что о файлах DirectX. Напоследок я скажу пару слов о видеокартах на базе чипов 3Dfx.

Ошибка переключения режимов DirectDraw

В DirectDraw есть одна ошибка, связанная с переключением режимов, которую никак не может исправить Microsoft (или тот, кто для них пишет видеодрайверы). Впервые я столкнулся с ней во время работы над предыдущей книгой. Я надеялся, что к моменту написания этой книги ошибку уже исправят, но она так и осталась.

Проблемы возникают при активизации видеорежимов, которые отличаются по глубине пикселей от текущего активного режима Windows. Например, если Windows работает в 8-битном видеорежиме, а ваше приложение DirectDraw попытается активизировать 16-битный видеорежим, ничего не получится, даже когда новый режим вполне допустим. Если попытаться установить 8-битный видеорежим при 16-битном режиме Windows, результат будет тем же. В таких случаях DirectX выдает отладочное сообщение следующего вида:

DDHEL: ChangeDisplaySettings LIED!!!
DDHEL: Wanted 640x480x16 got 1024x768x8
DDHEL: ChangeDisplaySettings FAILED: returned -1

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

Такой обходной маневр нетрудно реализовать с помощью класса DirectDrawWin, представленного в этой книге. В функции SelectInitialDisplayMode() (которая вызывается до переключения видеорежима) следует проверить глубину пикселей текущего режима. Если она отличается от требуемой, выполните «фиктивное» переключение. Программа может выглядеть так:

int SampleWin::SelectInitialDisplayMode()
{
    DWORD curdepth = GetDisplayDepth();
    int i, nummodes = GetNumDisplayModes();
    DWORD w,h,d;

    if (curdepth != 16)
    ddraw2->SetDisplayMode(640, 480, curdepth, 0, 0);
    // Искать режим 640x480x16 после смены видеорежима
    for (i = 0;i < nummodes; i++)
    {
        GetDisplayModeDimensions(i, w, h, d);
        if (w == 640 && h == 480 && d == 16)
            return i;
    }

    return -1;
}

Мы проверяем глубину пикселей текущего видеорежима Windows функцией DirectDrawWin::GetDisplayDepth(). Нас интересует режим с 16-битными пикселями, поэтому при использовании другой глубины мы активизируем режим 640×480 с текущей глубиной, вызывая функцию SetDisplayMode() интерфейса DirectDraw. Затем можно переходить к поиску нужного режима в традиционном цикле.

Другой выход — просто воспользоваться той глубиной пикселей, которая в данный момент установлена в Windows. Этот вариант не подойдет в тех случаях, когда работа программы зависит от определенных параметров видеорежима, но неплохо работает, если приложение поддерживает видеорежимы с различными глубинами пикселей. В частности, он встречается в программе Switch (см. главу 4), разработанной специально для поддержки любого режима. Функция SelectInitialDisplayMode() в программе Switch выглядит так:

int SwitchWin::SelectInitialDisplayMode()
{
    DWORD curdepth = GetDisplayDepth();
    int i, nummodes = GetNumDisplayModes();
    DWORD w,h,d;

    // Искать режим 640x480 с текущей глубиной пикселей
    for (i = 0;i < nummodes; i++)
    {
        GetDisplayModeDimensions(i, w, h, d);
        if (w == 640 && h == 480 && d == curdepth)
            return i;
    }

    return 0;
}

Эта функция ищет режим 640×480 с текущей глубиной пикселей. Такой режим наверняка найдется, потому что 640×480 — «общий знаменатель» для всех видеорежимов и нам известно, что нужная глубина пикселей уже установлена в Windows.

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

Символическая константа INITGUID (устаревшая)

Как вы уже знаете, библиотека DirectX построена на базе спецификации COM, а для однозначной и систематизированной идентификации интерфейсов в COM применяются GUID. Один из заголовочных файлов COM содержит код, в котором инициализируются все конструкции, относящиеся к GUID. Такой метод инициализации COM требует, чтобы символическая константа INITGUID была определена в одном и только одном кодовом модуле, до включения заголовочных файлов COM (для DirectX заголовочные файлы COM включаются косвенно, из заголовочных файлов DirectX). Следовательно, в некоторых программах можно встретить константу INITGUID. Этот метод вызывает немало хлопот, особенно при работе с прекомпилированными заголовками, потому что он не позволяет включить заголовочные файлы DirectX в состав прекомпилированного заголовка.

Вы не встретите INITGUID в программах на CD-ROM, потому что, начиная с DirectX 3, появилось более удачное решение — вместо того, чтобы определять INITGUID, достаточно подключить к проекту файл DXGUID.LIB. На случай, если вы не знали…

Эмуляция версий

Одна из широко разрекламированных возможностей COM — управление версиями. COM-объекты устроены так, что доступ к ним может осуществляться только через строго определенные интерфейсы. В соответствии с правилами COM, интерфейс не может изменяться после его определения. Вместо этого приходится вводить новый интерфейс, который поддерживает как старые, так и новые возможности. При этом новые программы могут без опасений пользоваться новыми возможностями, а старые — работать со старыми интерфейсами, которые заведомо не изменятся. Эта схема неплохо работает и помогает обеспечить совместимость приложений DirectX со старыми и новыми runtime-частями библиотеки.

К сожалению, в DirectX API часто используются структуры. Эти структуры являются «открытыми» — доступ к ним осуществляется непосредственно, а не через интерфейс, как для COM-объектов. Размер этих структур может изменяться (и часто изменяется) при переходе к новой версии DirectX. По этой причине каждая функция DirectX, которой в качестве аргумента передается указатель на структуру, должна обязательно получать и размер передаваемой структуры. Благодаря этому runtime-часть DirectX всегда может узнать, какая версия DirectX SDK применялась для компиляции приложения, и следовательно — какие поля входят в структуру. Проблема решена, не так ли?

А что вы скажете насчет программы, которая была откомпилирована в DirectX 5 SDK, но затем запущена с runtime-частью DirectX 3? Если одна или несколько структур DirectX 5 были дополнены новыми полями и флагами, runtime-часть не сможет обработать эту структуру, потому что ничего не знает о появившихся в ней расширениях.

К решению этой проблемы (которую мы ласково назовем «структурной ошибкой DirectX») можно подойти четырьмя способами:

  • поставлять нужную runtime-часть DirectX вместе с продуктом и настаивать на том, чтобы она устанавливалась на компьютерах со старыми версиями;
  • написать «умный» код, который проверяет версию установленных DLL и затем использует только структуры, поддерживаемые runtime-частью;
  • выбрать самую старую версию runtime-части, поддерживаемую вашей программой, и написать код в расчете на нее;
  • отказаться от технологии и всего, что с ней связано.

Коммерческие программы (особенно пакеты, распространяемые на CD-ROM) в основном используют первый вариант. Он прост и позволяет всегда работать с новейшими возможностями DirectX. С другой стороны, runtime-часть DirectX 5 занимает 135 Мбайт. Это значит, что для настоящего продукта на CD-ROM остается меньше места, или вам придется поставлять дополнительный диск с DirectX. Разумеется, этот вариант не подходит для приложений, распространяемых без CD-ROM или через Internet.

Второй вариант достаточно гибок и позволяет запустить приложение практически с любой runtime-частью, но дело это, мягко говоря, хлопотное. Обычно игра не стоит свеч — даже если вы сможете обнаружить старую runtime-часть, как компенсировать отсутствие новых возможностей? Кончится тем, что для старой версии вы будете выводить сообщение, предлагая пользователю достать новую версию DirectX.

Третий вариант удобен, если вы не можете выбрать первый вариант и не жалеете, что лишились новых возможностей (или не особенно нуждаетесь в них). Выбирая этот вариант, следует учесть, что заголовочные файлы DirectX способны эмулировать более старые версии SDK. Следовательно, вам не придется держать старый SDK под рукой.

Каждый компонент DirectX определяет номер версии и пользуется им в заголовочном файле. Для DirectDraw этой цели служит символическая константа DIRECTDRAW_VERSION. Например, в DirectX 3 SDK константа DIRECTDRAW_VERSION равна 0x0300 (завершающие нули обозначают младший номер версии).

Обычно с помощью константы DIRECTDRAW_VERSION программа выясняет, какая версия DirectX используется в данном случае. Но что еще важнее, если вы зададите значение DIRECTDRAW_VERSION перед тем, как включать заголовочный файл DirectDraw, то в этом файле будут определены структуры, совместимые с указанным номером версии. Например, если ваша программа выглядит так:

#define DIRECTDRAW_VERSION 0x300
#include <ddraw.h>

то определяемые структуры будут идентичны тем, что определялись в DirectX 3 SDK, даже если на самом деле вы работаете с DirectX 5 SDK.

Вариант 4 выглядит соблазнительно (но я слишком люблю играть в Quake).

Сайт управляется системой uCoz

Некоторые пользователи Windows 10 сталкиваются с ошибкой DirectDraw 16385 (или другим кодом ошибки) при попытке играть в устаревшие игры, такие как Diablo, Diablo II или Age of Empires, на компьютере с Windows 10.

Ошибка DirectDraw в Windows 10

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

  • Игра работает в полноэкранном режиме. Имейте в виду, что для многих устаревших игр эта конкретная проблема возникает в ситуациях, когда игра настроена для работы в полноэкранном режиме. Однако многие затронутые пользователи подтвердили, что проблема больше не возникает, если они заставляют игру запускаться в оконном режиме.
  • Игра несовместима с Windows 10. Если игра изначально не была разработана для работы в Windows 10, существует целый ряд проблем совместимости, которые могут вызвать этот код ошибки. К счастью, вы можете использовать режим совместимости, чтобы обойти большинство проблем, заставив исполняемый файл запускаться в режиме совместимости с более старой ОС Windows.
  • Direct Play и .NET Framework 3.5 отключены. Как оказалось, подавляющее большинство устаревших игр, выпущенных, когда Windows XP была последней ОС от Microsoft, для работы потребуют Direct Play и .NET 3.5 Framework. Но поскольку эти технологии устарели и по умолчанию отключены в Windows 10, единственный способ решить эту проблему — повторно включить их на экране «Приложения и функции Windows».
  • Проблема графического рендеринга. Проблемы с графическим рендерингом также могут способствовать появлению этой проблемы, если устаревшая игра не знает, как использовать новые технологии, такие как Direct3D 11 и Direct3D 12. В этом случае вы можете использовать оболочку, такую ​​как dgVoodoo, чтобы сделать игра совместима с рендерингом в Windows 10.

Теперь, когда вы знаете всех потенциальных виновников, которые могут быть ответственны за появление этой ошибки DirectDraw в Windows 10 при попытке играть в устаревшие игры, вот список подтвержденных методов, которые другие затронутые пользователи успешно использовали, чтобы разобраться в этой проблеме:

Метод 1: принудительный запуск игры в оконном режиме

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

Как ни странно, это приводит к удалению требования DirectDraw для многих устаревших игр, включая Diablo I и Diablo II. Вы можете принудительно применить этот обходной путь, перейдя на вкладку «Ярлыки» и добавив «-w» в конце цели.

Если вы еще не пробовали это конкретное исправление, следуйте приведенным ниже инструкциям, чтобы настроить свойства устаревшей игры, чтобы она запускалась в оконном режиме:

  1. Перейдите в место, где вы установили устаревшую игру (или щелкните правой кнопкой мыши ярлык игры) и выберите «Свойства» в только что появившемся контекстном меню.Доступ к экрану свойств
  2. Как только вы окажетесь на экране «Свойства», щелкните вкладку «Ярлык», затем добавьте «-w» в конце текстового поля «Цель» и нажмите «Применить», чтобы игра запускалась в оконном режиме.Принудительный запуск игры в оконном режиме
  3. После сохранения изменений дважды щелкните игру в обычном режиме и посмотрите, можете ли вы теперь играть в игру в оконном режиме, не увидев такой же ошибки.

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

Метод 2: запуск игры в режиме совместимости

Если первый метод не сработал в вашем случае, следующее, что вы должны попробовать, — это принудительно запустить основной исполняемый файл в режиме совместимости с версией ОС, для которой изначально была разработана устаревшая игра. Эффективность этого конкретного исправления была подтверждена многими пользователями Windows 10, которые ранее не могли запустить Age of Empire.

Вы можете принудительно запустить исполняемый файл в режиме совместимости, запустив средство устранения неполадок совместимости и применив рекомендованное исправление. Однако после тестирования этой функциональности Windows 10 мы рекомендуем принудительно применить это изменение вручную на экране «Свойства», чтобы убедиться, что вы выбираете правильную устаревшую ОС.

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

  1. Щелкните правой кнопкой мыши основной исполняемый файл устаревшей игры (или ярлык игры, который вы используете для запуска игры) и выберите «Свойства» в только что появившемся контекстном меню.Доступ к экрану свойств

    Примечание. Если вы хотите сначала попробовать средство устранения неполадок совместимости, нажмите «Устранение неполадок совместимости» в этом же меню.

  2. На экране «Свойства» ярлыка / исполняемого файла устаревшей игры щелкните вкладку «Совместимость» в меню вверху.
  3. На вкладке «Совместимость» установите флажок «Запустить эту программу в режиме совместимости для», затем выберите Windows XP (пакет обновления 3) из списка доступных параметров.Запуск программы в режиме совместимости с Windows XP
  4. Нажмите «Применить», чтобы сохранить изменения, затем запустите игру и посмотрите, устранена ли проблема.

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

Метод 3: включение Direct Play и .NET 3.5

Другая довольно распространенная причина, которая может вызывать эту ошибку, — это случай, когда устаревшая игра, которую вы пытаетесь визуализировать на своем компьютере с Windows 10, требует включения Direct Play и .NET Framework 3.5 — эти технологии к настоящему времени устарели и отключены. по умолчанию в Windows 10.

Если исходный разработчик игры не обновил игру для использования более новых эквивалентов Direct Play и .NET Framework 3.5, единственный способ исправить ошибку DirectDraw 16385 — повторно включить эти 2 устаревших компонента из меню «Функции Windows» на Windows 10.

Эффективность этого метода была подтверждена многими пользователями, которые ранее сталкивались с этой проблемой в Windows 10. Вот что вам нужно сделать, чтобы включить Direct Play и .NET Framework 3.5:

  1. Нажмите клавишу Windows + R, чтобы открыть диалоговое окно «Выполнить». Затем введите «appwiz.cpl» в текстовое поле и нажмите Enter, чтобы открыть меню «Программы и компоненты». Когда вам будет предложено UAC (Контроль учетных записей пользователей), нажмите Да, чтобы предоставить доступ администратора.Доступ к экрану «Программы и компоненты»
  2. Находясь на экране «Программы и компоненты», нажмите «Включить или отключить функции Windows» в левом вертикальном меню.Включение и выключение функций Windows

    Примечание. Когда вам будет предложено UAC (Контроль учетных записей пользователей), нажмите Да, чтобы предоставить доступ администратора.

  3. Как только вы войдете в меню «Возможности Windows», начните с установки флажка, связанного с .NET Framework 3.5 (включая .NET 2.0 и 3.0), и нажмите «Да» в ответ на запрос подтверждения.Включение .NET Framework 3.5
  4. Затем установите флажок «Связать с устаревшими компонентами», затем разверните меню и включите прямое воспроизведение, прежде чем нажать «ОК», чтобы сохранить изменения.Доступ к устаревшим компонентам
  5. Подтвердите операцию, затем перезагрузите компьютер и снова запустите устаревшую игру, чтобы проверить, удалось ли вам исправить ошибку DirectDraw 16385.

Если проблема все еще не решена, перейдите к следующему потенциальному исправлению ниже.

Метод 4: Использование dgVoodo Wrapper

Если ни один из вышеперечисленных методов не помог в вашем случае, вам следует рассмотреть возможность использования оболочки (например, dgVoodoo), которая способна преобразовывать старые графические API-интерфейсы в Direct3D 11 или Direct3D 12, чтобы вы могли визуализировать игру в более новых операционных системах, таких как Windows 8.1 и Windows 10.

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

Если ни один из других методов, представленных выше, не позволил вам решить эту конкретную проблему, следуйте приведенным ниже инструкциям, чтобы загрузить и использовать dgVoodoo 2, чтобы обойти ошибку DirectDraw и сыграть в устаревшую игру на своем компьютере с Windows 10:

  1. Посетите официальную страницу загрузки dgVoodoo2 и щелкните гиперссылку, связанную с стабильная версия dgVoodoo.
    Скачивание последней версии dgVoodoo
  2. После завершения загрузки используйте такую ​​утилиту, как WinRar, WinZip или 7Zip, чтобы извлечь содержимое папки dgVoodoo в удобную папку.
  3. После извлечения утилиты дважды щелкните основной исполняемый файл и следуйте официальной документации, чтобы настроить его для устаревшей игры, которую вы пытаетесь отобразить в Windows 10.

Divine Divinity – Game Config DirectDraw (ddraw.ini) – Issue Fix 1 - steamlists.com

Divine Divinity – Game Config DirectDraw (ddraw.ini) – Issue Fix 1 — steamlists.com

DirectDraw can fix compatibility issues in older games, such as black screen, bad performance, crashes or defective Alt+Tab. Windowed Mode / Fullscreen Exclusive Mode / Borderless Mode.

Features

  • Supports Windows XP, Vista, 7, 8, 10 and Wine
  • Windowed Mode / Fullscreen Exclusive Mode / Borderless Mode
  • Alt+Enter support to switch quickly between Fullscreen and Windowed mode
  • Automatically saves and restores window position/size/state
  • GDI / OpenGL / Direct3D 9 renderer (With automatic renderer selection)
  • FPS Limiter
  • VSync
  • Optional mouse sensitivity scaling

Instructions

  • Download DirectDraw – [github.com]  and extract it into your game folder
  • Rendering system – Software
  • Start the game

Divine Divinity - Game Config DirectDraw (ddraw.ini) - Issue Fix - Instructions - 5EEAD25

Note: If you want to play in windowed mode then start the game once in fullscreen and then press Alt+Enter to enable the cnc-ddraw windowed mode (Or enable windowed mode in the config program without using Alt+Enter).

If the game starts but it doesn’t work perfectly then open the config program and check the Compatibility settings. Alternatively you can also open ddraw.ini with notepad and modify the Compatibility settings in there.

Compatibility settings in ddraw.ini

  • If there are problems on Alt+Tab then try to set noactivateapp=true – If it still doesn’t work also try renderer=opengl or renderer=gdi.
  • If the game is running too fast then try to set maxgameticks=60 – If it’s still too fast, try a lower value.
  • If windowed mode or upscaling are not working properly then try to set hook=2 and renderer=gdi.
  • If videos or other UI elements are invisible then try to set nonexclusive=true.
  • If some parts of the screen are being displayed diagonally then try to set fixpitch=true.
  • If the game is stuttering on a Freesync/G-Sync monitor then try to set minfps=-1.

Hotkeys

  • [Alt] + [Enter] = Switch between windowed and fullscreen mode
  • [Ctrl] + [Tab] = Unlock cursor
  • [Right Alt] + [Right Ctrl] = Unlock cursor

Issues in github

for problems issues in github – [github.com]

Hope you enjoy the Guide about Divine Divinity – Game Config DirectDraw (ddraw.ini) – Issue Fix, if you think we should add extra information or forget something, please let us know via comment below, and we will do our best to fix or update as soon as possible!

  • Divine Divinity

������������ ������������

������� �� ���� ��������:

  • ������� SetDisplayMode()
  • �����

������������ ������������

��� ����������� ������ ������� SetDisplayMode() ���������� DirectDraw ����� ������� ��������� � ���, ��� ������ ��� ����� ��������������. ��� �� ������ �� ������3, ����� DirectDrawWin � ������� ������� EnumDisplayModes() ���������� DirectDraw ������ ������ ���� ��������� ������������. ��������� ��������� �������, �� ����� ��������� ���������� �� ����� ������� ��� ��������� ������ SetDisplayMode().

��� �� ����� ������������ ������������ �� �������� � �������� ������ ������� SetDisplayMode(). �� ���� ������� � ����� DirectDrawWin ���� �������� ������� ActivateDisplayMode(), ������� ��������� ��� ����������� �������� ��� �������� �������� �� ������ ������ � �������. ������ �� ���������� ActivateDisplayMode() � ���, ��� ��� ������, �� ������� ������� ��������� � ����� ������� SetDisplayMode().

������� SetDisplayMode()

���������� ��� ������ ������� SetDisplayMode(). ������ �� ��� ����������� ���������� DirectDraw � ���������� � ����� �����������. ������ ������ ����������� ���������� DirectDraw2 � ���������� � ����� �����������. �������� ������ ������� �������� ���:

HRESULT SetDisplayMode(DWORD width, DWORD height, DWORD depth);

�����

��� �������������� ���������

�������� � ������������ ���� DirectDraw (ddraw.h), �� �� ������� � ��� ����� ���������. ��� ����������� ���, ��� ��� ������� DirectDraw ����������� �� IDL (����� ����������� �����������) ������������ COM. �� IDL ������� SetDisplayMode() �������� ���:

STDMETHOD(SetDisplayMode)(THIS_ DWORD, DWORD, DWORD) PURE;

��� ����� ����� IDL �� �����. ���, ��� ��� ���������� �����,�� ��� �������, ��� ������������� ��������, � ����� ���������� � ���� ����������. ��� ��� �������� ����� ����� ����������� ������������� ����������� �������, ������� � ���������� � ����� � ���������� ������ DirectX.�

������� SetDisplayMode(), ��� � ����������� ������� DirectX�API, ���������� �������� ���� HRESULT�� 32-��������� �������� � ��������� ���������� ������ �������. �� �������� DD_OK ����������, ��� ����� �������� ��������.

������ SetDisplayMode() �� ���������� DirectDraw �������� ��� ��������� ���� DWORD. ��� ��������� ���������� ���������� ������ � ������� �������� ������� �����������, ������� ����������� ���������� VGA 640?480?8 �������������� ���:

ddraw1->SetDisplayMode(640, 480, 8);

�������� �������� ������, ������� ������� �������� � ������ SetDisplayMode() �� ���������� DirectDraw2. �� ������������ �������� �������� ���:

HRESULT SetDisplayMode(DWORD width, DWORD height, DWORD depth, �DWORD refreshrate, DWORD flags);

� ���� ������ ���������� ��� �������������� ���������: ������� ����� ������ � ������� �����, ������� ����� ���� ������������ � ������� ������� DirectDraw, � ���� ������ ���� ����� ����. � ����������� ������ SetDisplayMode() ����������� ���������� VGA 640?480?8 ����� �������������� ���:

ddraw1->SetDisplayMode(640, 480, 8, 0, 0);

� ������ ������ ������ ������� ����� ������ �����������0; ��� ��������, ��� ������ ���� ������������ �������, �������� �� ���������. ����� ����, ����� ������� ���������� �������� ������� (60��� � ��������� �������):

ddraw1->SetDisplayMode(640, 480, 8, 60, 0);

������ �� ������� ������, ��� �� ������ ������ ����� ������� (��� ������ ��������� �����������). ����� ��� ��� �������� SetDisplayMode(), ���������� ������� ���������� ��������� � ������� ���������� ������������.

I have some legacy DirectX code that always returns DDERR_UNSUPPORTED.

I originally developed the code using DirectX3, and I am porting it to DirectX7 after spending years away from programming.

The following line is returning DDERR_UNSUPPORTED rather than DD_OK:

hrRetVal = pDDraw->SetDisplayMode(dwWidth, dwHeight, dwBPP, 0, 0);

Could someone please take a quick peek and respond if you see why this might be the case? This is not a commercial application… just something to do for fun.

Based on the Microsoft on-line documents, the SetDisplayMode method is not deprecated, and should work. A compiled version of my legacy program written with DirectX3 renders graphics on newer OS’s such as Windows 10, without issue. I am interested in making some changes.

This Video compilation unit:

  • Sets the video mode to 1024 X 768
  • Create a DirectX instance, set the cooperative level.
  • Which when destroyed will Restore video to original mode, and flip to GDI
void Video::Initialize(void)
{

  TRACE("Video::Initialize invokedn");

  hrRetVal = {0};
  DWORD dwDefaultRefreshRate = 0x0;
  DWORD  dwWidth = 1024, dwHeight = 768, dwBPP = 8, dwRefreshRate = dwDefaultRefreshRate, dwFlags = 0x0;

  try
  {
    Check(hrRetVal); // check for DD_OK     

    TRACE("Video: using emulation mode, no hardwaren"); // debugging
    TRACE("Video: DirectDrawCreateEx invokedn");
    hrRetVal = DirectDrawCreateEx((GUID*)DDCREATE_EMULATIONONLY, (LPVOID*)&pDDraw, IID_IDirectDraw7, NULL);

    Check(hrRetVal); // TRACE value of hrRetVal
    if (DD_OK == hrRetVal)
    {
      TRACE("Video SetCooperativeLevel invokedn");
      hrRetVal = pDDraw->SetCooperativeLevel(hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
      Check(hrRetVal);
      if (DD_OK == hrRetVal)
      {

        // Lets see if the video is supported 
        hrRetVal = QueryVideoCapability();
        Check(hrRetVal);

        if (DD_OK == hrRetVal)
        {

          TRACE("Attempting to set video resolution to: %d %d n", dwWidth, dwHeight);

          hrRetVal = pDDraw->SetDisplayMode(dwWidth, dwHeight, dwBPP, 0, 0); // this line always returns DDERR_UNSUPPORTED

          // hrRetVal == DDERR_UNSUPPORTED after call to SetDisplayMode

          Check(hrRetVal);
          if (DD_OK != hrRetVal)
            throw (VIDEO_EXCEPTION); // with throw an exception since hrRetVal == DDERR_UNSUPPORTED
        }
      }
      else
      {
        Check(hrRetVal);
        throw (VIDEO_EXCEPTION); 
      }
    }
    else
    {
      Check(hrRetVal);
      throw (VIDEO_EXCEPTION);
    }
  }

  catch(int exception)
  {
    TRACE("%Xh exception caught by Video::Initializen", exception);
    Video::Check(hrRetVal);

    if (exception == VIDEO_EXCEPTION)
    {
      char message[80];
      strcpy_s ( message, "Unable to initialize video. ");
      strcat_s ( message, "nApplication will now terminate.");
      FatalMessageBox( message );

      TRACE("APP_EXCEPTION thrown by Video::Initializen");
      throw (APP_EXCEPTION);
    }
  }
}

I’m using Visual Studio 2017 Pro v15.7.2, on Windows 10 Build 1803.

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Все ссылки открываются в новой вкладке как исправить
  • Как найти чья это цитата
  • Как в вацап исправить ошибки в отправленном сообщении
  • First contentful paint 3g как исправить
  • Форд фокус как найти блютуз

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии