CAnimateCtrl::Open的使用问题

提出问题:使用CAnimateCtrl::Open( LPCTSTR lpszFileName )时,参数lpszFileName 是个字符串,表示AVI文件名。因此在分发应用程序时,除了分发可执行程序外,还必须单独分发AVI文件。是否有办法从资源中得到AVI文件?

在这个程序中,如果要从外部获取文件是相当不方便的,万一谁不小心将文件删除或改名的话。。。。所以最好的方法是将文件作为资源存储在可执行文件中。幸亏CAnimateCtrl类有一个成员函数 CAnimateCtrl::Open 以UINT为参数,也就是说,它UINT可以是资源的ID号。

但是如何将AVI文件放入EXE文件呢?这是需要技巧的。animation控件寻找AVI类型的资源,所以你要做的事情是在资源文件(.rc)中加入代码:

IDR_MYANIMATION AVI DISCARDABLE "res\\myanim.avi" 

事先必须定义IDR_MYANIMATION为一个整型数,(注意不能使用一个串名作为资源)并且AVI文件要放在工程目录下的RES目录中。资源编译器会一个字节一个字节地将myanim.avi拷贝到可执行文件中,以便动画控件能找到它。

另外,使用相同的方法可以将任何文件作为资源放入EXE文件。方法是:

IDR_MYFOOFILE FOO DISCARDABLE "res\\myanim.foo" 

一旦在EXE文件中包含了foo类型文件,如何访问它呢?那就需要自己写一些代码。首先,你必须调用FindResource函数来获得资源句柄。

HINSTANCE hInst = AfxGetResourceHandle(); 

HRSRC hRsrc = ::FindResource(hInst,

MAKEINTRESOURCE(IDR_MYFOOFILE), // ID

"FOO"); // type 

ASSERT(hRsrc); 

假设hRsrc非空,再调用两个函数来获得资源(FOO文件)的大小及数据本身。

DWORD len = SizeofResource(hInst, hRsrc); 

BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc); 

ASSERT(lpRsrc); 

现在,在内存中lpRsrc指向FOO文件,如果你想要象访问普通磁盘文件一样访问这个内存,可以使用类库的CMemFile,它将一块存储区域当作CFile来对待。

CMemFile file(lpRsrc, len); 

file.Read(...); // etc. 

你甚至可以象重载OnOpenDocument打开磁盘文件一样用CDocument打开资源。

时间: 2024-12-22 07:33:50

CAnimateCtrl::Open的使用问题的相关文章

在MFC中创建动态控件的生成与响应

动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的 . 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置 静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗 口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就 创建好了,当对话框被显示时,其上的控件也会显示. 静态控件不需要调用Create() 函数来创建. 而创建动态控件有很大不同,以下以按钮为例,看一下动态控件的创建 过程: 1

VC++制作播放AVI视频流的动画按钮

Visual C++ 开发环境为控件提供的自绘制功能使程序员能够充分发挥自己的创造性来设计比较漂亮的程序界面.所谓AVI按钮是指每当鼠标从按钮上经过时就播放一段按钮提示的AVI,在许多的游戏程序以及三维动画软件中(如摩托英豪.Cool 3D等)都广泛的采用了这种AVI按钮.它使得程序的用户界面很具有动感,也使得我们的程序至少看上去更专业,本实例借助Visual C++强大的控件自绘制功能来实现这种AVI按钮的原理及实现. 程序编译运行后的界面效果如图一所示: 图一.播放AVI视频流的按钮 一.实

MFC程序员WTL指南(5)对话框与控件

对第四章的介绍 MFC 的对话框和控件的封装真得可以节省你很多时间和功夫.没有MFC对控件的封装,你要操作控件就得耐着性子填写各种结构并写很多的SendMessage调用.MFC还提供了对话框数据交换(DDX),它可以在控件和变量之间传输数据.WTL 当然也提供了这些功能,并对控件的封装做了很多改进.本文将着眼于一个基于对话框的程序演示你以前用MFC实现的功能,除此之外还有WTL消息处理的增强功能.第五章将介绍高级界面特性和WTL对新控件的封装. 回顾一下ATL的对话框 现在回顾一下第一章 提到

如何在对话框程序中使用动画控件

很多人都想在程序中实现 avi 控制.本文将一步一步教你如何在一个基于对话框的程序中添加 avi 动画控制(CAnimateCtrl).其实只要知道了方法,整个过程很简单.图一是本文例子程序运行画面,这个程序用到了表示文件拷贝的avi动画.下面就来看看具体实现方法:  图一 使用avi动画的对话框 在对话框资源编辑器中打开对话框,添加一个动画控件(Animate). 然后进入类向导"Class Wizard"为刚才添加的这个控件定义一个变量,假设变量名为:CAnimate m_avi.

利用Visual C++打造自己的IE浏览器

IE浏览器作为微软Windows系统捆绑销售的一个浏览工具,用来浏览千姿百态的网页,目前它已经占据了浏览器市场的半壁江山,成为Windows用户不可或缺的工具.首先,它的界面设计的很漂亮,如扁平按纽(按钮上的图像为灰色,当鼠标放在按钮上时,按钮突起,这种状态称为手柄,并且其上的图像变得鲜艳醒目).按钮上的文字说明以及按钮边上的小黑三角形状的下拉箭头(单击时显示下拉菜单).工具条上的地址输入栏等,都体现了Windows2000的风格:其次,它的收藏栏可以收藏用户喜爱的网络地址,这一切都为IE的流行

vc++在MFC对话框上用程序生成控件(比如Text和Edit控件),求如何实现?

问题描述 vc++在MFC对话框上用程序生成控件(比如Text和Edit控件),求如何实现? vc++我想在MFC对话框上用程序生成控件(比如Text和Edit控件),求如何实现?(不是用工具条拖动控件到对话框上) 1.用程序生成控件2.控件在对话框上准确定位 求大神指导下 解决方案 一个 CreateWindow() 就能搞定,例子很多,自己找. 解决方案二: MFC我没有研究过,但我想MFC中应该可以调用Win32API吧,可以看看这几个,虽然不是MFC,但是在MFC里想必是可以用的.htt

VC中动态添加控件

动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示. 静态控件不需要调用Create()函数来创建. 而创建动态控件有很大不同,以下以按钮为例,看一下动态控件的创建过程: 1.建立控件I

MFC 动态创建控件

动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的.   一.创建动态控件:   为了对照,我们先来看一下静态控件的创建.   放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示.   静态控件不需要调用Create()函数来创建.   而创建动态控件有很大不同,以下以按钮为例,看一下动态控件的创建过

Windows使用WxWidgets开发界面(c++)环境搭建

一直想学习wxWidgets,之前使用的都是wxPython,现在终于鼓起勇气学习这个了,发现原来是基于vc6.0开发的.所以最好的学习办法就是安装vistual studio 2010,方便学习看代码.wxWidgets里面也有demo. 基本上wxWidgets是和MFC类似的. 参考:http://www.codeproject.com/Articles/11515/Introduction-to-wxWidgets Similarity to MFC MFC and wxWidgets