Reputation: 2655
I'm finding it hard to find good sources of information for explanations of DirectX API although I've been looking at the DirectX Documentation for a while.
I'm trying to create a method for a wrapper class for DX9 that changes the resolution during runtime. I've managed to handle this with DirectDraw but I find no information regarding DX9 even though it should be more common.
All I found was a reference to SetDisplayMode, but neither my Direct Object or my DirectX Device has this method.
I'm using DirectX 9.
Example method:
void SetResolution(int width, int height, int depth)
{
// I have access to DirectX device, object and the window HWND in this class
};
...do I change the HWND window size, or do I handle this in DirectX? I know how to change resolution in a Windows application but no clue how to do it in DX9.
Upvotes: 0
Views: 5661
Reputation: 153
Try adjusting your D3DPRESENT_PARAMETERS the way you normally would. Something like:
// D3DPRESENT_PARAMETERS is already defined as md3dPP
RECT R ={0, 0, 640, 480}
AdjustwindowRect(&R, WS_OVERLAPPEDWINDOW, false);
md3dPP.BackBufferFormat = D3DFMT_UNKNOWN;
md3dPP.BackBufferWidth = 640;
md3dPP.BackBufferHeight = 480;
md3dPP.Windowed = true;
If you wish, this might also be a good time to change the window style, such as:
SetWindowLongPtr(yourWindowHandle, GWL_STYLE, WS_OVERLAPPEDWINDOW)
// must use SetWindowPos for SetWindowLongPtr changes to take effect
SetWindowPos(yourWindowHandle, HWND_TOP, 100, 100, R.right, R.bottom, SWP_NOZORDER | SWP_SHOWWINDOW);
Alternatively, if you're using fullscreen:
md3dPP.BackBufferFormat = D3DFMT_X8R8G8B8;
md3dPP.BackBufferWidth = 640;
md3dPP.BackBufferHeight = 480;
md3dPP.Windowed = true;
SetWindowLongPtr(yourWindowHandle, GWL_STYLE, WS_POPUP)
// must use SetWindowPos for SetWindowLongPtr changes to take effect
SetWindowPos(yourWindowHandle, HWND_TOP, 0, 0, 640, 480, SWP_NOZORDER | SWP_SHOWWINDOW);
Either way, follow this up by calling IDirect3DDevice9::Reset. Just make sure you re-initialize your resources when resetting.
So if you defined something like: IDirect3DDevice9 *gd3dDevice;
Use:
gd3dDevice->Reset(&md3dPP);
Upvotes: 5
Reputation: 11606
When creating an IDirect3DDevice9
the resoltuion will be set using the D3DPRESENT_PARAMETERS
and the front buffer will be allocated. You cannot change the size of the buffer without recreating the entire device or calling IDirect3DDevice9::Reset.
Upvotes: 1