Skip to main content
gamedev.net
🔒 Locked

Direct Draw

Started by wingman20 Apr 16, 2001 at 6:06 PM 1 replies 750+ views
Original Post
wingman20
wingman20
I have the following function: HRESULT Menu::InitDD(HWND hWnd, bool bWindowed) { CoInitialize(NULL); CoCreateInstance(CLSID_DirectDraw, NULL, CLSCTX_ALL, IID_IDirectDraw7, (void**)&lpdd7); if(FAILED(lpdd7->Initialize(NULL))) return E_FAIL; if(bWindowed){ if(FAILED(lpdd7->SetCooperativeLevel(hWnd, DDSCL_ALLOWREBOOT | DDSCL_NORMAL))) return E_FAIL; } else{ if(FAILED(lpdd7->SetCooperativeLevel(hWnd, DDSCL_ALLOWREBOOT | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN))) return E_FAIL; } DDSURFACEDESC2 ddsd; ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize=sizeof(ddsd); ddsd.dwFlags=DDSD_CAPS | DDSD_BACKBUFFERCOUNT; ddsd.dwBackBufferCount=1; ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP | DDSCAPS_VIDEOMEMORY; if(FAILED(lpdd7->CreateSurface(&ddsd, &lpddsPrimary, NULL))) return E_FAIL; ddsd.ddsCaps.dwCaps=DDSCAPS_BACKBUFFER; if(FAILED(lpddsPrimary->GetAttachedSurface(&ddsd.ddsCaps, &lpddsBack))) return E_FAIL; if(FAILED(lpddsPrimary->AddAttachedSurface(lpddsOffscreen))) return E_FAIL; ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize=sizeof(ddsd); ddsd.dwFlags=DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_CKSRCBLT; ddsd.dwWidth=30; ddsd.dwHeight=30; ddsd.ddckCKSrcBlt.dwColorSpaceLowValue=0; ddsd.ddckCKSrcBlt.dwColorSpaceHighValue=0; ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN; if(FAILED(lpdd7->CreateSurface(&ddsd, &lpddsMouse, NULL))) return E_FAIL; return S_OK; } when it executes (with bWindowed set to TRUE), lpdd7->CreateSurface returns DDERR_NOEXCLUSIVEMODE. how can i alter my code so it works in windowed mode? Also, AddAttachedSurface returns an error. Any ideas? Edited by - wingman20 on April 16, 2001 7:11:35 PM
os
os
I''m using DirecX6.0 but I think that I know what is a problem…
Only in Exclusive mode you can create both Primary & Back surfaces at once. In Windowed mode create primary and than back…..

RETDD( dd->SetCooperativeLevel( pWnd->GetSafeHwnd(),DDSCL_NORMAL ) );

INIT(DDSURFACEDESC2,ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
RETDD( dd->CreateSurface( &ddsd,&primary,NULL ) );

IDirectDrawClipper* clipper;
RETDD( dd->CreateClipper( 0,&clipper,NULL ) );
RETDD( clipper->SetHWnd( 0,pWnd->GetSafeHwnd() ) );
RETDD( primary->SetClipper( clipper ) );

RETIM( tback.CreateSurf( portw,porth,DDSCAPS_3DDEVICE ) );
back = tback.GetSurf();

good thing is macros !!!

#define INIT(type,obj) type obj; \
ZeroMemory( (void*)&obj,sizeof(type) ); \
obj.dwSize = sizeof(type);
os
os
Here is this func.....

HRESULT CreateSurf( int portw,int porth,DWORD caps = 0 )
{
szx = portw; szy = porth;
INIT(DDSURFACEDESC2,ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | caps;
ddsd.dwHeight = porth;
ddsd.dwWidth = portw;
RETDD( dd->CreateSurface( &ddsd,&surf,NULL ) );
return 0;
}

That''s all now !

< oscp.pochta.org >

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.