用WTL的文件对话框打开图片,D3D渲染

来源:互联网 发布:php图片一句话木马 编辑:程序博客网 时间:2024/05/22 15:01

演示程序下载: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,然后点确定。如下图所示。


现在我们载入的图像文件已经变成一系列二进制文本了。如下图所示。


编译.rc文件,就剩下载入代码没有写了。

载入时,使用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的方法。

以下就是程序的截图:







原创粉丝点击