我有一个对话框,我基本上想要使用DirectX作为纹理查看器来实现。源纹理可以来自磁盘上的文件,也可以来自内存中的任意D3D纹理/表面。窗口将是可调整大小的,因此我需要能够相应地扩展其内容(保留纵横比,虽然没有必要,但是有用的知识)。
实施上述目标的最佳方式是什么?
答案 0 :(得分:1)
恕我直言,最简单的方法是创建一个四边形(或两个三角形),其顶点包含正确的UV坐标。 XYZ坐标设置为查看立方体坐标。这仅在单位矩阵设置为投影时有效。您可以在X和Y轴上使用-1到1。
编辑:这是一个例子:
答案 1 :(得分:1)
这是我用来保存可调整大小对话的大小和缩放的代码。我的纹理保存在内存位图中。如果你没有内存位图,我相信你可以适应。重要的是我确定正确的缩放因子以保留任何客户区域大小的宽高比
的方式CRect destRect( 0, 0, frameRect.Width(), frameRect.Height() );
if( txBitmapInfo.bmWidth <= frameRect.Width() && txBitmapInfo.bmHeight <= frameRect.Height() )
{
destRect.left = ( frameRect.Width() - txBitmapInfo.bmWidth ) / 2;
destRect.right = destRect.left + txBitmapInfo.bmWidth;
destRect.top = ( frameRect.Height() - txBitmapInfo.bmHeight ) / 2;
destRect.bottom = destRect.top + txBitmapInfo.bmHeight;
}
else
{
double hScale = static_cast<double>( frameRect.Width() ) / txBitmapInfo.bmWidth;
double vScale = static_cast<double>( frameRect.Height() ) / txBitmapInfo.bmHeight;
if( hScale < vScale )
{
int height = static_cast<int>( frameRect.Width() * ( static_cast<double>(txBitmapInfo.bmHeight) / txBitmapInfo.bmWidth ) );
destRect.top = ( frameRect.Height() - height ) / 2;
destRect.bottom = destRect.top + height;
}
else
{
int width = static_cast<int>( frameRect.Height() * ( static_cast<double>(txBitmapInfo.bmWidth) / txBitmapInfo.bmHeight ) );
destRect.left = ( frameRect.Width() - width ) / 2;
destRect.right = destRect.left + width;
}
}
希望这有帮助!