2017-09-01 8 views
1

私のdx9アプリケーションに少し問題があります。 以下のコードを使用してフルスクリーンからウィンドウモードに切り替えると、クライアント領域のサイズが適切でない場合は小さくなります。 AdjustWindowRect関数は正しくタスクを実行していますが、SetWindowPosは正しいウィンドウサイズを設定していません。おそらく私は何かを逃しています。何か案は 。DX9がフルスクリーンからウィンドウに切り替えると、間違ったクライアントエリアが表示される

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

リセットを呼び出して、トグル後にデバイスをリセットする必要があります。 SetWindowLongPtrを呼び出す前にSetWindowPosを呼び出してください。 – Asesh

+0

デバイスをリセットすることをよく知っています。 SetWindowLongはSetWindowPosと同様に呼び出されます。問題は、なぜウィンドウに正しいクライアント領域がないのかということでした。 – Edspace

答えて

1

いくつかのより多くのあなたがSetWindowPosを使用して、デスクトップよりも大きいか、この場合には全画面表示から戻るあるウィンドウを作成しようとすると、ウィンドウがメッセージを送信すると、ウィンドウサイズがなることを発見し検索した後現在のデスクトップサイズよりも大きくならないように自動的に調整されます。

SWP_NOSENDCHANGINGフラグをSetWindowPos API呼び出しに追加すると、このようなことがなくなり、クライアントのサイズが必要なものになります。

関連する問題