DirectX 9 problem with rendering after window resize

sevko

Newcomer
Hi. I'm making a minesweeper programme using directx with WinApi to draw the tiles. I've noticed that when i resize the window the sprites resize with it automaticly. So the problem I have is when the difficulty is changed the window size changes accordingly. And after I change the window size it looks like this:
http://shrani.najdi.si/?1j/J5/2CGYvzSA/directxhalfsize.jpg

This makes sense because of the auto resize with the window resize so I decided I would just reinitialise DirectX so that the changed handle would be used to create the new D3D device. But when i reinitialise it it renders this:
http://shrani.najdi.si/?2m/t3/3eZqOnhn/diectxreinitialise.jpg
Just a black screen. Nor the Render or Initialise directx function return any errors. How could I fix this?



Render function
Code:
void Board::Render(){
RECT drawRect;
HRESULT hr=gD3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
if (FAILED(hr)){
  return;
}

hr=gD3dDevice->BeginScene();
if (SUCCEEDED(hr)){
  gSprite->Begin(D3DXSPRITE_ALPHABLEND);
  for (int i=0;i<Visina[NastavljenaTezavnost];i++)
   for (int j=0;j<Sirina[NastavljenaTezavnost];j++){
    drawRect.left=Square[i][j].Open*30*Square[i][j].Type;
    drawRect.right=drawRect.left+29;
       drawRect.top=30*Square[i][j].Status;
    drawRect.bottom=drawRect.top+29;
    gSprite->Draw(gTexture,&drawRect,NULL,&Square[i][j].Pos,0xFFFFFFFF);
  }
  gSprite->End();

  gD3dDevice->EndScene();
  gD3dDevice->Present(NULL,NULL,NULL,NULL);
}
}


Initialise Direct X function
Code:
bool InitialiseDirectX(HWND hWnd)
{
gD3dObject=Direct3DCreate9(D3D_SDK_VERSION);
if (gD3dObject==NULL)
  return FALSE;

D3DPRESENT_PARAMETERS presParams;
ZeroMemory(&presParams,sizeof(presParams));
presParams.Windowed=TRUE;
presParams.SwapEffect=D3DSWAPEFFECT_DISCARD;
presParams.BackBufferFormat=D3DFMT_UNKNOWN;
presParams.BackBufferCount=1;

HRESULT hr=gD3dObject->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
  D3DCREATE_HARDWARE_VERTEXPROCESSING, &presParams, &gD3dDevice);
if (FAILED(hr))
{
processing so fall back to software:
  hr=gD3dObject->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
   D3DCREATE_SOFTWARE_VERTEXPROCESSING, &presParams, &gD3dDevice);
  if (FAILED(hr))
   return FALSE;
}
return TRUE;
}


Part of the function where I change the window size according to the difficulty
Code:
if(Square[WindowSizeY][WindowSizeX].Type == 10 && Square[WindowSizeY][WindowSizeX].Status!=1)
        if(MessageBox(g_hWnd, "Poraz", "LOOLOL", MB_OK)){
            CreateBoard();
            CreateInstances();
            SetWindowPos(g_hWnd, HWND_TOP, 0, 0, (30*g_Board->Sirina[g_Board->NastavljenaTezavnost])+(2*SirinaRoba)+60,
                           (30*g_Board->Visina[g_Board->NastavljenaTezavnost])+VisinaRoba+VisinaKapsna+120,  SWP_NOMOVE | SWP_NOREPOSITION);
            SetWindowPos(g_hWnd_junior, HWND_TOP, 0, 0, (30*g_Board->Sirina[g_Board->NastavljenaTezavnost]),
                         (30*g_Board->Visina[g_Board->NastavljenaTezavnost]), SWP_NOMOVE | SWP_NOREPOSITION);
            if (gD3dObject){
                gD3dObject->Release();
                gD3dObject = NULL;
            }
            if (gD3dDevice){
                gD3dDevice->Release();
                gD3dDevice = NULL;
            }
            InitialiseDirectX(g_hWnd_junior);        
        }
 
You need to reset the device. If you don't do this it will use the old back buffer size and just scale it to the new window size.
 
Back
Top