0

Всем добрый день! Продолжаю изучать DirectX по книге. Довольно старая книга и директ там используется аж 7. В общем есть там одна библиотека DirectDraw которая в более поздних версиях DX удалена. Из этой библиотеки используется множество функций которые естественно не работают в новых версиях DX. Сразу поясню: Программы написанные давным давно и скомпилированные работают но скомпилировать заново такой код не получится так как библиотеки уже нет.

Теперь собственно сам вопрос: Чем сейчас заменяются функции из DirectDraw? Какую библиотеку нужно подключить что бы можно было сделать все то что делала DirectDraw?

// DEMO6_1.CPP basic DirectDraw initialization demo

// INCLUDES ///////////////////////////////////////////////

#define WIN32_LEAN_AND_MEAN  // just say no to MFC

#define INITGUID // make sure directX guids are included

#include <windows.h>   // include important windows stuff
#include <windowsx.h> 
#include <mmsystem.h>
#include <iostream> // include important C/C++ stuff
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h> 
#include <math.h>
#include <io.h>
#include <fcntl.h>

#include <ddraw.h> // include directdraw

// DEFINES ////////////////////////////////////////////////

// defines for windows 
#define WINDOW_CLASS_NAME "WINCLASS1"

// default screen size
#define SCREEN_WIDTH    640  // size of screen
#define SCREEN_HEIGHT   480
#define SCREEN_BPP      8    // bits per pixel
#define MAX_COLORS      256  // maximum colors

// TYPES //////////////////////////////////////////////////////

// basic unsigned types
typedef unsigned short USHORT;
typedef unsigned short WORD;
typedef unsigned char  UCHAR;
typedef unsigned char  BYTE;

// MACROS /////////////////////////////////////////////////

#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEYUP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

// initializes a direct draw struct
#define DD_INIT_STRUCT(ddstruct) { memset(&ddstruct,0,sizeof(ddstruct)); ddstruct.dwSize=sizeof(ddstruct); }

// GLOBALS ////////////////////////////////////////////////
HWND      main_window_handle = NULL; // globally track main window
HINSTANCE hinstance_app = NULL; // globally track hinstance

// directdraw stuff

LPDIRECTDRAW7         lpdd = NULL;   // dd object
LPDIRECTDRAWSURFACE7  lpddsprimary = NULL;   // dd primary surface
LPDIRECTDRAWSURFACE7  lpddsback = NULL;   // dd back surface
LPDIRECTDRAWPALETTE   lpddpal = NULL;   // a pointer to the created dd palette
LPDIRECTDRAWCLIPPER   lpddclipper = NULL;   // dd clipper
PALETTEENTRY          palette[256];          // color palette
PALETTEENTRY          save_palette[256];     // used to save palettes
DDSURFACEDESC2        ddsd;                  // a direct draw surface description struct
DDBLTFX               ddbltfx;               // used to fill
DDSCAPS2              ddscaps;               // a direct draw surface capabilities struct
HRESULT               ddrval;                // result back from dd calls
DWORD                 start_clock_count = 0; // used for timing

// these defined the general clipping rectangle
int min_clip_x = 0,                          // clipping rectangle 
max_clip_x = SCREEN_WIDTH - 1,
min_clip_y = 0,
max_clip_y = SCREEN_HEIGHT - 1;

// these are overwritten globally by DD_Init()
int screen_width = SCREEN_WIDTH,            // width of screen
screen_height = SCREEN_HEIGHT,           // height of screen
screen_bpp = SCREEN_BPP;              // bits per pixel


char buffer[80];                     // general printing buffer

// FUNCTIONS //////////////////////////////////////////////
LRESULT CALLBACK WindowProc(HWND hwnd,
    UINT msg,
    WPARAM wparam,
    LPARAM lparam)
{
    // this is the main message handler of the system
    PAINTSTRUCT     ps;     // used in WM_PAINT
    HDC             hdc;    // handle to a device context
    char buffer[80];        // used to print strings

    // what is the message 
    switch (msg)
    {
    case WM_CREATE:
    {
        // do initialization stuff here
        // return success
        return(0);
    } break;

    case WM_PAINT:
    {
        // simply validate the window 
        hdc = BeginPaint(hwnd, &ps);

        // end painting
        EndPaint(hwnd, &ps);

        // return success
        return(0);
    } break;

    case WM_DESTROY:
    {

        // kill the application, this sends a WM_QUIT message 
        PostQuitMessage(0);

        // return success
        return(0);
    } break;

    default:break;

    } // end switch

// process any messages that we didn't take care of 
    return (DefWindowProc(hwnd, msg, wparam, lparam));

} // end WinProc

///////////////////////////////////////////////////////////

int Game_Main(void *parms = NULL, int num_parms = 0)
{
    // this is the main loop of the game, do all your processing
    // here

    // for now test if user is hitting ESC and send WM_CLOSE
    if (KEYDOWN(VK_ESCAPE))
        SendMessage(main_window_handle, WM_CLOSE, 0, 0);

    // return success or failure or your own return code here
    return(1);

} // end Game_Main

////////////////////////////////////////////////////////////

int Game_Init(void *parms = NULL, int num_parms = 0)
{
    // this is called once after the initial window is created and
    // before the main event loop is entered, do all your initialization
    // here

    // create IDirectDraw interface 7.0 object and test for error
    if (FAILED(DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL)))
        return(0);

    // set cooperation to normal since this will be a windowed app
    lpdd->SetCooperativeLevel(main_window_handle, DDSCL_NORMAL);

    // return success or failure or your own return code here
    return(1);

} // end Game_Init

/////////////////////////////////////////////////////////////

int Game_Shutdown(void *parms = NULL, int num_parms = 0)
{
    // this is called after the game is exited and the main event
    // loop while is exited, do all you cleanup and shutdown here

    // simply blow away the IDirectDraw4 interface
    if (lpdd)
    {
        lpdd->Release();
        lpdd = NULL;
    } // end if

 // return success or failure or your own return code here
    return(1);

} // end Game_Shutdown

// WINMAIN ////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hinstance,
    HINSTANCE hprevinstance,
    LPSTR lpcmdline,
    int ncmdshow)
{

    WNDCLASSEX winclass; // this will hold the class we create
    HWND       hwnd;     // generic window handle
    MSG        msg;      // generic message
    HDC        hdc;      // graphics device context

    // first fill in the window class stucture
    winclass.cbSize = sizeof(WNDCLASSEX);
    winclass.style = CS_DBLCLKS | CS_OWNDC |
        CS_HREDRAW | CS_VREDRAW;
    winclass.lpfnWndProc = WindowProc;
    winclass.cbClsExtra = 0;
    winclass.cbWndExtra = 0;
    winclass.hInstance = hinstance;
    winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    winclass.lpszMenuName = NULL;
    winclass.lpszClassName = WINDOW_CLASS_NAME;
    winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    // save hinstance in global
    hinstance_app = hinstance;

    // register the window class
    if (!RegisterClassEx(&winclass))
        return(0);

    // create the window
    if (!(hwnd = CreateWindowEx(NULL,                  // extended style
        WINDOW_CLASS_NAME,     // class
        "DirectDraw Initialization Demo", // title
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        0, 0,     // initial x,y
        400, 300,  // initial width, height
        NULL,     // handle to parent 
        NULL,     // handle to menu
        hinstance,// instance of this application
        NULL))) // extra creation parms
        return(0);

    // save main window handle
    main_window_handle = hwnd;

    // initialize game here
    Game_Init();

    // enter main event loop
    while (TRUE)
    {
        // test if there is a message in queue, if so get it
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            // test if this is a quit
            if (msg.message == WM_QUIT)
                break;

            // translate any accelerator keys
            TranslateMessage(&msg);

            // send the message to the window proc
            DispatchMessage(&msg);
        } // end if

        // main game processing goes here
        Game_Main();

    } // end while

// closedown game here
    Game_Shutdown();

    // return to Windows like this
    return(msg.wParam);

} // end WinMain

///////////////////////////////////////////////////////////
alexsis20102
  • 606
  • 3
  • 15
  • 38
  • Библиотека DirectDraw не была удалена, она была объявлена устаревшей и использовать ее не следует. Все, что делала DirectDraw, делается теперь при помози DXGI / DirectX. А вообще ответ такой же, как и в предыдущем вашем вопросе: Cоздайте вопрос описывающий конкретную проблему... С конкретным кодом и конкретными ошибками. – user7860670 Feb 08 '19 at 07:55
  • @VTT Ты по моему единственный кто тут по директу что то знает )) О ее удалении написано на сайте майкросовт в документации где то находил эту инфу. Теперь по вопросу. Мне не нужно конкретное решение одной проблемы или ошибки. Вопрос поставлен довольно точно. Мне нужно понять с помощью какой библиотеки я смогу выполнить те же действия что и с этой библиотекой. т.е мне например нужна замена функции DirectDrawCreateEx и многих других на современные. – alexsis20102 Feb 08 '19 at 08:43
  • Она никуда не удалялась. Функция DirectDrawCreateEx по-прежнему доступна и должна работать. Прямой замены ей нет, так как теперь инициализация делается по-другому. – user7860670 Feb 08 '19 at 09:04
  • @VTT Значит что бы она работала нужно подключать не #include <ddraw.h> а что ?? Какая библиотека пришла на замену что бы работала такая функция как DirectDrawCreateEx ? – alexsis20102 Feb 08 '19 at 09:20
  • Она по-прежнему объявлена в ddraw.h и по-прежнему работает. – user7860670 Feb 08 '19 at 09:21
  • @VTT Ошибка LNK2019 ссылка на неразрешенный внешний символ _DirectDrawCreateEx@16 в функции "int __cdecl ffff(void *,int)" (?Game_Init@@YAHPAXH@Z) Project2 D:\project c++\dx5\Project2\Project2\Source.obj Не работает она таким образом. И вот почему она не работает https://blogs.msdn.microsoft.com/chuckw/2010/06/16/whither-directdraw/ – alexsis20102 Feb 08 '19 at 09:30
  • Наконец-то вы добрались до описания конкретной проблемы... Вам сюда: Ссылка на неразрешенный внешний символ. В приведенной статье обсуждается по большей части DirectX SDK (June 2010) который для конкретно для DirectDrawCreateEx не нужен. – user7860670 Feb 08 '19 at 09:35
  • @VTT тот пост я видел и читал. Вывод нужно подключить #pragma comment(lib, "ddraw.lib") которой не существует сейчас в современной версии ДХ. И наконец мы вернулись к тому с чего начали. Я не хочу подключать несуществующую библиотеку а хочу заменить ее современным аналогом. КАКИМ ?? – alexsis20102 Feb 08 '19 at 09:41
  • Я вот специально сейчас проверил - при использовании Windows 10 Pro 1809, VS2017 c Windows SDK 10.0.17763.0, ddraw.lib на месте и после ее линковки пример собирается и запускается. – user7860670 Feb 08 '19 at 09:51
  • @VTT Странно другой пример в упор не хотел запускаться ... но да ладно вопрос остается прежним какая современная альтернатива? – alexsis20102 Feb 08 '19 at 10:00
  • Я же уже писал - переход на DirectX11 / 12. И нет, просто заменить DirectDrawCreateEx на какой-нибудь DirectX11CreateEx не получится, изменения потребуются радикальные. Читайте DirectX 11 Tutorials – user7860670 Feb 08 '19 at 10:04
  • @VTT Хорошо. Этот тутор я помню. Тогда вопрос о туторе. ДХ 11 и ДХ 12 сильно различаются ?? – alexsis20102 Feb 08 '19 at 10:09
  • Да, весьма сильно. – user7860670 Feb 08 '19 at 10:22
  • @VTT Есть такой тутор на DX 12 ?? – alexsis20102 Feb 08 '19 at 10:27

0 Answers0