郭静毅 管建和
摘要 介绍ActiveX控件在VC++应用程序的使用方法并通过使用Shockwave Flash Object控件实现了FLASH的UI启动画面,开发了一套友好美观的应用程序界面。 关键词 VC++,Shockwave Flash Object控件,Flash 一、应用概述 VC是Microsoft的一个非常好用的C++编程工具,它的最大优势就是有一个对于程序员来说非常实用的MFC(微软基础类库,Microsoft Foundation Class),掌握和运用好MFC将会给C++编程带来非常高的开发效率,因此,大多数的C++程序员都喜欢用VC,不但开发环境友好,而且有强大的MFC支持。然而,VC的界面设计和时间处理方法非常复杂,很多初学者对于Visual C++ UI设计感到十分的麻烦,无法在有限的时间内设计出美观、用户熟悉的操作界面。 UI即User Interface(用户界面)的简称。UI设计则是指对软件的人机交互、操作逻辑、界面美观的整体设计。好的UI设计不仅是让软件变得有个性有品味,还要让软件的操作变得舒适、简单、自由,充分体现软件的定位和特点。软件界面设计就像工业产品中的工业造型设计一样,是产品的重要买点。一个友好美观的界面会给人带来舒适的视觉享受,拉近人与电脑的距离,为商家创造卖点。界面设计不是单纯的美术绘画,它需要定位使用者、使用环境、使用方式并且为最终用户而设计,是纯粹的科学性的艺术设计。 Macromedia公司推出了交互式矢量图和 Web 动画的标准——Flash。在业界,Flash被称为是“最为灵活的前台”,利用Flash可以做出创作出既漂亮又可改变尺寸的导航界面以及其他奇特的效果。在我们所熟知的Flash应用于站点建设上,它的使用带来了各种优点,如全面的控制、无缝的导向跳转、更丰富的媒体内容、更体贴用户的流畅交互、跨平台和瘦客户端的支持、以及与其它Flash应用方案无缝连接集成等。而在应用程序开发方面,由于Flash其独特的跨平台特性、灵活的界面控制以及多媒体特性的使用,使得用Flash制作的应用程序具有很强的生命力,在与用户的交流方面具有其它任何方式都无可比拟的优势。在软件系统界面开发方面,Flash对于界面元素的可控性和它所表达的效果无疑具有很大的诱惑。对于一个软件系统的界面,Flash所具有的特性完全可以为用户提供一个良好的接口。 本程序主要应用了Shockwave Flash Object控件在VC++下开发FLASH的应用软件UI启动画面。 二、控件简介 在基于MFC开发应用程序界面时我们大量使用了Windows标准控件,其实在Windows里,还会常常接触到ActiveX控件,它来源于第三方,而非Windows操作系统。这样的控件一般来说,功能丰富而且使用方便,从而大大简化了程序员的工作。本文主要以程序中需要使用到的Flash控件为例细作阐述。 1.控件的注册 不同于Windows标准控件,ActiveX控件需要注册才能使用,ActiveX一般以.OCX或者.DLL文件格式发布,可以使用VC附带的工具来注册某个控件,按照以下步骤:在VC的Tools菜单下启动ActiveX Control Test Container;在ActiveX Control Test Container里打开菜单File\Register Controls…;弹出窗口Register Controls显示系统中已注册的所有ActiveX控件,点击左下角的“Register…”按钮;选择待注册的控件文件,如:“C:\WINNT\system32\Macromed\Flash\swflash.ocx”即为Macromedia Flash的ShockwaveFlash控件文件; 注册ActiveX控件方法如图1所示:
图1 注册ActiveX控件 还有一种简单一点的办法,使用regsvr32注册即可,如图2为注册画面:
图2 使用regsvr32注册ActiveX控件
Shockwave Flash Object控件是一种用于播放Flash动画的IE在插件,基于Microsoft Internet Explorer浏览网页并播放Flash时一般不需要进行额外的Flash播放软件的安装。这是因为在安装Flash的时候就已经安装到你的系统上了,Flash5.0版本以下的文件名是swflash.ocx,Flash5.0以上版本的名字是Flash.ocx,在系统目录里面应该可以找到:如Windows XP在C:\WINDOWS\system32\Macromed\Flash下有Flash.ocx。所以我们在本程序的编写过程中并不需要注册这个ActiveX控件。图3中我们可以看到本系统已经注册了Flash9.0版本。
图3 已经注册了的Flash9.0版本ActiveX控件
在VC++ MFC应用程序中引入了Shockwave Flash Object控件并命名后,程序代码中会自动产生CShockwaveFlash类,其框架如图4所示。
图4 CShockwaveFlash的类框架
在VC中CShockwaveFlash的常用函数介绍如下: Play() 播放动画 StopPlay() 停止动画 IsPlaying() 动画是否正在播放(true,false) GotoFrame(frame_number) 跳转到某帧(frame_number+1) TotalFrames() 获取动画总帧数 CurrentFrame() 回传当前动画所在帧数-1 Rewind() 使动画返回第一帧 SetZoomRect(left,top,right,buttom) 放大指定区域 Zoom(percent) 改变动画大小 Pan(x_position,y_position,unit) 使动画在x,y方向上平移 PercentLoaded() 返回动画被载入的百分比(0-100) LoadMovie(level_number,path) 加载动画 TGotoFrame(movie_clip,frame_number) movie_clip跳转到指定帧数 TGotoLabel(muvie_clip,label_name) movie_clip跳转到指定标签 TCurrentFrame(movie_clip) 回传movie_clip当前帧-1 TCurrentLabel(movie_clip) 回传movie_clip当前标签 TPlay(movie_clip) 播放movie_clip TStopPlay(movie_clip) 停止movie_clip的播放 GetVariable(variable_name) 获取变量 SetVariable(variable_name,value) 变量赋值 TCallFrame(movie_clip,frame_number) call指定帧上的action TCallLabel(movie_clip,label) call指定标签上的action TGetProperty(movie_clip,property) 获取movie_clip的指定属性 TSetProperty(movie_clip,property,number) 设置movie_clip的指定属性
三、程序实现以及核心代码分析 创建一个基于MFC的单文档(SDI)界面的应用程序,名为FlashCover。创建对话框。打开资源栏,建立一个新对话框,名称设定为IDD_FLASHCOVER_DIALOG,然后建立该对话框的类CFlashCoverDlg。 添加Shockwave Flash Object控件。建立对话框应用程序后,在主菜单里选择“工程->添加至工程->components and controls”菜单选项,此时会弹出一个components and controls gallery文件选择对话框,里面有两个文件夹,一个是registered activex controls,一个是Visual C++ Components。选择第一文件夹后会出现一系列系统上已注册过的activex控件。在里面选择shockwave flash object,点击insert将它插入工程中。因为在VC++中插入工程的控件要通过一个类来操作,所以VC++会提示你为这个控件指定一个类名,可以使用默认的类名就行了。插入后VC++会自动把这个类加入工程里面。具体步骤如图5、6所示。
图5 添加Shockwave Flash Object控件
图6 为Shockwave Flash Object控件类命名 在类CFlashCoverDlg的头文件中添加flash控件的头文件: #include "ShockwaveFlash.h"。 然后添加两个成员变量: CString m_FlashFileName; //flash动画的文件名 CShockwaveFlash m_flashctrl; // flash控件的对象 在类CFlashCoverDlg的实现文件中添加如下代码: CFlashCoverDlg::CFlashCoverDlg(CWnd* pParent /*=NULL*/) : CDialog(CFlashCoverDlg::IDD, pParent) { //开始读取封面配置ini文件 FILE *p_IniFile; char CoverFileName[80]; CString strPath; //获取应用程序所在路径 being //定义文件路径缓冲区 TCHAR strCurDrt[_MAX_PATH]; //获取文件路径 ::GetModuleFileName(NULL,strCurDrt,_MAX_PATH); char* p = strCurDrt; while(strchr(p,'\\')) { p = strchr(p,'\\'); p++; } *p = '\0'; strPath = strCurDrt; //获取应用程序所在路径 End //获取封面配置文件 CString strIniPath = strPath + "Config\\FlashCover.ini"; //判断封面配置文件是否存在 if((p_IniFile = fopen(strIniPath,"r")) == NULL) { AfxMessageBox("Faile to Open File!"); return; } else { while(!feof(p_IniFile)) { //读取配置文件内容 fscanf(p_IniFile,"%s",CoverFileName); } } fclose(p_IniFile); //读取封面配置ini文件结束 //将片头flash文件用播放对话框的成员变量来表示,为以后实现更换不同片头做准备 m_FlashFileName = CoverFileName; } 用类向导生成CFlashCoverDlg的ON_WM_INITDIALOG消息处理函数OnInitDialog,并添加如下代码: BOOL CFlashCoverDlg::OnInitDialog() { CDialog::OnInitDialog(); //获取屏幕的宽和高 int CX=::GetSystemMetrics(SM_CXSCREEN); int CY=::GetSystemMetrics(SM_CYSCREEN); //建立FLASH播放的窗口矩形 CRect rect(0,0,CX,CY); ::MoveWindow(GetSafeHwnd(),0,0,CX,CY,TRUE); GetClientRect(&rect); m_flashctrl.Create("FlashCover",WS_POPUP|WS_VISIBLE,rect,this,ID_FLASHWIN,NULL,FALSE,NULL); char szCurPath[_MAX_PATH]; HINSTANCE hInst=NULL; GetModuleFileName(hInst,szCurPath,_MAX_PATH); char* p = szCurPath; while(strchr(p,'\\')) { p = strchr(p,'\\'); p++; } *p = '\0'; CString strFilename = szCurPath; // 获取播放FLASH文件名 strFilename += "flash\\"+m_FlashFileName; //播放FLASH动画 m_flashctrl.SetMovie(strFilename);
return TRUE; } 在类CFlashCover的头文件中添加如下头文件: #include "FlashCoverDlg.h" //建立flash启动封面对话框变量 CFlashCoverDlg flashDlg; //建立FLASH窗口启动标志 BOOL nFlag; 然后在CFlashCover的实现文件中的InitInstance函数中添加如下代码: BOOL CFlashCoverApp::InitInstance() { … //增加flash启动封面 nFlag=TRUE; flashDlg.DoModal(); SetRegistryKey(_T("计算机学院")); LoadStdProfileSettings(4); // 加载标准 INI 文件选项(包括 MRU) … } 用类向导生成CFlashCoverApp的消息处理函数PreTranslateMessage。 BOOL CFlashCoverApp::PreTranslateMessage(MSG* pMsg) { //如果有鼠标或者键盘响应,则终止FLASH窗口 if (flashDlg&& (pMsg->message==WM_KEYDOWN|| pMsg->message==WM_SYSKEYDOWN|| pMsg->message==WM_LBUTTONDOWN|| pMsg->message==WM_RBUTTONDOWN|| pMsg->message==WM_MBUTTONDOWN|| pMsg->message==WM_NCLBUTTONDOWN|| pMsg->message==WM_NCRBUTTONDOWN|| pMsg->message==WM_NCMBUTTONDOWN)) { flashDlg.EndDialog(IDCANCEL); nFlag=FALSE; return TRUE; } return CWinApp::PreTranslateMessage(pMsg); } 本Flash的UI启动画面程序在VC++6.0,WindowsXP环境下调试通过。编译并运行程序,可以实现预期的Flash动画播放的效果,Flash启动画面执行最终效果如图7所示。
图7 Flash启动画面执行静态效果图 四、结语 本文详细地介绍了在VC++应用程序中使用Flash控件的方法并实现了Flash的UI启动画面。读者在本程序的基础上稍加改造,便能编写出界面美观的应用软件,为用户提供一个良好的操作界面。
|