VC++实现FLASH的UI启动画面

一、应用概述
    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所示:

VC++实现FLASH的UI启动画面_第1张图片


图1 注册ActiveX控件
    还有一种简单一点的办法,使用regsvr32注册即可,如图2为注册画面:

VC++实现FLASH的UI启动画面_第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版本。

VC++实现FLASH的UI启动画面_第3张图片


图3 已经注册了的Flash9.0版本ActiveX控件

    在VC++ MFC应用程序中引入了Shockwave Flash Object控件并命名后,程序代码中会自动产生CShockwaveFlash类,其框架如图4所示。

VC++实现FLASH的UI启动画面_第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所示。

VC++实现FLASH的UI启动画面_第5张图片


图5 添加Shockwave Flash Object控件

VC++实现FLASH的UI启动画面_第6张图片


图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启动画面。读者在本程序的基础上稍加改造,便能编写出界面美观的应用软件,为用户提供一个良好的操作界面。





VC与FLASH交互


FLASH动画在网络世界里随处可见,深受欢迎。如果在VC编程时集成SWF文件会给软件增色不少,并且VC还可与动画进行交互呢!

                 一、在VC工程中添加"shockwave flash object 控件",方法是:工程->增加到工程->compnonents and controls..., 在对话框中双击"Registered ActiveX Controls",

      然后找到"shockwave flash object"确定即可加入控件到工程中,这时在控件工具栏中就可找到新的图标,把它拖放到对放框中即可;

                      如果没找到,网上下载flash.ocx, 复制到windows/system32目录并用regsvr32.exe进行注册;

               二、通过在“IDC_SHOCKWAVEFLASH1”点击右键菜单“建立类向导...” 关联成员变量:m_FlashPlayer;

                    我们可以使用m_FlashPlayer来进行flash 动画的控制以及和自己的程序进行交互等操作了;


               三、使用成员函数LoadMovie 和Play 来导入并播放动画。

                        m_FlashPlayer.LoadMovie(0, ls_path);
                        m_FlashPlayer.Play();
                       m_FlashPlayer.LoadMovie(0, ls_path);该函数用来将动画导入程序中,ls_path为要播放的flash 路径,要用绝对路径。

                       m_FlashPlayer.Play();调用该函数开始播放动画。在初始化对话框的函数里面加入这两个函数调用即可。
             四、 在flash 动画和自己的程序中传递消息进行交互。

                        把flash 嵌入自己的程序后,用户在flash 动画上面操作,想知道用户进行了什么操作,就得让flash 动画来告诉我们了。做过flash 的人应该知道flash 的动作脚本语言:Action Script。里面有个命令叫FSCommand(command,args);我们就是要通过这个命令向外部发送消息的。这个命令有两个参数,都是字符串,你可以在flash 脚本中指定任意的字符串。比如用户按下flash 动画的一个按钮就发送FSCommand("bt","bt1")这样一个消息,按下另一个按钮发送FSCommand("bt","bt2"),而我们的程序收到FSCommand 消息后就对通过两个参数的不同字符串来判断用户按下的是哪个按钮。原理就是这样子的,要实现的话就得在flash 动画中使用FSCommand 发送消息,在我们的程序接收和处理FSCommand 消息了。那我们的程序如何才能接收这个消息呢?前面我们讲到,shockwave flash object 插入我们的程序后就可以象一个普通的windows 控件那样使用它了。要让它接收并处理这个消息当然是使用MFC 的类向导进行消息映射了。做法如下:
1、添加消息处理函数。在主菜单中选择“查看->类向导”,在弹出的对话框中选择消息映射,在左边的列表框中选择我们刚插入程序的shockwave flash object 控件id,右边选择
FSCommand, 点击AddFunction,这样就添加了一个FSCommand 消息处理函数了。它的形式大概是这样子的:
void CTestDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args) ;
函数有两个参数,就是flash 的Action SCript 中FSCommand 语句中的两个参数。其实并不一定两个参数都用到,flash 脚本中可以就使用一个参数,这样这边的函数就只要对第一个参数进行处理就行了。
2、编写消息处理代码。在刚添加的FSCommand 消息处理函数中,对两个参数进行处理。其实就是做字符串比较的操作,根据是什么字符串来判断用户进行了什么操作。大概就是这样子的:
void CTestDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args) 
{
    char a[100]={0};
    UpdateData(true);
   if( 0 == strcmp(command,"KeyPress") )
   {
  
          if( 0 == strcmp(args,"Delete") )
         {
               m_edit1.SetFocus();
              keybd_event(VK_BACK,0x45,0,0);
              keybd_event(VK_BACK,0x45,KEYEVENTF_KEYUP,0);  
              m_edit1.SetFocus();        
          }
          else if( 0 == strcmp(args,"Space") )
         {
                 memcpy(a,m_cjh,5);
                 if(memcmp(a,"ADMIN",5)==0)
                {
                            CAdminDlg dlg;
                            if(dlg.DoModal()==1)
                            {
                                CDialog::OnOK(); 
                            }
   
                }
                if(m_cjh.GetLength()>11)
               {
                       CPOSTVerc dlg;
                       memcpy(ps_cjhm,m_cjh,m_cjh.GetLength());
                       if(dlg.DoModal()==1)
                       {
                       }
                  }
           }
          else if( 0 == strcmp(args,"Asterisk") )
           {
                    m_cjh+="*";
            }
          else if( 0 == strcmp(args,"CapsLock") )
         {
                 m_caps = !m_caps;
          }
        else
        {
      if(m_caps)
     {
    
                m_edit1.SetFocus();    
               keybd_event(args[0],0x45,0,0);
                keybd_event(args[0],0x45,KEYEVENTF_KEYUP,0);  
             m_edit1.SetFocus();
     }

    else
     {
           m_edit1.SetFocus();
           if((args[0]>=0x30) && (args[0]<=0x39))
           {
                keybd_event(args[0],0x45,0,0);   
                keybd_event(args[0],0x45,KEYEVENTF_KEYUP,0); 
            }
            else
            {
                 keybd_event(VK_SHIFT,0,0,0);
                 keybd_event(args[0],0x45,0,0);
                 keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
                 keybd_event(args[0],0x45,KEYEVENTF_KEYUP,0); 
             }
             m_edit1.SetFocus();
             }
        } 
    }
    else 
    {
        MessageBox(command);
    }
    UpdateData(false);
}

三、设置和读取flash 动画中的变量。
shockwave flash object 还提供了两个进行交互的函数,一个是CString GetVariable(LPCTSTR name),用来获得flash 动画中变量name 的值,该值以CString 的形式返回给调用者;一个是void SetVariable(LPCTSTR name, LPCTSTR value),可以用来将flash 动画中的name 变量设置一个值value。
使用以上介绍的几个函数就可以在我们的程序和flash 动画间进行很好的交互了。      








你可能感兴趣的:(c++,编程)