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

演示程序下载:http://download.csdn.net/detail/jiangcaiyang123/4061511

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

程序的操作方法:回车键:打开文件,上下左右键用来移动位于上方的图片。
程序还不如人意(Bug included),我只是为了阐述一个技术点而进行的实验。请见谅。
谁说WTL的作用不大?在我还未了解开源的界面库之前,使用WTL成为了我的唯一选择。还有一个原因是我没有学过MFC。通常来说,使用标准的界面来选择一个文件来载入对我们来说已经够用了。如果你富有余力,可以自己动手使用DirectX来实现文件对话框。当然如果你是拥有至少半年经验的DXUT程序员,你可以求助它。我看到DXUT写的一个CustomUI程序例子,我真的好想了解这里面究竟是怎么实现的啊。可惜这个采用了DXUT框架,要学这个框架还要好一些功夫呢。
好了,言归正传。这个例子程序的特点之一就是结合了WTL/ATL和DirectX。使用WTL现成的一个文件对话框来选择一个图像文件,这个图像文件的格式可以使JPG和PNG。当然其它的图片也是可以的,只要图片文件合法且不要过大。随后使用D3D来载入图像,形成一个纹理。渲染纹理使用了最简单的滤波方式,所以图像看起来可能有些锯齿。
下载了演示程序的人会发现,这个程序可以独立运行,并且可以显示两个图片。那么这又是怎么做到的呢?我采取的方法是将两个图片做成资源嵌入程序中,VS允许我们这么做。然后我们也必须从资源中载入图像出来,DirectX也允许我们这么做,但是有一些限制。数年前我也想了很多办法,但都失败了。直到有一次,我在GameRes的一个帖子里面发现了载入的方法。现在以我这个演示程序为例,说明一下载入的步骤。(我的是VS2005,理论上其余的版本都应该有效。)

这是我开发时候的截图:

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

首先点击“添加→资源”,如下图所示。

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

选择“导入”,如下图所示。

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

文件类型选“所有文件”,然后点击我们想要载入的.png或者是.jpg文件,点击打开。如下图所示。

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

在自定义资源类型对话框中,输入RC_DATA,然后点确定。如下图所示。

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

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

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

编译.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的方法。

以下就是程序的截图:

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

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

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

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

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

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

你可能感兴趣的:(框架,File,null,mfc)