欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-29 09:57:32
...

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

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

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

这是我开发时候的截图:

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

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

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

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

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

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

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

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

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

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

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

编译.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渲染

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

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

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

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

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