如何防止DirectX C ++程序的扩展/缩放

问题描述 投票:0回答:1

我使用DirectX9构建了一个非常简单的C ++程序,该程序在屏幕上显示图像和文本。我已经将它编译为1024 x 768,并且我想确保它在任何屏幕分辨率下都兼容。尝试在1920 x 1080监视器上运行我的可执行文件时,该程序会自动水平拉伸(因为此监视器是宽屏),并且会扭曲图像和文本。有人告诉我,在初始化DirectX时有一个我可以更改的标志,这将防止任何拉伸,并确保程序打开时两侧均带有垂直黑条以保留我所需的所有格式。有人知道怎么做这个吗?这是我的代码的摘要,该代码启发了DirectX。 PS:我将刷新率设置为0,以便我的程序将以任何监视器的本机刷新率运行。谢谢!

/*-----------------------------------------------------------------------------
Name: InitD3D()
Desc: Creates the D3D object using Direct3D
-------------------------------------------------------------------------------*/
HRESULT InitD3D(HWND hWnd) {
   if (NULL == (pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
      return E_FAIL;

   D3DPRESENT_PARAMETERS d3dpp;
   ZeroMemory(&d3dpp, sizeof(d3dpp));
   d3dpp.Windowed = FALSE;
   d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
   d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
   d3dpp.BackBufferCount = 1;
   d3dpp.BackBufferWidth = 1024;
   d3dpp.BackBufferHeight = 768;
   d3dpp.FullScreen_RefreshRateInHz = 0;

   if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
      &d3dpp, &pd3dDevice)))
      return E_FAIL;

   return S_OK;
}
c++ winapi visual-studio-2017 directx screen-resolution
1个回答
0
投票

您曾经研究过视口(D3DEVIEWPORT9),就可以通过此结构在窗口上设置图像的位置。然后有一个API来获取监视器的分辨率。显示器的分辨率减去图像的分辨率,最后除以2,结果就是屏幕上图像左上角的位置。以下代码供您参考。

int nScreenWidth, nScreenHeight;
nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
D3DEVIEWPORT9 vp = { (nScreenWidth - 1024) / 2,(nScreenHeight - 768) / 2,1024,768,0,1 };
pd3dDevice->SetViewport(&vp);
© www.soinside.com 2019 - 2024. All rights reserved.