2015-01-22 16 views
1

데스크톱 응용 프로그램 :다이렉트 X 11에서 창 크기를 변경하는 방법 나는이 MSDN의 링크에서 튜토리얼을 기반으로 다이렉트 X 11 쉐이더 프로그램을 쓰고 있어요

https://msdn.microsoft.com/en-us/library/windows/desktop/jj552952.aspx

내가 그것을 실행하면 전체 화면입니다. 스왑 체인 크기를 변경해도 예상대로 창 크기가 변경되지 않습니다. 창 크기를 변경하는 방법이 있습니까? 간단하게 고정 된 크기로 창을 만들고 싶고 전체 화면을 덮어 버리는 경우 독점적 인 전체 화면으로 만들고 싶습니다.

IDXGISwapChain1 :: GetHwnd 메서드를 사용하여 스왑 체인에서 HWND를 가져올 수 있습니다. 이 핸들을 사용하면 창 크기를 조정하는 데 유용할까요?

대응하는 코드

는 여기에서 찾을 수 있습니다 :

https://code.msdn.microsoft.com/windowsdesktop/Direct3D-Tutorial-Win32-829979ef

답변

1

가 전체 화면 전용 모드 전환을 지원하지 않습니다하지만 당신은 창 크기 조정을 처리하는 Direct3D Win32 Game VS 2013에서 Win32 데스크톱 응용 프로그램 템플릿을 봐야한다 .

Win32 데스크톱 응용 프로그램에서 Direct3D 11에 대한 윈도우 크기 조정의 기본 처리 방법은 WM_SIZE을 처리하도록 윈도우 프로 시저를 업데이트하는 것이지만 많은 경우에 대처해야합니다.

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    static bool s_in_sizemove = false; 
    static bool s_minimized = false; 

    switch (message) 
    { 

... 

    case WM_SIZE: 
     if (wParam == SIZE_MINIMIZED) 
     { 
// The window was minimized (you should probably suspend the application) 
      if (!s_minimized) 
      { 
       s_minimized = true; 
      } 
     } 
     else if (s_minimized) 
     { 
// The window was minimized and is now restored (resume from suspend) 
      s_minimized = false; 
     } 
     else if (!s_in_sizemove) 
     { 
// Here is where you handle the swapchain resize for maximize or unmaximize 
     } 
     break; 

    case WM_ENTERSIZEMOVE: 
// We want to avoid trying to resizing the swapchain as the user does the 'rubber band' resize 
     s_in_sizemove = true; 
     break; 

    case WM_EXITSIZEMOVE: 
     s_in_sizemove = false; 
// Here is the other place where you handle the swapchain resize after the user stops using the 'rubber-band' 
     break; 

    case WM_GETMINMAXINFO: 
     { 
// We want to prevent the window from being set too tiny 
      auto info = reinterpret_cast<MINMAXINFO*>(lParam); 
      info->ptMinTrackSize.x = 320; 
      info->ptMinTrackSize.y = 200; 
     } 
     break; 

... 

은 Direct3D를 swapchain 크기 조정을 수행합니다 널 (null)와

  • 전화 ID3D11DeviceContext::OMSetRenderTargets을 렌더링 타겟 및 깊이/스텐실 버퍼 바인딩을 해제 할 수 있습니다.
  • 렌더링 대상보기 및 심도/스텐실보기 및 원래의 백 버퍼 또는 깊이/스텐실 버퍼에 대한 다른 참조를 해제하십시오.
  • 변경 사항을 완료하기 위해 으로 전화하십시오.
  • IDXGISwapChain::ResizeBuffers을 호출하여 새 크기로 백 버퍼의 크기를 조정하십시오. DXGI_ERROR_DEVICE_REMOVEDDXGI_ERROR_DEVICE_RESET 오류에 응답해야합니다.
  • 새로운 크기에 대해 초기 설정을 다시 수행하십시오. 새 백 버퍼에 대한 렌더 타겟보기를 만들고, 새로운 백 버퍼 크기와 일치하는 깊이/스텐실 버퍼에 대한 깊이 스텐실 뷰를 새로 만듭니다 (옵션) 뷰포트 크기를 재설정합니다.

이 절차에서는 응용 프로그램에 대한 몇 가지 가정 사항이 있으므로 간단하게하기 위해 Win32 데스크톱 자습서에서 생략했습니다. 이 경우는 Direct3D Win32 Game 템플리트, Windows Store DirectX app 템플리트 및 Windows phone DirectX app 템플리트에 대해 처리됩니다.

Windows Store 응용 프로그램이나 Windows 전화 응용 프로그램에는 '전체 화면 전용 모드'와 같은 것이 없으므로 해당 템플릿은이를 구현하지 않습니다.

dxgiFactory->MakeWindowAssociation(hwnd, DXGI_MWA_NO_ALT_ENTER); 

내가 전체 지원하기 위해 Direct3D를 Win32에서 게임 템플릿을 확장하는 방법을 다시 방문 희망 :는 Win32 바탕 화면 튜토리얼과 Direct3D를 Win32에서 게임 템플릿, 나는 그것을 대처할 필요가 없습니다 보장하기 위해 다음 사용 화면 전용 모드이지만 아직 익숙하지 않았습니다.

+0

ResizeBuffers가 창 크기를 변경하지 않는다고 생각합니까? 링크의 템플릿에는 쉐이더 코드가 없으므로 독점적 인 전체 화면 모드가 필요합니다.사실 단순히 고정 된 크기로 창을 만들고 싶고 전체 화면을 덮어 버리는 경우 전체 화면 만 독점해야합니다. – user1161656

+0

세 가지 선택이 있습니다 : (1) 창을 고정 크기로 전체 화면으로 만들고 이동/크기 조정을위한 컨트롤을 포함하지 않습니다. (2) 창을 고정 크기로 전체 화면으로 만들고 컨트롤을 포함시키지 마십시오. border (때때로 "fake fullscreen"이라고도 함), (3) 실제로 DXGI를 사용하여 독점적 인 전체 화면 모드로 만듭니다. –