Flash改变VC的界面(这里是和Socket结合使用)
发布时间:2020-12-15 17:42:51 所属栏目:百科 来源:网络整理
导读:曾经在VCKbase(VC知识库)网站看到过一篇关于Flash的文章,叫做《在VC中使用?Flash?美化你的程序》,文章中介绍的是使用Flash控件在对话框程序中播放Flash文件。由于以前的工作需要曾经接触过使用Scoket通信在VC的Exe程序和Flash程序中通信的相关技术。在这
曾经在VCKbase(VC知识库)网站看到过一篇关于Flash的文章,叫做《在VC中使用?Flash?美化你的程序》,文章中介绍的是使用Flash控件在对话框程序中播放Flash文件。由于以前的工作需要曾经接触过使用Scoket通信在VC的Exe程序和Flash程序中通信的相关技术。在这里介绍给大家。相比上面的那篇文章,其有一下有点:
1、 界面上更加优美。所有的界面部分都是直接使用Flash。 2、 所能完成的功能更加完备。几乎所有能在VC的程序中能使用的功能都可以使用。 要做到以上两点所要做的工作也是很简单的,使用的技术也很简单。只要求以下几点: 1、 会使用简单的Flash编辑工具。会写简单的Flash?Script脚本。 2、 Socket编程的相关知识。 程序的原理就是:VC程序(对话框程序)在启动以后最小化的任务栏,并建立一个Socket?Server进行侦听,在建立完Socket和设置好相关的处理函数以后,启动编译为Exe的Flash程序,Flash程序通过Socket于VC程序建立连接,将Flash界面上的操作转换为Socket通信,让VC程序处理完成以后将结果返回给Flash程序。其简单的步骤为: 1、 在VC程序端(或者其他任何编程语言的程序):建立一个对话框程序,在APP类的InitInstance()函数中添加Scoket初始化: if?(!AfxSocketInit()) { AfxMessageBox(IDP_SOCKETS_INIT_FAILED); return?FALSE; } 2、 在对话框类的OnInitDialog()函数中添加处理界面部分的程序段: MoveWindow(0,0); //将对话框程序界面改变为0 ShowWindow(SW_SHOWMINIMIZED); //使界面最小化到任务栏 OnOK(); //调用对话框的OnOK函数 3、 在对话框类的OnOK()函数中建立Socket?server并侦听: WSADATA?wsaData; ????int?iErrorCode; ????if?(WSAStartup(MAKEWORD(2,1),&wsaData))?//Windows?Sockets?DLL {? ?AfxMessageBox("Winsock?can?not?initialize.",MB_ICONSTOP); ?????????WSACleanup(); ?SendMessage(WM_CLOSE,NULL,NULL);//关闭对话框程序 ?????????return; //Create?server?Socket,type?is?SOCK_STREAM, ServerSocket?=?socket(PF_INET,SOCK_STREAM,0);???? ????if(ServerSocket?==?INVALID_SOCKET) AfxMessageBox("Could?not?create?server?Socket.",245)">SendMessage(WM_CLOSE,NULL);?//关闭对话框程序 m_sockServerAddr.sin_family?=?AF_INET; //IP?设置为广播 ????m_sockServerAddr.sin_addr.s_addr?=?inet_addr("127.0.0.1"); //使用9813端口,自己编程的时候可以随意选择,最好使用5000以后的 ????m_sockServerAddr.sin_port?=?htons(9813); //绑定Socket ????if?(bind(ServerSocket,(LPSOCKADDR)&m_sockServerAddr,sizeof(m_sockServerAddr))?==?SOCKET_ERROR)?// ????{ AfxMessageBox("Could?not?bind?Server?socket.",245)">????????return; ????iErrorCode?=?WSAAsyncSelect(ServerSocket,m_hWnd,WM_CLIENT_ACCEPT,FD_ACCEPT); ????if?(iErrorCode?==?SOCKET_ERROR)? AfxMessageBox("Could?not?select?socket.",245)">????SendMessage(WM_CLOSE,245)">????if?(listen(ServerSocket,1)?==?SOCKET_ERROR)?//begin?listen?client AfxMessageBox("Could?not?listen.",NULL); //启动Flash程序 CString?FlashExePath; char?DialogExePath[256]; ???//获得对话框程序的路径,包含文件名 ::GetModuleFileName(0,?DialogExePath,?sizeof(DialogExePath)); FlashExePath?=?DialogExePath; ???//去除对话框程序文件名,获得所在目录路径 int?Len?=?FlashExePath.ReverseFind(''); FlashExePath?=?FlashExePath.Left(Len); //?Sample.exe为编译好的Flash程序,存放在和VC程序同一目录下 FlashExePath??+=?"Sample.exe"; WinExec(FlashExePath,1); return;? 相关变量定义在对话框类的头文件中,作为成员变量: SOCKET?Client;????????//客户的连接请求 SOCKET?ServerSocket;?????????????//SOCKET? SOCKADDR_IN?m_sockServerAddr;??//SOCKET?结构 4.在对话框程序中添加Socket的处理函数: 头文件中添加: #define?WM_CLIENT_ACCEPT?WM_USER+101 #define?WM_CLIENT_READCLOSE?WM_USER+102 和 LRESULT?OnAccept(WPARAM?wParam,?LPARAM?lParam); LRESULT?OnReadClose(WPARAM?wParam,LPARAM?lParam); 在CPP文件中添加消息映射宏和相关函数的实现: ON_MESSAGE(WM_CLIENT_ACCEPT,OnAccept) ON_MESSAGE(WM_CLIENT_READCLOSE,OnReadClose) LRESULT?CSetupDlg::OnAccept(WPARAM?wParam,LPARAM?lParam) //出错返回 if?(WSAGETSELECTERROR(lParam)) return?0L; if(WSAGETSELECTEVENT(lParam)?==?FD_ACCEPT) ????Client?=?accept(ServerSocket,0); ????if?(Client?==?INVALID_SOCKET) AfxMessageBox("INVALID_SOCKET.",245)">WSAAsyncSelect(Client,WM_CLIENT_READCLOSE,FD_READ|FD_CLOSE); /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// LRESULT?CSetupDlg::OnReadClose(WPARAM?wParam,245)">{??? //在这里接收从Flash发送来的数据包,并解析它们,根据包中的数据不同通过Swith执行相//关的操作,可以调用其他的函数,需要将执行的结果返回(发送)给Flash。 CString?str; switch?(WSAGETSELECTEVENT(lParam)) //这里的msg和msg中的相关定义都是自定义的结构体 case?FD_READ: if(recv(Client,(char?*)&msg,sizeof(msg),0)?==?SOCKET_ERROR) return?0; str.Format("%s",msg.msg); list.InsertString(0,str); { PSockmsg?recmsg=(PSockmsg)msg.msg;? str=recmsg->msg; switch(recmsg->action) case?'D': break; case?'W': break; default: case?FD_CLOSE: str?=?_T("client?close."); closesocket(Client);//关闭Socket 这段函数我就不多解释了,注意在OnOK中的WSAAsyncSelect调用确定了当收到发生Socket事件的时候发出WM_CLIENT_ACCEPT消息。第二个消息处理函数中用到了一些自定义的结构体,这是在和Flash统一以后确定的一些结构体,用于在Flash和VC程序之间传递消息参数的,这也是其重要的部分,需要根据实际的情况确定。 2.在Flash端:需要进行Socket连接,并组织并发送相关的Socket包,接收VC端返回的结果。参考代码: /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function?onsock(success)?{ ????????if?(success)?{ ????????????_root.gotoAndPlay(2); ????????}?else?{ ????????????_root.gSock.connect("127.0.0.1",?9813);//连接VC程序 ?????????} ????} ????function?onsockclose()?{ ????????fscommand?("quit"); ????stop(); ????fscommand?("fullscreen",?false); ????fscommand?("allowscale",245)">????fscommand?("showmenu",245)">????Stage.showMenu?=?false; ????var?gSock?=?new?XMLSocket?();//new一个Socket对象 ????var?installed?=?false; ????var?usethreeside?=?false; ????var?havewireless?=?false; ????var?finished?=?false; ????var?osys?=?true; ????var?mem?=?true; ????var?processor?=?true; ????var?harddisk?=?true; ????var?network?=?true; ????gSock.onClose?=?onsockclose;//指定Socket的相关回调函数 ????_root.gSock.connect("127.0.0.1",?9813);//调用自定义的函数 _root.gSock.onConnect?=?onsock; /////////////////////////////////////////////////////////////// //接收并判断相关的在VC程序段执行的结果。 function?onrecv(XMLDoc)?{ ????????var?_local2; ????????_local2?=?XMLDoc.toString(); ????????if?(_local2?==?"failed")?{ ????????????_root.osys?=?false; ????????} ????????_root.gotoAndPlay(196); ????_root.stop(); ????_root.gSock.onXML?=?onrecv; ????var?local1; ????local1?=?"Wcheckos";//相关的信息组织 ????_root.gSock.send(local1);//发送数据 转载路径:http://bbs.csdn.net/topics/70418951 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 在vue项目中使用element-ui的Upload上传组件的示例
- Pytest学习(十) - parametrize、fixture、request的混合使
- ruby-on-rails-3 – 从Rails设计auth到backbone&api?
- ruby – 如何创建一个nokogiri不区分大小写的Xpath选择器?
- oracle – 物化视图日志的事务性能影响
- sqlite环境下的数据库
- postgresql – osm2pgsql:函数AddGeometryColumn不存在
- ruby – Cucumber:自动步骤文件创建?
- .NET的正则表达式是否完整?
- c# – 注入具有与更高级别类相同的构造函数参数的依赖项