谈VC++结合FLASH开发精美程序界面
做过界面开发的人想必都清楚如果要用VC++来开发漂亮的程序界面其难度真是苦不堪言, 当然VC++可以作出漂亮的界面但要投入大量的人力和时间其代码量可以用海量来形容。BUG自然也就不计其数。本文主要介绍如何采用VC++结合FLASH在短时间内以及很少的人力投入的情况开发出精美漂亮的软件界面。在本例中VC++主要进行相关数据逻辑及业务处理,FLASH则进行相关的界面表现。FLASH和VC++之间采用XML流通信。VC++的XML解析库为开源的TinyXml解析库。
首先描述一下VC++加载flash ps:已经在MFC里,加载一个控件:ShockwaveFlash ,并生成一个对象:m_FlashCtrl
char szBuf[256];
char szBuf[256];
string szXml;
CString szFlashPath(m_FlashCtrl.GetModulePath());
szFlashPath += "vcComm.swf";
m_FlashCtrl.LoadMovie(0, szFlashPath);
MoveWindow(0, 0, 490, 345);
m_FlashCtrl.MoveWindow(0, 0, 490, 345);
下面就是通讯问题啦~~
as端代码如下:
package {
import flash.display.Sprite;
import flash.text.TextField;
import flash.system.fscommand;
import flash.events.MouseEvent;
public class FSCommandExample extends Sprite {
private var bgColor:uint = 0xFFCC00;
private var size:uint = 100;
public function FSCommandExample() {
fscommand("fullscreen", "true");
fscommand("allowscale", "false");
draw();
}
private function clickHandler(event:MouseEvent):void {
fscommand("quit");
trace("clickHandler");
}
private function draw():void {
var child:Sprite = new Sprite();
child.graphics.beginFill(bgColor);
child.graphics.drawRect(0, 0, size, size);
child.graphics.endFill();
child.buttonMode = true;
addEventListener(MouseEvent.CLICK, clickHandler);
var label:TextField = new TextField();
label.text = "quit";
label.selectable = false;
label.mouseEnabled = false;
child.addChild(label);
addChild(child);
}
}
}
c++ 通过这个函数来接受:OnFsCommand
try
{
int nEvent = 0;
TiXmlDocument xmlData;
xmlData.Parse(command);
if (xmlData.Error())
{
throw (__LINE__);
}
TiXmlElement *pRoot = xmlData.FirstChildElement();
if (NULL == pRoot)
{
throw (__LINE__);
}
pRoot->Attribute("event", &nEvent);
switch(nEvent)
{
case 0xff000000: //移动窗口消息
SendMessage(WM_NCLBUTTONDOWN, HTCAPTION, 0);
break;
case 0xff000001: //关闭窗口
EndDialog(0);
break;
case 0x7fffffff: //最小化窗口
ShowWindow(SW_MINIMIZE);
break;
default:
break;
}
}
catch (...)
{
TRACE("\r\n收到无效的命令 : %s", command);
}
以上是as->c++
下面是C++->as,实例为能过callback的方式
as实例如下:
package
{
import flash.display.Sprite;
import flash.events.*;
import flash.external.ExternalInterface;
import flash.text.TextField;
import flash.utils.Timer;
import flash.text.TextFieldType;
import flash.text.TextFieldAutoSize;
public class vcComm extends Sprite
{
private var input:TextField;
private var output:TextField;
private var sendBtn:Sprite;
public function vcComm() {
input = new TextField();
input.type = TextFieldType.INPUT;
input.background = true;
input.border = true;
input.width = 350;
input.height = 18;
addChild(input);
sendBtn = new Sprite();
sendBtn.mouseEnabled = true;
sendBtn.x = input.width + 10;
sendBtn.graphics.beginFill(0xCCCCCC);
sendBtn.graphics.drawRoundRect(0, 0, 80, 18, 10, 10);
sendBtn.graphics.endFill();
addChild(sendBtn);
output = new TextField();
output.y = 25;
output.width = 450;
output.height = 325;
output.multiline = true;
output.wordWrap = true;
output.border = true;
output.text = "Initializing...\n";
addChild(output);
if (ExternalInterface.available) {
try {
output.appendText("Adding callback...\n");
ExternalInterface.addCallback("sendToActionScript", receivedFromJavaScript);
} catch (error:SecurityError) {
output.appendText("A SecurityError occurred: " + error.message + "\n");
} catch (error:Error) {
output.appendText("An Error occurred: " + error.message + "\n");
}
} else {
output.appendText("External interface is not available for this container.");
}
}
private function receivedFromJavaScript(value:String):void {
output.appendText("JavaScript says: " + value + "\n");
}
}
}
c++中,可以在任何时候,通过以下语句来执行:
char strR[] = "<invoke name=\"sendToActionScript\" returntype=\"xml\"><arguments><string>rtmp:靠四</string></arguments></invoke>"; m_FlashCtrl.CallFunction(strR);
我看了讲多帖子说了可以用SetAttribute()和GetAttribute()但是对于3.0实在是没有好的办法,求有人指点
ps email:2423135869@qq.com

浙公网安备 33010602011771号