Voisiko joku kertoa, mikä on seuraavassa listauksessa vialla taikka turhaa? Minulla on DirectX 6:seen perustuva oppikirja, ja olen impannut koneeseen dx9sdk:n kamat. Ja niin, olen aloittelija! Eli lista on tässä:
By the way, jos ihmettelette tuota lpdd7:aa, niin kirjassa 4 oli siis dx6, joten oletin että 7 olisi silloin 9. En tiedä pitääkö paikkansa...
// DDraw1.cpp
//
#define WIN32_LEAN_AND_MEAN
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#include "stdafx.h"
#include "ddraw.h"
#define WINDOW_CLASS_NAME "WINCLASS1"
// FUNKTIOT
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{
PAINTSTRUCT ps;
HDC hdc;
switch(msg)
{
case WM_CREATE:
{
return 0;
} break;
case WM_PAINT:
{
hdc = BeginPaint(hwnd, &ps);
EndPaint(hwnd, &ps);
return 0;
} break;
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
} break;
default:break;
} // End switch
return (DefWindowProc(hwnd, msg, wparam, lparam));
} // End WinProc
////// WINMAIN //////
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASSEX winclass;
HWND hwnd;
MSG msg;
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);
if (!(RegisterClassEx(&winclass)))
return 0;
if (!(hwnd = CreateWindowEx(NULL,
WINDOW_CLASS_NAME,
"Draw",
WS_POPUP | WS_VISIBLE,
0,0,
SCREEN_WIDTH,
SCREEN_HEIGHT,
NULL,
NULL,
hInstance,
NULL)))
return 0;
while (1)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
////// DIRECTX JUTTU //////
srand(GetTickCount());
LPDIRECTDRAW lpdd = NULL;
LPDIRECTDRAW lpdd7 = NULL;
LPDIRECTDRAWSURFACE7 lpddsprimary = NULL;
DDSURFACEDESC2 ddsd;
LPDIRECTDRAWPALETTE lpddpal = NULL;
PALETTEENTRY palette[256];
// Luodaan ensin perus-IDirectDraw-rajapinta
(DirectDrawCreate(NULL, &lpdd, NULL));
// Kysytään nyt IDirectDraw7:ää
lpdd->QueryInterface(IID_IDirectDraw7, (LPVOID*)&lpdd7)
// vapauta lpdd;
lpdd->Release();
// aseta yhteistyötaso koko ruudun tilaa varten
lpdd7->SetCooperativeLevel(hwnd,
DDSCL_FULLSCREEN |
DDSCL_ALLOWMODEX |
DDSCL_EXCLUSIVE |
DDSCL_ALLOWREBOOT);
// aseta näyttötilaksi 640x480x8
lpdd7->SetDisplayMode(640,480,8);
// tyhjennä ddsd ja aseta koko
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
// laita voimassaolevat kentät päälle
ddsd.dwFlags = DDSD_CAPS;
// pyydä ensisijaista pintaa
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
// luo ensisijainen pinta
lpdd7->CreateSurface(&ddsd, &lpddsprimary, NULL);
// rakenna palettidatataulukko
for (int color=1; color < 255; color )
{
palette[color].peRed = rand()%6;
palette[color].peGreen = rand()%6;
palette[color].peBlue = rand()%6;
palette[color].peFlags = PC_NOCOLLAPSE;
}
palette[0].peRed = 0;
palette[0].peGreen = 0;
palette[0].peBlue = 0;
palette[0].peFlags = PC_NOCOLLAPSE;
palette[255].peRed = 255;
palette[255].peGreen = 255;
palette[255].peBlue = 255;
palette[255].peFlags = PC_NOCOLLAPSE;
// luo palettiolio
lpdd7->CreatePalette(DDPCAPS_8BIT | DDPCAPS_ALLOW256 | DDPCAPS_INITIALIZE,
palette, &lpddpal, NULL);
// kiinnitä paletti lopuksi ensisijaiseen pintaan
lpddsprimary->SetPalette(lpddpal);
// lukitaan pinta ja haetaan muistiosoitin ja muistitiheys
// Tyhjennä ddsd ja aseta koko
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
lpddsprimary->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR |
DDLOCK_WAIT, NULL);
// nyt ddsd.lPitch on voimassa, kuten myös ddsd.lpSurface
int mempitch = (int)ddsd.lPitch;
UCHAR *video_buffer = (UCHAR *)ddsd.lpSurface;
// Piirrä 1000 satunnaista pixeliä satunnaisilla väreillä ensisijaiselle
// pinnalle. Ne tulevat näkyviin välittömästi.
for (int index=0; index < 1000; index )
{
UCHAR color = rand()%6;
int x = rand()d0;
int y = rand()H0;
video_buffer[x y*mempitch] = color;
}
// avaa ensisijaisen pinnan lukitus
lpddsprimary->Unlock(NULL);
}
return (msg.wParam);
return 0;
}
Mikä siis mättää kun saan virheilmoituksen:
ddraw1.cpp(146) : error C2664: 'CreateSurface' : cannot convert parameter 1 from 'struct _DDSURFACEDESC2 *' to 'struct _DDSURFACEDESC *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
By the way, jos ihmettelette tuota lpdd7:aa, niin kirjassa 4 oli siis dx6, joten oletin että 7 olisi silloin 9. En tiedä pitääkö paikkansa...
// DDraw1.cpp
//
#define WIN32_LEAN_AND_MEAN
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#include "stdafx.h"
#include "ddraw.h"
#define WINDOW_CLASS_NAME "WINCLASS1"
// FUNKTIOT
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{
PAINTSTRUCT ps;
HDC hdc;
switch(msg)
{
case WM_CREATE:
{
return 0;
} break;
case WM_PAINT:
{
hdc = BeginPaint(hwnd, &ps);
EndPaint(hwnd, &ps);
return 0;
} break;
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
} break;
default:break;
} // End switch
return (DefWindowProc(hwnd, msg, wparam, lparam));
} // End WinProc
////// WINMAIN //////
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASSEX winclass;
HWND hwnd;
MSG msg;
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);
if (!(RegisterClassEx(&winclass)))
return 0;
if (!(hwnd = CreateWindowEx(NULL,
WINDOW_CLASS_NAME,
"Draw",
WS_POPUP | WS_VISIBLE,
0,0,
SCREEN_WIDTH,
SCREEN_HEIGHT,
NULL,
NULL,
hInstance,
NULL)))
return 0;
while (1)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
////// DIRECTX JUTTU //////
srand(GetTickCount());
LPDIRECTDRAW lpdd = NULL;
LPDIRECTDRAW lpdd7 = NULL;
LPDIRECTDRAWSURFACE7 lpddsprimary = NULL;
DDSURFACEDESC2 ddsd;
LPDIRECTDRAWPALETTE lpddpal = NULL;
PALETTEENTRY palette[256];
// Luodaan ensin perus-IDirectDraw-rajapinta
(DirectDrawCreate(NULL, &lpdd, NULL));
// Kysytään nyt IDirectDraw7:ää
lpdd->QueryInterface(IID_IDirectDraw7, (LPVOID*)&lpdd7)
// vapauta lpdd;
lpdd->Release();
// aseta yhteistyötaso koko ruudun tilaa varten
lpdd7->SetCooperativeLevel(hwnd,
DDSCL_FULLSCREEN |
DDSCL_ALLOWMODEX |
DDSCL_EXCLUSIVE |
DDSCL_ALLOWREBOOT);
// aseta näyttötilaksi 640x480x8
lpdd7->SetDisplayMode(640,480,8);
// tyhjennä ddsd ja aseta koko
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
// laita voimassaolevat kentät päälle
ddsd.dwFlags = DDSD_CAPS;
// pyydä ensisijaista pintaa
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
// luo ensisijainen pinta
lpdd7->CreateSurface(&ddsd, &lpddsprimary, NULL);
// rakenna palettidatataulukko
for (int color=1; color < 255; color )
{
palette[color].peRed = rand()%6;
palette[color].peGreen = rand()%6;
palette[color].peBlue = rand()%6;
palette[color].peFlags = PC_NOCOLLAPSE;
}
palette[0].peRed = 0;
palette[0].peGreen = 0;
palette[0].peBlue = 0;
palette[0].peFlags = PC_NOCOLLAPSE;
palette[255].peRed = 255;
palette[255].peGreen = 255;
palette[255].peBlue = 255;
palette[255].peFlags = PC_NOCOLLAPSE;
// luo palettiolio
lpdd7->CreatePalette(DDPCAPS_8BIT | DDPCAPS_ALLOW256 | DDPCAPS_INITIALIZE,
palette, &lpddpal, NULL);
// kiinnitä paletti lopuksi ensisijaiseen pintaan
lpddsprimary->SetPalette(lpddpal);
// lukitaan pinta ja haetaan muistiosoitin ja muistitiheys
// Tyhjennä ddsd ja aseta koko
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
lpddsprimary->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR |
DDLOCK_WAIT, NULL);
// nyt ddsd.lPitch on voimassa, kuten myös ddsd.lpSurface
int mempitch = (int)ddsd.lPitch;
UCHAR *video_buffer = (UCHAR *)ddsd.lpSurface;
// Piirrä 1000 satunnaista pixeliä satunnaisilla väreillä ensisijaiselle
// pinnalle. Ne tulevat näkyviin välittömästi.
for (int index=0; index < 1000; index )
{
UCHAR color = rand()%6;
int x = rand()d0;
int y = rand()H0;
video_buffer[x y*mempitch] = color;
}
// avaa ensisijaisen pinnan lukitus
lpddsprimary->Unlock(NULL);
}
return (msg.wParam);
return 0;
}
Mikä siis mättää kun saan virheilmoituksen:
ddraw1.cpp(146) : error C2664: 'CreateSurface' : cannot convert parameter 1 from 'struct _DDSURFACEDESC2 *' to 'struct _DDSURFACEDESC *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Vastaukset 5
Vanhimmat
DDSURFACEDESC ddsd; //Poista se kakkonen.
Mä kokeilin tuota jo aikaisemmin, mutta ei auttanut. Heittää herjan:
error C2664: 'Lock' : cannot convert parameter 2 from 'struct _DDSURFACEDESC *' to 'struct _DDSURFACEDESC2 *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Ja vielä alkuperäisen ko. virheen lisäksi.
Onko mitään tietoa, miten directx 9:n rajapintaa haetaan? Onko sen tunnus tuo
IID_IDirectDraw7?
Unohtakaa noi virheilmoitukset! Taitaa olla kaikki kiinni siitä että kutsun jotain olematonta directx:ää tuolla IID_IDirectDraw7 -kyselyllä. Mutta jos joku kertois mikä on oikea merkkisarja, niin olisin kiitollinen! Säästyisi aikaa SDK -dokujen selauksessa...
DirectX 8:ssa DirectDraw ja Direct3D yhditettiin DirectX Graphics liittymäksi (ja 9:ssä niin on edelleen), ,joka eroaa paljon DX 7:sta.
Mutta DirectX on alaspäin yhteensopiva, joten koodisi(DX 7) pitäisi toimia uudemmallakin DX:llä.
DirectDraw7 on DirectX 7:aa..(DX:n versiosysteemi on välillä aika outo DirectDraw4(DX 6) -> DirectDraw7(DX 7) :)
Muistaakseni DX 7:ssa CreateSurface metodi vaihtui CreateSurfaceEx:ksi. Eli ongelma on varmaankin siinä.
Ja kannattaa muuten hankkia jostain DX SDK 7
, koska DX 9:n SDK:sta et löydä mitään tietoa DX 7:n metodeista.
Mutta varmaankin minun kannattaisi aluksi ladata dx6sdk, jotta saan ohjelmat tehtyä, koska oppikirja on noilta ajoilta? Eli siis minulla voi olla dx6sdk, vaikka kone käyttää dx9 runtimea (menikö oikein)? Sen pitäisi toimia siis niinkin? Hemmetti, kun osaa olla vaikeata löytää ajankohtaista oppimateriaalia! :) Kiitokset kuitenkin! Sentään joku uskalsi vastata! :D