用WTL的文件对话框打开图片,D3D渲染
程序员文章站
2022-05-29 09:57:32
...
演示程序下载:http://download.csdn.net/detail/jiangcaiyang123/4061511
程序还不如人意(Bug included),我只是为了阐述一个技术点而进行的实验。请见谅。
谁说WTL的作用不大?在我还未了解开源的界面库之前,使用WTL成为了我的唯一选择。还有一个原因是我没有学过MFC。通常来说,使用标准的界面来选择一个文件来载入对我们来说已经够用了。如果你富有余力,可以自己动手使用DirectX来实现文件对话框。当然如果你是拥有至少半年经验的DXUT程序员,你可以求助它。我看到DXUT写的一个CustomUI程序例子,我真的好想了解这里面究竟是怎么实现的啊。可惜这个采用了DXUT框架,要学这个框架还要好一些功夫呢。
好了,言归正传。这个例子程序的特点之一就是结合了WTL/ATL和DirectX。使用WTL现成的一个文件对话框来选择一个图像文件,这个图像文件的格式可以使JPG和PNG。当然其它的图片也是可以的,只要图片文件合法且不要过大。随后使用D3D来载入图像,形成一个纹理。渲染纹理使用了最简单的滤波方式,所以图像看起来可能有些锯齿。
下载了演示程序的人会发现,这个程序可以独立运行,并且可以显示两个图片。那么这又是怎么做到的呢?我采取的方法是将两个图片做成资源嵌入程序中,VS允许我们这么做。然后我们也必须从资源中载入图像出来,DirectX也允许我们这么做,但是有一些限制。数年前我也想了很多办法,但都失败了。直到有一次,我在GameRes的一个帖子里面发现了载入的方法。现在以我这个演示程序为例,说明一下载入的步骤。(我的是VS2005,理论上其余的版本都应该有效。)
这是我开发时候的截图:
首先点击“添加→资源”,如下图所示。
选择“导入”,如下图所示。
文件类型选“所有文件”,然后点击我们想要载入的.png或者是.jpg文件,点击打开。如下图所示。
在自定义资源类型对话框中,输入RC_DATA,然后点确定。如下图所示。
现在我们载入的图像文件已经变成一系列二进制文本了。如下图所示。
载入时,使用D3DXCreateTextureFromResourceEx()函数。当然使用它的简单版本D3DXCreateTextureFromResourceEx()也是可以的。下面是该函数的使用方法:
hr = D3DXCreateTextureFromResourceEx( // 从资源创建纹理
m_pDevice, // DIRECT3DDEVICE9结构指针
NULL, // 模块句柄
MAKEINTRESOURCE( IDR_RCDATA1 ), // 载入的图像资源名称
D3DX_DEFAULT, // 宽
D3DX_DEFAULT, // 高
D3DX_FROM_FILE, // mip级别
0, // 用途
D3DFMT_A8R8G8B8, // 格式
D3DPOOL_MANAGED, // 内存池格式
D3DX_DEFAULT, // 滤波器
D3DX_DEFAULT, // mip滤波器
0, // 关键色(作掩码用)
&imageInfo, // 源文件信息
NULL, // 调色板
&m_pTexBackground );
MAKEINTRESOURCE是一个宏,用于指定载入图像数据位于程序内部的位置。IDR_RCDATA1被包含在resource.h里,需要使用#include语句包括。
一切就绪后,我们就可以看到我们的程序不用任何图像文件就可以独立运行了。
使用WTL要注意,因为我并不是要建立一个WTL应用程序,所以我们必须手动处理一些头文件。atlbase.h、atlapp.h和atldlgs.h都是需要包含在内的。使用CFileDialog的方法也和MFC中大同小异。所以BrowseImageFile()函数的样子应该是这样:
void CRenderByFileDialog::BrowseImageFile( void ) // 浏览并且获取图像文件的路径
{
CFileDialog imageFileDlg( TRUE,
TEXT( ".jpg" ),
m_CurImageFile.c_str( ),
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
TEXT( "JPG/JPEG文件\0*.jpg\0PNG文件\0*.png\0所有文件\0*.*" ),
NULL );
if ( IDOK == imageFileDlg.DoModal( ) )
{
m_CurImageFile = imageFileDlg.m_szFileName;
}
}
如果你还没有安装WTL,那么请使用查看我以前写过的文章,这里有详细介绍安装WTL的方法。
以下就是程序的截图:
上一篇: HTML基本教程
推荐阅读