DDraw Windowed

Started by
3 comments, last by Mafian 20 years, 2 months ago
Yo yo, DDraw in fullscreen mode is easy. But I cant figure out windowed mode! Microsoft documentation sucks, they use CDisplay or something... I dont want to use that, and Im sure theres a way to set it up differently to go windowed. Here is my code to set up DDraw fullscreen mode, and all I could use is a modification of it to go windowed.
    
//STEP 1: Create Direct Draw Object

if(DirectDrawCreate(NULL, &m_Reg_Members.lpDD, NULL)!=DD_OK)
	return E_FAIL;
//STEP 2: Set Cooperative Level with Windows

if(m_Reg_Members.lpDD->SetCooperativeLevel(hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN)!=DD_OK)
	return E_FAIL;
//STEP 3: Set Dispay Mode

	if(m_Reg_Members.lpDD->SetDisplayMode(m_ScreenX, m_ScreenY, m_ScreenDepth)!=DD_OK)
		return E_FAIL;
//STEP 4: Set Up Primary Surface

DDSURFACEDESC ddsd;
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount = 1;
//STEP 5: Create Primary Surface

if(m_Reg_Members.lpDD->CreateSurface(&ddsd, &m_Reg_Members.lpPrimary, NULL)!=DD_OK)
	return E_FAIL;
//STEP 8: Attach Secondary Surface to Primary Surface

DDSCAPS ddscaps;
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
if(m_Reg_Members.lpPrimary->GetAttachedSurface(&ddscaps, &m_Reg_Members.lpSecondary)!=DD_OK)
	return E_FAIL;
//STEP 11: Create and attach clipper to Secondary

LPDIRECTDRAWCLIPPER lpClipper;
if(m_Reg_Members.lpDD->CreateClipper(NULL, &lpClipper, NULL)!=DD_OK)
	return E_FAIL;
if(lpClipper->SetHWnd(NULL, hwnd)!=DD_OK)
	return E_FAIL;
if(m_Reg_Members.lpSecondary->SetClipper(lpClipper)!=DD_OK)
	return E_FAIL;
    
[edited by - Mafian on October 18, 2002 6:14:10 PM]
KA-BOOM!
Advertisement
A few key differences between windowed and exclusive (fullscreen) DirectDraw is that you must set the cooperation level to DDSCL_NORMAL, you can't set the display mode (you have to use the user's desktop's display mode) and you can't have a backbuffer (at least not the conventional kind you can Flip (), but you can make your own).

As for the actual code, here is a good article by null_pointer:

Part1 - http://www.gamedev.net/reference/articles/article960.asp
Part2 - http://www.gamedev.net/reference/articles/article1034.asp

Good luck!

[edited by - JonWoyame on October 18, 2002 6:34:33 PM]
No backbuffer??? Woa!

"Did they tell Picasso ''no brush''?"
- hair stylist dude from The Rock
KA-BOOM!
No backbuffer??? Woa!

Read again. You *CAN* have a backbuffer in windowed mode.

However the backbuffer can''t be part of a flip chain or be flipped in the same way as it can in fullscreen mode. When you consider that the whole of the desktop is the primary buffer in windowed mode this makes perfect sense.

What you do in windowed mode is Blt() from your backbuffer (simply an offscreen surface) to the primary buffer.
Since the Blt() will overwrite what''s already on the primary surface, the behaviour is different, but that should only be an issue for you if your app relies on the back buffer containing the previous primary buffer contents.
Instead it simply contains the previous backbuffer contents.



--
Simon O''Connor
Creative Asylum Ltd
www.creative-asylum.com

Simon O'Connor | Technical Director (Newcastle) Lockwood Publishing | LinkedIn | Personal site

Thanks, will have to check out the articles!

This topic is closed to new replies.

Advertisement