import flash.events.Event;
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.ContextMenuEvent;
import flash.display.Loader;
import fl.motion.MatrixTransformer;
import flash.display.Sprite;
import flash.display.Shape;
import flash.system.LoaderContext;
import flash.display.DisplayObject;
import flash.geom.Transform;
import flash.geom.Point;
import flash.geom.Matrix;

/*

function fl_ClickToPosition(event:MouseEvent):void
{


fscommand("MsgBox", "callC++");
}

function ChangeButton(msg:String):void
{
btn.label = msg;
}
*/

fscommand("fullscreen","true")

var isEnd = false;
var showImg:Sprite;
var ldr :Loader;
var pic_width:Number;
var pic_height:Number;


var img:Bitmap;

// for drag move
var canDrag = false;
var LBDownX:Number;
var LBDownY:Number;

// for scale
var scaleW;
var scaleH;

// for rotate
var isRBDown = false;
var rotRadian = 0;
var rbX = 0;
var rbY = 0;
var rotScalar = 0.002;
var originX;
var originY;

// for change image
var go_limit = 0;
var go_left = false;
var go_right = false;
var size_scalarx = 1;
var size_scalary = 1;

//stage.stageWidth = 1300;

stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
//stage.addEventListener(MouseEvent.MOUSE_MOVE, onRBMove);


ExternalInterface.addCallback("MouseWheel",ZoomTo);
ExternalInterface.addCallback("RBDown",onRBDown);
ExternalInterface.addCallback("RBUp", onRBUp);
ExternalInterface.addCallback("RBMove",onRBMove);
ExternalInterface.addCallback("RotateX",onMoveRotateX);
ExternalInterface.addCallback("InitImage",LoadImage);
ExternalInterface.addCallback("ShowMouse",ShowMouse);

function ShowMouse():void
{
Mouse.show();
}

var square:Shape = new Shape();
this.addChild(square);

function drawSqaure(x:Number, y:Number, w:Number, h:Number):void
{
square.graphics.clear();
square.graphics.lineStyle(2, 0);
square.graphics.beginFill(200);
//square.rotation = 20;
square.graphics.drawRect(x, y, w, h);
square.graphics.endFill();
}

stage.addEventListener(Event.RESIZE, DoResize);
function DoResize(evt:Event):void
{
//fscommand("Resize",""+stage.stageHeight);
go_limit = stage.stageWidth/10;

}


function Look_Left_Img(evt:Event):void
{
trace("left click");
fscommand("Look_Left_Img", "callC++");
}

function Look_Right_Img(evt:Event):void
{
fscommand("Look_Right_Img", "callC++");
}

//function InitUI():void
//
{
//
button_left.height = stage.stageHeight/5;
//
button_right.height = button_left.height;
//
button_left.width = stage.stageWidth/21;
//
button_left.x = button_left.width/2;
//
button_right.x = stage.stageWidth-button_right.width/2;
//
button_left.y = stage.stageHeight/2;
//
button_right.y = button_left.y;
//

//

//
button_left.addEventListener(MouseEvent.CLICK, Look_Left_Img);
//
button_right.addEventListener(MouseEvent.CLICK, Look_Right_Img);
//
}

function InitCursor():void
{
go_limit = stage.stageWidth/10;
//fscommand("MsgBox",""+stage.stageWidth)
left_cur.visible = false;
right_cur.visible = false;
normal_cur.visible = false;

//left_cur.height = stage.stageHeight/10;
//
right_cur.height = left_cur.height;
//
left_cur.width = stage.stageWidth/15;
//
right_cur.width = left_cur.width;
//

//
normal_cur.height = stage.stageHeight/15;
//
normal_cur.width = stage.stageWidth/22;

// fscommand("MsgBox",""+stage.scaleX);

// normal_cur.scaleX = 1/stage.scaleX
//normal_cur.scaleY = 1/stage.scaleY


left_cur.scaleX = size_scalarx;
left_cur.scaleY = size_scalary;
normal_cur.scaleX = size_scalarx;
normal_cur.scaleY = size_scalary;
right_cur.scaleX = size_scalarx;
right_cur.scaleY = size_scalary;
trace("scaleX"+normal_cur.scaleX)



// var cur_size = 16;
//
left_cur.height = cur_size;
//
left_cur.width = cur_size;
//
right_cur.height = cur_size;
//
right_cur.width = cur_size;
//
normal_cur.height = cur_size;
//
normal_cur.width = cur_size;

trace(flash.system.Capabilities.screenResolutionX);


}

// load image
function LoadImage(filename:String, width:Number, height:Number):void
{

//size_scalarx = stage.stageWidth/flash.system.Capabilities.screenResolutionX;
//size_scalary = stage.stageHeight/flash.system.Capabilities.screenResolutionY;
trace("size_scalar:"+size_scalarx)
if (ldr == null)
{
ldr = new Loader();
}
else
{
ldr.unload();
}

ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, ldr_complete);
ldr.load(new URLRequest(filename), new LoaderContext());
pic_width = width;
pic_height = height;


InitCursor();

//InitUI();
}
LoadImage("E:/1.jpg", 460, 360);

function calculatePos(img):void
{
trace(stage.stageWidth);
trace(stage.stageHeight);
var m_img_w = stage.stageWidth;
var m_img_h = stage.stageHeight;
var fix_w = m_img_w;
var fix_h = m_img_h;

if (pic_width > pic_height)
{
fix_w = m_img_w;
fix_h = pic_height * m_img_w / pic_width;
}
else
{
fix_w = pic_width * m_img_h / pic_height;
fix_h = m_img_h;
}

trace(fix_w);
img.width = fix_w;
img.height = fix_h;

var wx = m_img_w - fix_w;
var wy = m_img_h - fix_h;

var m_img_x = 0;
var m_img_y = 0;

if (wx > 0)
wx = wx/2;
if (wy > 0)
wy = wy/2;

if( m_img_x > 0 )
m_img_x = 0;

if( m_img_x < wx )
m_img_x = wx;

if(m_img_y > 0)
m_img_y = 0;

if( m_img_y < wy )
m_img_y = wy;

trace(m_img_x);
showImg.x = m_img_x;
showImg.y = m_img_y;
}

function reset_cursor():void
{
trace("cur_X:"+stage.mouseX)
if (stage.mouseX < go_limit)
{
//trace(evt.stageX);
left_cur.visible = true;
normal_cur.visible = false;

go_left = true
}
else if ( stage.mouseX > stage.stageWidth - go_limit)
{
right_cur.visible = true;
normal_cur.visible = false;

go_right = true;
}
else
{
go_left = false;
go_right = false;
left_cur.visible = false;
right_cur.visible = false;
normal_cur.visible = true;
normal_cur.x = stage.mouseX;
normal_cur.y = stage.mouseY;
}

if (go_left)
{
left_cur.x = stage.mouseX;
left_cur.y = stage.mouseY;
}
else if(go_right)
{
right_cur.x = stage.mouseX;
right_cur.y = stage.mouseY;
}
}

function ldr_complete(evt:Event):void
{
var bmp:Bitmap = ldr.content as Bitmap;
//trace(bmp);
scaleW = 0.5 * bmp.width;
scaleH = 0.5 * bmp.height;


img = new Bitmap(bmp.bitmapData);
// img.x = 0;
// img.y = 0;
img.rotation = 0;
//img.width = 300;
//img.height = 100;
if (showImg != null)
this.removeChild(showImg);
showImg = new Sprite();


//img.scaleX = size_scalarx;
//img.scaleY = size_scalary;
calculatePos(img);
showImg.addChild(img);
this.addChild(showImg);
//showImg.rotationY =0;
originX = 0;
originY = 0;

//showImg.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
showImg.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
showImg.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
showImg.addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheel);

//swapChildren(left_cur,showImg);
setChildIndex(normal_cur, 3);
setChildIndex(left_cur, 2);
setChildIndex(right_cur, 1);
setChildIndex(showImg, 0);
//swapChildren(right_cur,showImg);

reset_cursor();
}
stage.addEventListener(MouseEvent.MOUSE_MOVE, onStageMouseMove)
stage.addEventListener(MouseEvent.CLICK, onStageMouseClick)
stage.addEventListener(MouseEvent.MOUSE_DOWN, onStageMouseDown)

function onStageMouseDown(evt:MouseEvent):void
{
if (showImg.hitTestPoint(evt.stageX, evt.stageY))
{
trace("hit");
canDrag = true;
LBDownX = evt.stageX;
LBDownY = evt.stageY;
}
}

function onStageMouseMove(evt:MouseEvent):void
{
Mouse.hide();
if (evt.stageX < go_limit)
{
//trace(evt.stageX);
left_cur.visible = true;
normal_cur.visible = false;

go_left = true
left_cur.x = evt.stageX;
left_cur.y = evt.stageY;
}
else if ( evt.stageX > stage.stageWidth - go_limit)
{
right_cur.visible = true;
normal_cur.visible = false;

go_right = true;
right_cur.x = evt.stageX;
right_cur.y = evt.stageY;
}
else
{
go_left = false;
go_right = false;
left_cur.visible = false;
right_cur.visible = false;
normal_cur.visible = true;
normal_cur.x = evt.stageX;
normal_cur.y = evt.stageY
}

if (canDrag)
{
//trace("move");
var offsetX = evt.stageX - LBDownX;
var offsetY = evt.stageY - LBDownY;

LBDownX = evt.stageX;
LBDownY = evt.stageY;

showImg.x += offsetX;
showImg.y += offsetY;
}


}

function onStageMouseClick(evt:MouseEvent):void
{
if (go_left)
{
trace("left");
Mouse.hide();
fscommand("Look_Left_Img", "callC++");
//LoadImage("E:/mm.jpg", 850, 1000);
}
else if (go_right)
{
trace("right");

fscommand("Look_Right_Img", "callC++");
Mouse.hide();
}
}



//function onMouseDown(evt:MouseEvent):void
//
{
//
trace("mouse down");
//
canDrag = true;
//
LBDownX = evt.stageX;
//
LBDownY = evt.stageY;
//
}

function onMouseMove(evt:MouseEvent):void
{

}

function onMouseUp(evt:MouseEvent):void
{
canDrag = false;
}

function onMouseWheel(evt:MouseEvent):void
{
trace(evt.delta);
ZoomTo(evt.delta*0.2 , evt.delta*0.2);
}

function IsPosInImage(posX:Number, posY:Number):Boolean
{
return img.hitTestPoint(posX,posY);

}

function ScaleAroundPoint(objToScale:DisplayObject,regX:Number, regY:Number, scaleX:Number, scaleY:Number):void
{
if (!objToScale)
{
return;
}

var transformVector:Point = new Point((regX - objToScale.x)*scaleX, (regY - objToScale.y)*scaleY);

objToScale.x = regX - transformVector.x;
objToScale.y = regY - transformVector.y;
objToScale.scaleX *= scaleX;
objToScale.scaleY *= scaleY;
}

// scale
function ZoomTo(scalerH:Number, scalerW:Number):void
{
if ((img.height + scaleH * scalerH) > 0 && (img.width + scaleW * scalerW) > 0)
{

if (IsPosInImage(stage.stageWidth/2, stage.stageHeight/2))
{
trace("hit");
//imgMatrix.translate(-stage.width/2, -stage.height/2);
//imgMatrix.tx -=stage.width/2;
//imgMatrix.ty -=stage.height/2;
//imgMatrix.scale(scalerW+1.0, scalerH + 1.0);

//imgMatrix.tx +=stage.width/2;
//imgMatrix.ty +=stage.height/2;

//imgMatrix.translate(stage.width/2, stage.height/2);
ScaleAroundPoint(showImg, stage.stageWidth/2, stage.stageHeight/2, scalerW+1.0, scalerH + 1.0);
}
else
{
//imgMatrix.translate(-(transformPoint.x + originX), -(transformPoint.y + originY));
//
imgMatrix.scale(scalerW+1.0, scalerH + 1.0);
//
imgMatrix.translate(transformPoint.x + originX, transformPoint.y + originY);
ScaleAroundPoint(showImg, showImg.x+showImg.width/2, showImg.y+showImg.height/2, scalerW+1.0, scalerH + 1.0);
}

//showImg.scaleX += scalerW;
//showImg.scaleY += scalerH;


trace((showImg.x+showImg.width/2), (showImg.y+showImg.height/2));

//showImg.transform.matrix = imgMatrix;

//drawSqaure(showImg.x, showImg.y, showImg.width, showImg.height);
//drawSqaure(img.x, img.y, img.width, img.height);
}
}

// radian to degree
function RadianToDegree(radian:Number):Number
{
return radian * 180/Math.PI;
}

// get radian after mouseMove
function RadianAfterMove(mouseX:Number, mouseY:Number):Number
{
var flag:Boolean = true;

//根据鼠标偏移距离来决定旋转角度大小
var diffX:Number = mouseX - rbX;
var diffY:Number = mouseY - rbY;

var distance:Number = Math.sqrt(diffX*diffX+diffY*diffY);

rbX = mouseX;
rbY = mouseY;

if (Math.abs(diffY) >= Math.abs(diffX))
{
if (diffY < 0)
flag = false;
}
else
{
if (diffX < 0)
flag = false;
}

if (flag)
{
rotRadian += distance * rotScalar;
return distance * rotScalar;

}
else
{
rotRadian -= distance * rotScalar;
return -distance * rotScalar;
}

//return rotRadian;
}

// right button down
function onRBDown(posX:Number, posY:Number):void
{
isRBDown = true;
rbX = posX;
rbY = posY;
//normal_cur.visible = false;
//size_scalarx = stage.mouseX/rbX;
//size_scalary = stage.mouseY/rbY;
}

// mouse move when right button down
//
function onRBMove(evt:MouseEvent):void
function onRBMove(posX:Number, posY:Number):void
{
if (isRBDown)
{
trace(showImg);
normal_cur.x = normal_cur.x+ (posX - rbX)*size_scalarx;
normal_cur.y = normal_cur.y + (posY - rbY)* size_scalary;
//var imgMatrix:Matrix3D = showImg.transform.matrix3D;
//

//
var centerX:Number = img.width / 2;
//
//
var centerY:Number = img.height / 2;
//
//
var centerPoint:Vector3D = new Vector3D(centerX, centerY, 0);
//
//
var transformPoint:Vector3D = imgMatrix.transformVector(centerPoint);
//

//
imgMatrix.prependTranslation((transformPoint.x + originX), (transformPoint.y + originY), 0);
//
//
imgMatrix.prependRotation(RadianAfterMove(posX, posY)*10, Vector3D.Z_AXIS);
//
//
imgMatrix.prependTranslation(-transformPoint.x + originX, -transformPoint.y + originY, 0);
//

//
showImg.transform.matrix3D = imgMatrix;

var imgMatrix:Matrix = showImg.transform.matrix;

var centerX:Number = img.width/2;
var centerY:Number = img.height/2;

var centerPoint:Point = new Point(centerX, centerY);
var transformPoint:Point = imgMatrix.transformPoint(centerPoint);

imgMatrix.translate(-transformPoint.x, -transformPoint.y);
imgMatrix.rotate(RadianAfterMove(posX, posY))
imgMatrix.translate(transformPoint.x, transformPoint.y);

showImg.transform.matrix = imgMatrix;
//drawSqaure(showImg.x, showImg.y, showImg.width, showImg.height);
//drawSqaure(img.x, img.y, img.width, img.height);
}
}

// right button up
function onRBUp():void
{
isRBDown = false;
//normal_cur.visible = true;
//normal_cur.x = stage.mouseX;
//normal_cur.y = stage.mouseY;
}

function onMoveRotateX(posX:Number, posY:Number):void
{
showImg.rotationX += RadianAfterMove(posX, posY)*10;
}

stop();

 

功能为左键拖动图片,中键缩放图片,右键旋转图片。

这是flash里的代码,生成SWF后,用MFC中的shockwaveflash读入,再截获右键消息,使右键菜单屏蔽。