2017-09-01 4 views
1

J'ai un peu de problème avec mon application dx9. Lorsque je repasse du mode plein écran au mode fenêtré en utilisant le code ci-dessous, la taille de la zone client n'est pas la bonne, elle est plus petite. La fonction AdjustWindowRect effectue correctement sa tâche, mais SetWindowPos ne définit pas la taille de la fenêtre. Peut-être qu'il me manque quelque chose. Des idées .La commutation DX9 de plein écran vers la fenêtre donne une mauvaise zone client

if (d3dpp.Windowed && resChoice == resolutionchoice) return false; // already in window mode and same resolution 
            //MessageBox(NULL, L"switching to window", L"ERROR", MB_OK); 
     resChoice = resolutionchoice; 
     screenWidth = resolutionwidth[resChoice]; 
     screenHeight = resolutionheight[resChoice]; 
     d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; // set the back buffer format to 32-bit 
     d3dpp.BackBufferWidth = screenWidth; // set the width of the buffer 
     d3dpp.BackBufferHeight = screenHeight; // set the height of the buffer 
     d3dpp.Windowed = true; 

     SetWindowLong(hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW); // WS_CAPTION | WS_SYSMENU | WS_VISIBLE | WS_MINIMIZEBOX); 
     // need to call SetWindowPos as well 
     string values; 
     RECT r = { 0,0,screenWidth,screenHeight }; 

     AdjustWindowRect(&r, WS_OVERLAPPEDWINDOW, false); 

     values = std::to_string(r.left); 
     OutputDebugStringA("Adjust area = "); 
     OutputDebugStringA(values.c_str()); OutputDebugStringA(","); 
     values = std::to_string(r.top); 
     OutputDebugStringA(values.c_str()); OutputDebugStringA(","); 
     values = std::to_string(r.right); 
     OutputDebugStringA(values.c_str()); OutputDebugStringA(","); 
     values = std::to_string(r.bottom); 
     OutputDebugStringA(values.c_str()); OutputDebugStringA("\n"); 

     SetWindowPos(hWnd, HWND_TOP, r.left, r.top, r.right - r.left , r.bottom - r.top, SWP_NOZORDER | SWP_SHOWWINDOW | SWP_FRAMECHANGED);// 
     //screenWidth = SCREEN_WIDTH; 
     //screenHeight = SCREEN_HEIGHT; 
     //windowXscale = 1; 
     //windowYscale = 1; 
     GetClientRect(hWnd, &r); 

     values = std::to_string(r.left); 
     OutputDebugStringA("Client area = "); 
     OutputDebugStringA(values.c_str()); OutputDebugStringA(","); 
     values = std::to_string(r.top); 
     OutputDebugStringA(values.c_str()); OutputDebugStringA(","); 
     values = std::to_string(r.right); 
     OutputDebugStringA(values.c_str()); OutputDebugStringA(","); 
     values = std::to_string(r.bottom); 
     OutputDebugStringA(values.c_str()); OutputDebugStringA("\n"); 
    } 
+0

Vous devrez réinitialiser l'appareil après avoir basculé en appelant Reset. Essayez d'appeler SetWindowLongPtr avant d'appeler SetWindowPos – Asesh

+0

Bien conscient de la réinitialisation de l'appareil. Cela se fait ailleurs, SetWindowLong est appelé ainsi que SetWindowPos. La question était pourquoi la fenêtre n'a pas la zone client correcte. – Edspace

Répondre

1

Après un peu plus à la recherche ont découvert que si vous utilisez SetWindowPos et essayez de faire une fenêtre qui est plus grand que le bureau ou lors du retour de plein écran dans ce cas, Windows envoie un message et la taille de la fenêtre seront ajusté automatiquement pour ne pas dépasser la taille actuelle du bureau. L'ajout d'un indicateur SWP_NOSENDCHANGING dans l'appel de l'API SetWindowPos arrête cela et la taille du client correspond à ce que vous vouliez.