我使用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;
}
您曾经研究过视口(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);