目的: 建立独立播放的VT可执行文件 前提:安装VC++6.0;安装DirectX SDK
因为SDK中提供的文件就是基于VC++的。而编译这些文件要用到DirectX中的Lib和头文件等,所以DirectX_SDK要安装。由于现在大多数朋友用的VT都是3.0或以上版本的,可以只安装DirectX9.0 SDK,如果你是net开发环境,直接安装DirectX9.0 c SDK版本;如果你是VC6用SDK extras把DirectX9.0 SDK升级到DirectX9.0C SDK即可版本。
经过测试VT3.08 SDK对DirectX9.0C SDK完全是支持的。
1.新建一个文件夹,把你VT安装目录下的Sdk中的Samples.dsw及Standalone Playe放进来。

|
2.用VC++打开Smaple.dsw,出现寻找其他的dsp文件的窗口,选择取消。

3.在VC++的FileView中删除所有才找不到位置的档案,只留下NewPlayerStatic files。

| 4.在Project\option中Link相应的头文件和库文件。

如图:(我这里安装了DirectX8 SDK和DirectX9 SDK)

你要保证你的DirectX SDK的Lib目录要在C:\Program Files\Microsoft Visual Studio\VC98\LIB的上边。你如果只安装了DirectX9.0 SDK这样编辑Lib的引用:Project--->Setting--->Link,在Object/library modules栏目中只留下以下的Lib d3dx9.lib OpenGL32.lib Glu32.lib Ws2_32.lib Vfw32.lib winmm.lib msacm32.lib dinput.lib dxguid.lib。
5.这时你可以编译的文件文件(生成一个播放器).执行可以发现生成的EXE比较大,是因为我们把DLL中的函数和接口等全部封装在EXE文件中的缘故.执行这个文件。

6.改造我们的Windows,因为我们是要封装VT到EXE中,所以把右键菜单,不需要的按钮全部去处。在VC++中的ClassView中找到回调函数LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)注释掉相应消息响应函数。
//屏蔽右键菜单:注释掉case WM_RBUTTONUP: OnContextMenu(); break;这一行
//屏蔽掉按钮的单击消息响应(关闭按钮的响应不应注释掉):注释掉这几行Code:
case BTN_PLAY: g_CurrentPlayState|=1; OnPlayPause(0); break; case BTN_RESET: g_CurrentResetState=2; OnReset(); break; case BTN_LOAD: g_CurrentLoadState=2; OnLoad(); break;
7.修改重画标题栏函数void RepaintTitleBar(),去掉Load,Play和Pause三个按钮的显示。 //注释掉这几行代码:
DrawState(dc2,NULL,NULL,(DWORD)g_Virtools,0,3,CenterY-10,0,0,DST_BITMAP|DSS_NORMAL); DrawState(dc2,NULL,NULL,(DWORD)g_Reset[g_CurrentResetState],0,Center-64,CenterY-9,0,0,DST_BITMAP|DSS_NORMAL); DrawState(dc2,NULL,NULL,(DWORD)g_Plays[g_CurrentPlayState],0,Center+26,CenterY-9,0,0,DST_BITMAP|DSS_NORMAL); DrawState(dc2,NULL,NULL,(DWORD)g_Load [g_CurrentLoadState],0,Center-19,CenterY-9,0,0,DST_BITMAP|DSS_NORMAL);
8.这时候我们来更改Windows的窗口标题:我们让它支持中文的显示:在VC++中的ResourceView中找到String Table.选中他下边的子项,在右键菜单中打开它的属性窗口,把Language修改成Chinese。

9.编辑右边的TITLE项,输入你的标题。

10.把头文件"afxRes.h"包到Resource.h文件中去。在Resource.h中加入这一行:
11.接下来我们把我们要播放的VT文件Import到VC++中的ResourceView中去.确定你的Res资源类型。


12.你可以看到你的VT文件已经到导入进来了。

|
13.接下来我和大家说一下播放VT文件的思路:我们需要播放VT时,我们可以把VC++中的VT资源导出来生成一个临时文件,然后让Player而播放即可,播放结束我们在用程序把它删除。
14.编辑InitInstance()函数接口,把 FileName变成全局变量。 //注释掉这一行
把这段变量声明放到对应文件的开始部分. 15.继续编辑InitInstance()函数,在SetCursor(::LoadCursor(NULL,IDC_ARROW));这一行下边加入导出VT临时文件的Code:
CString Type="VIRTOOL"; HRSRC rest=FindResource(NULL,MAKEINTRESOURCE(IDR_VIRTOOL1),Type); HGLOBAL gl=LoadResource (NULL,rest); LPVOID lp=LockResource(gl); //返回指向资源内存的地址的指针。 lstrcpyn(FileName,"c:\\Temp.vmo",512); HANDLE fp; fp= CreateFile(FileName ,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL); DWORD a; //sizeofResource 得到资源文件的大小 if (!WriteFile (fp,lp,SizeofResource (NULL,rest),&a,NULL)) return false; CloseHandle (fp); //关闭句柄 FreeResource (gl); //释放内存
你可以看到我把VT的临时文件放到了C:目录下.你可以任意修改目录到任何地方。
16.实现Exit时删除临时文件: 修改void ExitVirtoolsPlayer()函数,加入这一行代码到PostQuitMessage(0);这一行的前边:
附件下载
框架文件你可能要自己导入VMO资源文件,Type的名字文件中是"VIRTOOL",ID为IDR_VIRTOOL1,请注意要根据实际情况进行修改。说明:我这个框架文件是基于 VT3.0 SDK开发的,如果你用VT SDK是3.08版的话,编译会出现使问题。因为3.08的Lib已经更新了(比如Mp3ReaderLib已经合并到WavReaderLib了等等...)
| (完) |