http://sunshineyao.iteye.com/blog/827432
近日工作中需要用到类似Windows那种罕有最大化、最小化、关闭功能的TitleWindow,而Flex本身并无这个组件(Flex AI有NativeWindow这个组件)。于是上网搜索,发现了MDI,但是感觉代码太多而且代码侵入性很强不便于扩展,其更适合与在一个空间内存在多个Panel的场景,ResizeTitleWindow与ResizeManage更使用于我的应用场景,我最终使用的是ResizeManag这个组件但不幸的是下载下来的资源也是有残缺,心想反正自己也是得做扩展的因而放弃了寻找完全可用版的努力,继而开始研究源代码并进行了相应的修改与扩展。
ResizeWindow.as
- package sjd.containers
- {
- import flash.events.MouseEvent;
- import flash.geom.Point;
- import mx.containers.Form;
- import mx.containers.FormItem;
- import mx.containers.TitleWindow;
- import mx.controls.Button;
- import mx.controls.TextInput;
- import mx.core.Application;
- import mx.events.FlexEvent;
- import sjd.utils.CursorUtil;
- [Event(name="closeWindow", type="mx.events.FlexEvent")]
- [Event(name="minWindow", type="mx.events.FlexEvent")]
- [Event(name="maxWindow", type="mx.events.FlexEvent")]
- /**
- * @class ResizeWindow
- * @brief A TitleWindow with Resize Enabled and Max, Min, Close Button
- * @author Jove
- * @version 1.1
- */
- public class ResizeWindow extends TitleWindow{
- private static const SIDE_OTHER:Number = 0;
- private static const SIDE_TOP:Number = 1;
- private static const SIDE_BOTTOM:Number = 2;
- private static const SIDE_LEFT:Number = 4;
- private static const SIDE_RIGHT:Number = 8;
- private static var resizeObj:Object;
- private static var mouseState:Number = 0;
- private static var mouseMargin:Number = 10;
- [Embed(source="/sjd/assets/verticalSize.gif")]
- private var verticalSize:Class;
- [Embed(source="/sjd/assets/horizontalSize.gif")]
- private var horizontalSize:Class;
- [Embed(source="/sjd/assets/leftObliqueSize.gif")]
- private var leftObliqueSize:Class;
- [Embed(source="/sjd/assets/rightObliqueSize.gif")]
- private var rightObliqueSize:Class;
- private var oWidth:Number = 0;
- private var oHeight:Number = 0;
- private var oX:Number = 0;
- private var oY:Number = 0;
- private var oPoint:Point = new Point();
- private var _showWindowButtons:Boolean = true;
- private var _windowMinSize:Number = 150;
- //private var form:MyForm = new MyForm();
- /**
- * Constructor.
- * Add mouse envent to this window and application.
- * initialize the old positions.
- */
- public function ResizeWindow(){
- super();
- addContent();
- initPosition(this);
- this.addEventListener(MouseEvent.MOUSE_MOVE, oMouseMove);
- this.addEventListener(MouseEvent.MOUSE_OUT, oMouseOut);
- this.addEventListener(MouseEvent.MOUSE_DOWN, oMouseDown);
- //this.addEventListener(MouseEvent.MOUSE_UP, oMouseUp);
- this.addEventListener(FlexEvent.CREATION_COMPLETE, addButton);
- //Application.application.parent:SystemManager
- Application.application.parent.addEventListener(MouseEvent.MOUSE_UP, oMouseUp);
- Application.application.parent.addEventListener(MouseEvent.MOUSE_MOVE, oResize);
- }
- private function addContent():void{
- var form:Form = new Form();
- var formItem1:FormItem = new FormItem();
- formItem1.label = "事件源";
- var text:TextInput = new TextInput();
- formItem1.addChild(text);
- form.width = 200;
- form.addChild(formItem1);
- //form.width = this.width;
- //form.height = this.height;
- this.addChild(form);
- //this.updateDisplayList(100,100);
- }
- public function set showWindowButtons(show:Boolean):void{
- _showWindowButtons = show;
- if(titleBar != null){
- addButton(new FlexEvent(""));
- }
- }
- public function get showWindowButtons():Boolean{
- return _showWindowButtons;
- }
- public function set windowMinSize(size:Number):void{
- if(size > 0){
- _windowMinSize = size;
- }
- }
- public function get windowMinSize():Number{
- return _windowMinSize;
- }
- private static function initPosition(obj:Object):void{
- obj.oHeight = obj.height;
- obj.oWidth = obj.width;
- obj.oX = obj.x;
- obj.oY = obj.y;
- }
- /**
- * Set the first global point that mouse down on the window.
- * @param The MouseEvent.MOUSE_DOWN
- */
- private function oMouseDown(event:MouseEvent):void{
- if(mouseState != SIDE_OTHER){
- resizeObj = event.currentTarget;
- initPosition(resizeObj);
- oPoint.x = resizeObj.mouseX;
- oPoint.y = resizeObj.mouseY;
- oPoint = this.localToGlobal(oPoint);
- }