Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Инициализацию DirectDraw


Автор: Stas96 30.10.2009, 20:41
Ув.Программисты помогите пожайлусто. Изучаю книгу "Фленов - DirectX и C++ Искусство программирования"
Перешел к главе Инициализацию DirectDraw вот код:
ddfunc.h
Код

#define _DDFUNC_H_
#include "d3dx9math.h"



#include "ddraw.h"

//Функция инициализации Direc3D

// Функция инициализации Direct3D
HRESULT DXDDInit(IDirectDraw7 **ppiDD, 
                IDirectDrawSurface7 **primsurf,
                IDirectDrawSurface7 **backsurf,
                HWND hWnd, 
                DWORD iWidth,
                DWORD iHeight,
                WORD iColors,
                BOOL *bFullScreen
                );

BOOL ClearSurface(LPDIRECTDRAWSURFACE7 surf, int iColor);
IDirectDrawSurface7 *LoadBMPToSurface(LPCTSTR filename, IDirectDraw7 *ppiDD);
IDirectDrawSurface7 *LoadBMPToSurface(IDirectDrawSurface7 **ddsurf, LPCTSTR filename,
        IDirectDraw7 *ppiDD);
IDirectDrawSurface7 *LoadBMPToSurfaceFast(LPCTSTR filename, IDirectDraw7 *ppiDD);
IDirectDrawSurface7 *LoadBMPToSurfaceFast(IDirectDrawSurface7 **ddsurf, LPCTSTR filename, 
        IDirectDraw7 *ppiDD);
void DrawLine(IDirectDrawSurface7* surf, WORD X1, WORD Y1, 
              WORD X2, WORD Y2, BYTE r, BYTE g, BYTE b);
void Circle(IDirectDrawSurface7* surf, WORD X, WORD Y, 
              WORD R, WORD lines, BYTE r, BYTE g, BYTE b);

#endif


ddfunc.срр

Код

// InitDraw.cpp: определяет точку входа для приложения.
//

#include "stdafx.h"
#include "InitDraw.h"

#define MAX_LOADSTRING 100

// Глобальные переменные:
HINSTANCE hInst;                                // текущий экземпляр
TCHAR szTitle[MAX_LOADSTRING];                    // Текст строки заголовка
TCHAR szWindowClass[MAX_LOADSTRING];            // имя класса главного окна

// Отправить объявления функций, включенных в этот модуль кода:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: разместите код здесь.
    MSG msg;
    HACCEL hAccelTable;

    // Инициализация глобальных строк
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_INITDRAW, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // Выполнить инициализацию приложения:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_INITDRAW));

    // Цикл основного сообщения:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}



//
//  ФУНКЦИЯ: MyRegisterClass()
//
//  НАЗНАЧЕНИЕ: регистрирует класс окна.
//
//  КОММЕНТАРИИ:
//
//    Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код
//    был совместим с системами Win32, не имеющими функции RegisterClassEx'
//    которая была добавлена в Windows 95. Вызов этой функции важен для того,
//    чтобы приложение получило "качественные" мелкие значки и установило связь
//    с ними.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style            = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra        = 0;
    wcex.cbWndExtra        = 0;
    wcex.hInstance        = hInstance;
    wcex.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_INITDRAW));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName    = MAKEINTRESOURCE(IDC_INITDRAW);
    wcex.lpszClassName    = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassEx(&wcex);
}

//
//   ФУНКЦИЯ: InitInstance(HINSTANCE, int)
//
//   НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
//
//   КОММЕНТАРИИ:
//
//        В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
//        создается и выводится на экран главное окно программы.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  НАЗНАЧЕНИЕ:  обрабатывает сообщения в главном окне.
//
//  WM_COMMAND    - обработка меню приложения
//  WM_PAINT    -Закрасить главное окно
//  WM_DESTROY     - ввести сообщение о выходе и вернуться.
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Разобрать выбор в меню:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: добавьте любой код отрисовки...
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}




 но проблемма пишет ошибку:"не удается открыть файл ''d3dx9math.inl''

Автор: just_geek 31.10.2009, 03:15
А можно не скромный вопрос?
Откуда такая необходимость использовать устаревший DirectDraw? И если она все таки есть, то нафига его смешивать с Direct3D 9 ?  smile 

Автор: Stas96 31.10.2009, 21:43
Потомучто:я делаю все по книге и там в основном используется DirectDraw

Автор: Rickert 2.11.2009, 17:57
Я Dx'ом не занимался никогда, но даже просто введя в гугле "d3dx9math.inl" сразу же наткнулся на ссылки:
http://social.msdn.microsoft.com/Forums/en-US/gametechnologiesgeneral/thread/991c6927-a1e0-4bd0-9811-94e04e7dda90
http://www.gamedev.net/community/forums/topic.asp?topic_id=411422&whichpage=1&#2740054

Автор: Stas96 4.11.2009, 12:12
Может я несильно верно описал свою проблему.Я когда подключаю библиотеки math.lib или   math.inl или d3dx9math.lib или d3dx9math.inl
Я просто  разные пытался подключить библиотеки "math" в  дополнительной зависимости.У меня выбивает "не удается открыть файл ''.

Автор: EgoBrain 5.11.2009, 12:40
Цитата(Stas96 @ 4.11.2009,  12:12)
Может я несильно верно описал свою проблему.Я когда подключаю библиотеки math.lib или   math.inl или d3dx9math.lib или d3dx9math.inl
Я просто  разные пытался подключить библиотеки "math" в  дополнительной зависимости.У меня выбивает "не удается открыть файл ''.

А где у тебя в коде используются функции этих библиотек? И вообще в девятом директе помоему отдельно math не надо подключать, попробуй без них скомпилить...

Автор: Stas96 5.11.2009, 16:22
попытался я скомпилировать пишет ошибки:
1>ddfunc.obj : error LNK2019: ссылка на неразрешенный внешний символ _DirectDrawCreateEx@16 в функции "long __cdecl DXDDInit(struct IDirectDraw7 * *,struct IDirectDrawSurface7 * *,struct IDirectDrawSurface7 * *,struct HWND__ *,unsigned long,unsigned long,unsigned short,int *)" (?DXDDInit@@YAJPAPAUIDirectDraw7@@PAPAUIDirectDrawSurface7@@1PAUHWND__@@KKGPAH@Z)
1>ddfunc.obj : error LNK2001: неразрешенный внешний символ "_IID_IDirectDraw7"
1>InitDraw.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __stdcall About(struct HWND__ *,unsigned int,unsigned int,long)" (?About@@YGHPAUHWND__@@IIJ@Z) в функции "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)
1>E:\C++\Программы\InitDraw\Debug\InitDraw.exe : fatal error LNK1120: 3 неразрешенных внешних элементов

Автор: Alexeis 5.11.2009, 16:27
ddraw.lib, dxguid.lib

Автор: Stas96 5.11.2009, 16:39
Спасибо но вот-
Ошибка может еще одну библиотеку забыли добавить:
1>InitDraw.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __stdcall About(struct HWND__ *,unsigned int,unsigned int,long)" (?About@@YGHPAUHWND__@@IIJ@Z) в функции "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)
1>E:\C++\Программы\InitDraw\Debug\InitDraw.exe : fatal error LNK1120: 1 неразрешенных внешних элементов

Автор: Alexeis 5.11.2009, 17:00
Stas96, это наверное cpp шник в проект не добавлен.

Автор: Stas96 5.11.2009, 21:10
Извиняюсь за вопрос. какой "срр"??

Автор: Alexeis 5.11.2009, 21:43
Цитата(Stas96 @  5.11.2009,  20:10 Найти цитируемый пост)
Извиняюсь за вопрос. какой "срр"?? 

Свой нестандартный... хотя может и от MFC, я в нем мало разбираюсь.

Автор: Stas96 5.11.2009, 21:48
Alexeis,Спасибо за помощь)
Вообще то он есть: 
Код

// InitDraw.cpp: определяет точку входа для приложения.
//

#include "stdafx.h"
#include "InitDraw.h"
#include "ddfunc.h"
#define MAX_LOADSTRING 100

// Глобальные переменные:
HINSTANCE hInst;                                // текущий экземпляр
TCHAR szTitle[MAX_LOADSTRING];                    // Текст строки заголовка
TCHAR szWindowClass[MAX_LOADSTRING];            // имя класса главного окна

// Отправить объявления функций, включенных в этот модуль кода:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: разместите код здесь.
    MSG msg;
    HACCEL hAccelTable;

    // Инициализация глобальных строк
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_INITDRAW, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // Выполнить инициализацию приложения:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_INITDRAW));

    // Цикл основного сообщения:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}



//
//  ФУНКЦИЯ: MyRegisterClass()
//
//  НАЗНАЧЕНИЕ: регистрирует класс окна.
//
//  КОММЕНТАРИИ:
//
//    Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код
//    был совместим с системами Win32, не имеющими функции RegisterClassEx'
//    которая была добавлена в Windows 95. Вызов этой функции важен для того,
//    чтобы приложение получило "качественные" мелкие значки и установило связь
//    с ними.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style            = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra        = 0;
    wcex.cbWndExtra        = 0;
    wcex.hInstance        = hInstance;
    wcex.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_INITDRAW));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName    = MAKEINTRESOURCE(IDC_INITDRAW);
    wcex.lpszClassName    = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassEx(&wcex);
}

//
//   ФУНКЦИЯ: InitInstance(HINSTANCE, int)
//
//   НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
//
//   КОММЕНТАРИИ:
//
//        В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
//        создается и выводится на экран главное окно программы.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  НАЗНАЧЕНИЕ:  обрабатывает сообщения в главном окне.
//
//  WM_COMMAND    - обработка меню приложения
//  WM_PAINT    -Закрасить главное окно
//  WM_DESTROY     - ввести сообщение о выходе и вернуться.
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Разобрать выбор в меню:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: добавьте любой код отрисовки...
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}



Автор: just_geek 5.11.2009, 22:19
Я конечно может ослеп, либо ты не весь код показал, но где имплементация функции About?

Автор: Stas96 5.11.2009, 23:30
Это весь код файла "срр" .

Автор: just_geek 5.11.2009, 23:37
Потворю, у тебя нет реализации функции About, Надо ее написать, либо убрать эти строчки кода
Код

       case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;

Автор: EgoBrain 6.11.2009, 01:36
Да блин, когда первый раз писал в этой теме, мне сообщение не дали отправить.
Короче, у тебя ddfunc.h содержит прототипы функций, реализацеия которых не описана в ddfunc.cpp, тел нету  smile 
Я так понимаю у тебя они должны быть как раз в ddfunc.cpp, а программа в отдельном модуле (то есть главная функция и оконные процедуры). Тобишь ты ddfunc.h/cpp подготавливаешь чисто для Директовых функций, и исползуешь этот шаблон в других программах. Что неужели никто (из тех кто пишет в тему) не читал книжки про директ? Там все авторы так делают...

Автор: Stas96 6.11.2009, 14:16
А извините а можно это все только в коде ну пример а то я не сильно понял  smile .
 smile 
Заранее Благодарен!!!

Автор: Stas96 14.11.2009, 12:43
Все проблема решена smile :
Проблема была  в том что обьявлено INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); но функция отсутствует... smile 

Должно быть что-то типа : 
Код

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
  UNREFERENCED_PARAMETER(lParam); 
  switch (message) 
  { 
  case WM_INITDIALOG: 
   return (INT_PTR)TRUE; 

  case WM_COMMAND: 
   if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
   { 
    EndDialog(hDlg, LOWORD(wParam)); 
    return (INT_PTR)TRUE; 
   } 
   break; 
  } 
  return (INT_PTR)FALSE; 
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)