2017-09-01 5 views
1

Ein bisschen ein Problem in meiner dx9-Anwendung. Wenn ich vom Vollbildmodus in den Fenstermodus zurückwechsle, ist der Client-Bereich mit dem unten stehenden Code nicht die richtige Größe, er ist kleiner. Die AdjustWindowRect-Funktion führt ihre Aufgabe korrekt aus, aber SetWindowPos legt nicht die richtige Fenstergröße fest. Vielleicht vermisse ich etwas. Irgendwelche Ideen .DX9 Wechsel von Vollbild zu Fenster geben falschen Client-Bereich

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

Sie müssen das Gerät nach dem Umschalten durch Zurücksetzen zurücksetzen. Versuchen Sie, SetWindowLongPtr aufzurufen, bevor Sie SetWindowPos aufrufen – Asesh

+0

Gut, dass Sie das Gerät zurücksetzen. Das wird woanders gemacht, SetWindowLong wird genauso aufgerufen wie SetWindowPos. Die Frage war, warum das Fenster nicht den richtigen Clientbereich hat. – Edspace

Antwort

1

Nach einigem Suchen mehr entdeckt, dass, wenn Sie SetWindowPos verwenden und versuchen, ein Fenster zu machen, die größer ist als die Desktop ist oder wenn in diesem Fall von Vollbild zurückkehrt, Fenster wird eine Nachricht zu senden, und die Fenstergröße wird automatisch angepasst, um es nicht größer als die aktuelle Desktopgröße zu machen.

Das Hinzufügen des SWP_NOSENDCHANGING-Flags im SetWindowPos-API-Aufruf verhindert, dass dies geschieht, und die Client-Größe entspricht der von Ihnen gewünschten Größe.