Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] DirectX (http://forum.oszone.net/showthread.php?t=167329)

котвася 14-02-2010 16:35 1346906

DirectX
 
Вложений: 1
не получается, набираю по примеру в книге.
Вот:
отчет прикрепил
Код:

#include "stdafx.h"
//-------------------
char szWindowClass[] = "Direct3DTemplateProj";
char szTitle[] = "Direct3d Demo by Michael Flenov";
//--------------------
IDirect3D9 *pD3D = NULL;
IDirect3DDevice9 *pD3DDevice = NULL;
int iWidth = 800;
int iHeight = 600;
//--------------------
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nShowCmd);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
bool Init(HWND hWnd);
void GraphEngine();
//--------------------
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nShowCmd)
{
        WNDCLASSEX wcex;
        MSG msg;
        HWND hWnd;       
        CoInitialize(NULL);
        //-------------------
        wcex.cbSize = sizeof(wcex);
        wcex.style = CS_CLASSDC;
        wcex.lpfnWndProc = (WNDPROC)WndProc;
        wcex.cbClsExtra = 0;
        wcex.cbWndExtra = 0;
        wcex.hInstance = hInst;
        wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground = NULL;
        wcex.lpszMenuName = NULL;
        wcex.lpszClassName = szWindowClass;
        wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
        if(!RegisterClassEx(&wcex))
                return FALSE;
        //----------------------
        hWnd = CreateWindow(szWindowClass, szTitle, WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, iWidth, iHeight, NULL, NULL, hInst, NULL);
        if(!hWnd)
                return FALSE;
        //----------------------
        ShowWindow(hWnd, SW_NORMAL);
        UpdateWindow(hWnd);
        //----------------------
        if(Init(hWnd) == TRUE)
        {
                while(true)
                {
                        if(PeekMessage(&msg, NULL,NULL,NULL,PM_REMOVE))
                        {
                                TranslateMessage(&msg);
                                DispatchMessage(&msg);
                                if(msg.message == WM_QUIT) break;
                        }
                        GraphEngine();
                }
        }
        //----------------------------
        if(pD3DDevice) {pD3DDevice = NULL; pD3DDevice = NULL;}
        if(pD3D) {pD3D = NULL; pD3D = NULL;}
        CoUninitialize();
        return 0;       
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,WPARAM wParam,LPARAM lParam)
{
        switch(message)
        {
        case WM_DESTROY:
                PostQuitMessage(0);
                break;
        default:
                return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
}
bool Init(HWND hWnd)
{
        if(DX3DInitZ(&pD3D, &pD3DDevice, hWnd,iWidth,iHeight,FALSE) != S_OK)
        {
                MessageBox(hWnd, "DirectX Initialize Error","Error",MB_OK);
                return FALSE;
        }
        return TRUE;
}
void GraphEngine()
{
        pD3DDevice->Clear(0,NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f,0);
        if(SUCCEEDED(pD3DDevice->BeginScene()))
        {
                pD3DDevice->EndScene();
        }
        pD3DDevice->Present(NULL,NULL,NULL,NULL);
}


ganselo 14-02-2010 17:33 1346941

1: Используйте тег code.
2: Используйте юникодовскую строку:
Код:

LPCWSTR szWindowClass = L"Direct3DTemplateProj";
LPCWSTR szTitle = L"Direct3d Demo by Michael Flenov";


котвася 14-02-2010 18:32 1346998

осталась одна ошибка:
Компиляция...
directx.cpp
.\directx.cpp(80) : error C2664: MessageBoxW: невозможно преобразовать параметр 2 из 'const char [25]' в 'LPCWSTR'
Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
stdafx.cpp

ganselo 14-02-2010 21:19 1347119

Код:

MessageBox(hWnd, (LPCWSTR)L"DirectX Initialize Error","Error",MB_OK);

Admiral 19-02-2010 06:17 1350818

ganselo, LPCWSTR и L"" одно и тоже.
Более логично или просто L"", или использовать макро подстановочный LPCSTR.
Последний означает LPCWSTR, в случаи определения UNICODE в проекте, или сам себя - LPCSTR, в случаи ANSI.

ganselo 19-02-2010 12:17 1351004

Admiral, а что значит LPTSTR и вообще TCHAR?

Admiral 20-02-2010 03:00 1351664

ganselo резонно. В предыдущем посте ошибся - пропустил один символ, что в данном случаи принципиально. Та макро подстановка правильно пишется с буквой T - LPCTSTR, а далее по тексту "сам себя" лишнее.

Что касается LPTSTR - это тоже макро подстановка: LPWSTR в случаи определения UNICODE, и LPSTR в противном случаи. Только эти строки не заканчиваются нуль символом('\0'), в отличии от LPCXXX.

TCHAR ещё одна макро подстановка, в зависимости от определений в проекте (например директивой #define или ключом линкера /D) может означать как char, так и WCHAR (wchar_t) символ(ы).

котвася 01-03-2010 19:25 1359002

Код:

#include "stdafx.h"
//-------------------
LPCWSTR szWindowClass = L"Direct3DTemplateProj";
LPCWSTR szTitle = L"Direct3d Demo by Michael Flenov";
//--------------------
IDirect3D9 *pD3D = NULL;
IDirect3DDevice9 *pD3DDevice = NULL;
int iWidth = 800;
int iHeight = 600;
//--------------------
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nShowCmd);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
bool Init(HWND hWnd);
void GraphEngine();
//--------------------
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nShowCmd)
{
        WNDCLASSEX wcex;
        MSG msg;
        HWND hWnd;       
        CoInitialize(NULL);
        //-------------------
        wcex.cbSize = sizeof(wcex);
        wcex.style = CS_CLASSDC;
        wcex.lpfnWndProc = (WNDPROC)WndProc;
        wcex.cbClsExtra = 0;
        wcex.cbWndExtra = 0;
        wcex.hInstance = hInst;
        wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground = NULL;
        wcex.lpszMenuName = NULL;
        wcex.lpszClassName = szWindowClass;
        wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
        if(!RegisterClassEx(&wcex))
                return FALSE;
        //----------------------
        hWnd = CreateWindow(szWindowClass, szTitle, WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, iWidth, iHeight, NULL, NULL, hInst, NULL);
        if(!hWnd)
                return FALSE;
        //----------------------
        ShowWindow(hWnd, SW_NORMAL);
        UpdateWindow(hWnd);
        //----------------------
        if(Init(hWnd) == TRUE)
        {
                while(true)
                {
                        if(PeekMessage(&msg, NULL,NULL,NULL,PM_REMOVE))
                        {
                                TranslateMessage(&msg);
                                DispatchMessage(&msg);
                                if(msg.message == WM_QUIT) break;
                        }
                        GraphEngine();
                }
        }
        //----------------------------
        if(pD3DDevice) {pD3DDevice = NULL; pD3DDevice = NULL;}
        if(pD3D) {pD3D = NULL; pD3D = NULL;}
        CoUninitialize();
        return 0;       
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,WPARAM wParam,LPARAM lParam)
{
        switch(message)
        {
        case WM_DESTROY:
                PostQuitMessage(0);
                break;
        default:
                return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
}
bool Init(HWND hWnd)
{
        if(DX3DInitZ(&pD3D, &pD3DDevice, hWnd,iWidth,iHeight,FALSE) != S_OK)
        {
                MessageBox(hWnd, (LPCWSTR)L"DirectX Initialize Error", (LPCWSTR)L"Error", MB_OK);
                return FALSE;
        }
        return TRUE;
}
void GraphEngine()
{
        pD3DDevice->Clear(0,NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f,0);
        if(SUCCEEDED(pD3DDevice->BeginScene()))
        {
                pD3DDevice->EndScene();
        }
        pD3DDevice->Present(NULL,NULL,NULL,NULL);
}

Ошибка 1 error LNK2001: неразрешенный внешний символ ""long __cdecl DX3DInitZ(struct IDirect3D9 * *,struct IDirect3DDevice9 * *,struct HWND__ *,unsigned long,unsigned long,int)" (?DX3DInitZ@@YAJPAPAUIDirect3D9@@PAPAUIDirect3DDevice9@@PAUHWND__@@KKH@Z)" directx.obj
Ошибка 2 fatal error LNK1120: 1 неразрешенных внешних элементов C:\MVS\p\directX\directx\Release\directx.exe

кто чего может подсказать?

pva 01-03-2010 23:32 1359181

делаешь поиск *.lib в папка_с_DX_SDK/lib, *.obj *.cpp в папке с проектом слова _DX3DInitZ. Если найдёшь cpp, то добавляешь его в проект, иначе lib, иначе obj. А если хочешь осознавать, что делаешь, то найди #include, который объявляет эту функцию. Если он в проекте, то ищи cpp, где он описан; если в папка_с_DX_SDK/include, то ищи в хелпе, какой к нему надо lib

котвася 04-03-2010 18:39 1361311

Яуже добавил lib в проект d3d9.lib d3dx9.lib.Делаю всё по книге. Хочю освоить технологию деректХ.
Правда не знаю для какого компилятора книга . Пишу в MVS2008 пробовол в BDS2006 но там еще больше ошибок, может в этом дело?


Время: 21:19.

Время: 21:19.
© OSzone.net 2001-