Resizing display to window size

Started by
5 comments, last by Ichigo 17 years, 11 months ago
Hi, I think this is quite a common problem but I couldn't find my exact problem answered via searching. I'm making an application which uses DirectX to draw 2D graphics to a window. However, when I resize the window DirectX does the usual stretch to window size as described by the docs in Present(). Instead, I want resizing the window to expose more or less of the backbuffer. How can I do this? I could either have a really large backbuffer and work out a way of exposing more or less of it, or I could use Reset() every time the window is resized. I'd rather not reset because all my textures would be lost; recreating them is potentially slow and seems overkill for a simple window resize. Also I'd like to show the window correctly during the user's drag and resetting every frame for that is surely a bad idea. Any help appreciated.
Construct (Free open-source game creator)
Advertisement
Have a look at how the SDK samples do this. From what I can see (guessing here, I'm at work and don't have the SDK to hand), it just stretches the backbuffer in WM_SIZING, and Reset()s when the resize is complete.

Your best bet is probably doing the same.
Look into the 4 parameters you supply to Present(). By setting the source RECT to be the size of the window, you'd be "selecting" only a portion of the backbuffer.

From what you explained, I understood this was what you wanted to do - only use a part of the backbuffer when presenting, depending on the window size...

Hope this helps.
Sirob Yes.» - status: Work-O-Rama.
Thanks, that was what I was looking for!
Construct (Free open-source game creator)
Quote:Original post by Evil Steve
Have a look at how the SDK samples do this. From what I can see (guessing here, I'm at work and don't have the SDK to hand), it just stretches the backbuffer in WM_SIZING, and Reset()s when the resize is complete.

Your best bet is probably doing the same.


Do you mean doing something like this?

case WM_SIZING:{	//Reset Direct3D device	D3DPRESENT_PARAMETERS pre_param;	ZeroMemory( &pre_param, sizeof(pre_param) );	pre_param.Windowed = TRUE;	pre_param.SwapEffect = D3DSWAPEFFECT_DISCARD;	pre_param.BackBufferFormat = D3DFMT_UNKNOWN;	pre_param.PresentationInterval = D3DPRESENT_INTERVAL_ONE;	pre_param.EnableAutoDepthStencil= TRUE;	pre_param.AutoDepthStencilFormat = D3DFMT_D24S8;		HRESULT hr = s_d3d_device->Reset(&pre_param);	if( FAILED(hr) )	{		DXTRACE_ERR_MSGBOX(L"Failed to reset device",hr);	}}


When I do this I get: D3DERR_INVALIDCALL.

Should I do something else in the code before calling Reset?
Have a nice day ^^
Yes, you have to release anything that was created in the default pool.

Additional you should activate the debug runtime. It will give you more details when a call failed.
I thought I had everything in D3DPOOL_MANAGED. But I forgot the ID3DXFont I was using for output ^^;;

Thank you Demirug
Have a nice day ^^

This topic is closed to new replies.

Advertisement