2

DirectX 10 アプリケーションで、フルスクリーンからの Alt タブ操作を適切に処理できるようにしようとしています。全画面表示からタブを切り替えると、アプリケーションは自動的にウィンドウ モードになります。

WM_ACTIVATEAPP をリッスンして、プログラムを手動で最小化および最大化しようとしました。動作しますが、既に動作していたプログラムの他の機能 (全画面表示とウィンドウ表示の切り替え) が壊れます。Alt タブから復元した後、最初に全画面表示から切り替えようとすると、黒い画面が点滅して全画面表示のままになり、2 回目には WM_ACTIVATEAPP がトリガーされ、適切にウィンドウ モードに入る代わりにプログラム全体が最小化されます。 .

以下は私が使用しているコードです:

WM_SIZE:

mD3D->ResizeBuffers(width, height);
mBufferWidth = width;
mBufferHeight = height;
mViewport.SetViewportRect(0, 0, width, height);
mD3D->GetDevice()->RSSetViewports(1, &mViewport.GetViewport());

WM_ACTIVATEAPP:

if(wParam == TRUE && mSwapChainDesc.Windowed == FALSE)
{
  // Restore
  ChangeDisplaySettings(NULL, CDS_FULLSCREEN);
  mSwapChain->SetFullscreenState(TRUE, NULL);
  mSwapChainDesc.Windowed = FALSE;
  ResizeBuffers(mBufferWidth, mBufferHeight);
}
else if(wParam == FALSE && mSwapChainDesc.Windowed == FALSE)
{
  // Minimize
  ShowWindow(hwnd, SW_SHOWMINNOACTIVE);
  mSwapChain->SetFullscreenState(FALSE, NULL);
  ChangeDisplaySettings(NULL, 0);
}

ウィンドウ モードの切り替え要求時:

if(mSwapChainDesc.Windowed)
{
  mSwapChain->SetFullscreenState(TRUE, NULL);
  mSwapChainDesc.Windowed = FALSE;
}
else
{
  mSwapChain->SetFullscreenState(FALSE, NULL);
  mSwapChainDesc.Windowed = TRUE;
}
ResizeBuffers(mBufferWidth, mBufferHeight);

リサイズバッファ:

mDevice->OMSetRenderTargets(0, 0, 0);

// Release all outstanding references to the swap chain's buffers.
mRenderTargetView->Release();

HRESULT hr;
// Preserve the existing buffer count and format.
// Automatically choose the width and height to match the client rect for HWNDs.
hr = mSwapChain->ResizeBuffers(1, width, height, DXGI_FORMAT_UNKNOWN, 0);

// Get buffer and create a render-target-view.
ID3D10Texture2D* pBuffer;
hr = mSwapChain->GetBuffer(0, __uuidof( ID3D10Texture2D), (void**) &pBuffer );

hr = mDevice->CreateRenderTargetView(pBuffer, NULL, &mRenderTargetView);
pBuffer->Release();

mDevice->OMSetRenderTargets(1, &mRenderTargetView, NULL );

// Set up the viewport.
D3D10_VIEWPORT vp;
vp.Width = width;
vp.Height = height;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
mDevice->RSSetViewports( 1, &vp );

ウィンドウを最小化しながら、DirectX 10 でウィンドウ表示と全画面表示を切り替える機能を維持するにはどうすればよいですか?

4

0 に答える 0