Alert,TitleWindow以及PopUp的简单分析

这两天为了Fluorida的closePopUp功能,读了点Flex框架的源码,对Alert,TitleWindow以及Flex的PopUp功能做了简单的分析。
【Alert和PopUp】
Alert内部其实是调用了PopUpManager.在parent参数为null或者为Application的时候,弹出的窗口将跟当前Application在一个容器下。Alert在最顶层,Application在最底层,中间那层是一个称之为modalWindows的控件,其实就是Alert后面那个磨砂的层。为了点到Alert上的按钮,写了一个小程序分析Alert的结构,不是很好读,但是可以运行一下,看看分析出的Alert的内部结构:(大略说一下,Alert的Child有一个AlertForm,而AlertForm的Child除了第一个是TextField以外,都是按钮)

<? xml version="1.0" encoding="utf-8" ?>
< mx:Application  xmlns:mx ="http://www.adobe.com/2006/mxml"  layout ="horizontal" >
    
< mx:Script >
        
<![CDATA[
            import mx.core.IChildList;
            import mx.core.UIComponent;
            import mx.core.IFlexDisplayObject;
            import mx.managers.ISystemManager;
            import mx.managers.PopUpManagerChildList;
            import mx.managers.PopUpManager;
            import mx.controls.Alert;
            import mx.events.CloseEvent;
            import mx.core.Singleton;
            import mx.managers.IPopUpManager;
            
            private function showSimpleAlert():void{
                Alert.okLabel="oKey";
                Alert.show("Hello, World!","",15,null,alertCloseHandle);
                var myTimer:Timer = new Timer(1000, 1);
                   myTimer.addEventListener("timer", timerHandler);
                   myTimer.start();            
            }
            
            private function alertCloseHandle(event:CloseEvent):void{
                simpleAlertShower.label = event.detail.toString();
            }
            
            private function timerHandler(event:TimerEvent):void{
                var text:String = "elements:";
                var sm:ISystemManager = (Application.application.root as ISystemManager);
                text+=sm.numChildren.toString();
                text+=";\n modalWindows:";
                text+=sm.numModalWindows.toString();
                for(var index:int = 0; index < sm.numChildren; index++)
                {
                    text += "\n" + index + " : ";
                    text += sm.getChildAt(index).toString(); 
                }
                
                var alert:Alert = sm.getChildAt(sm.numChildren - 1) as Alert;
                text += "\n buttonFlags : "+alert.buttonFlags;
                text += "\n alertChildren:" + alert.numChildren;
                for(var index:int = 0; index < alert.numChildren; index++)
                {
                    text +="\n" + alert.getChildAt(index).toString();
                }
                var alertForm:UIComponent = alert.getChildAt(0) as UIComponent;
                text += "\n alertFormChildren:" + alertForm.numChildren;
                
                for(var index:int = 0; index < alertForm.numChildren; index++)
                {
                    text +="\n"+index+":"+ alertForm.getChildAt(index).toString();
                    
                }
                popupChildText.text = text;
                alertForm.getChildAt(1).dispatchEvent(new MouseEvent(MouseEvent.CLICK));
//                var popupContainer:IChildList = (application.root as IChildList);
//                PopUpManager.removePopUp(popupContainer.getChildAt( popupContainer.numChildren - 1 ) as IFlexDisplayObject);

            }
        
]]>
    
</ mx:Script >     
      
< mx:Button  id ="simpleAlertShower"  click ="showSimpleAlert();"  label ="Click Me" />
      
< mx:Text  id ="popupChildText" />
    
</ mx:Application >

【关于TitleWindow】
TitleWindow作为弹出窗口的时候,跟Alert处的位置没什么区别,我想说的是TitleWindow的closeButton在哪里。下面这个同样不好读的程序可以帮助你分析TitleWindow或者说Panel里面都有用什么,以及closeButton在哪,其实就是在rawChildren的最后一个。

<? xml version="1.0" encoding="utf-8" ?>
< mx:Application  xmlns:mx ="http://www.adobe.com/2006/mxml"  layout ="horizontal" >
    
< mx:Script >
        
<![CDATA[
            import mx.containers.TitleWindow;
            import mx.core.IChildList;
            import mx.core.UIComponent;
            import mx.core.IFlexDisplayObject;
            import mx.managers.ISystemManager;
            import mx.managers.PopUpManagerChildList;
            import mx.managers.PopUpManager;
            import mx.controls.Alert;
            import mx.events.CloseEvent;
            import mx.core.Singleton;
            import mx.managers.IPopUpManager;
            
            private function showSimpleAlert():void{
                var popUpWindow:TitleWindow = TitleWindow(PopUpManager.createPopUp(this,TitleWindow,true));
                popUpWindow.width = 400;
                popUpWindow.height = 300;
                popUpWindow.visible = true;
                popUpWindow.showCloseButton = true;
                var myTimer:Timer = new Timer(2000, 1);
                   myTimer.addEventListener("timer", timerHandler);
                   myTimer.start();    
            }
            
            private function alertCloseHandle(event:CloseEvent):void{
                simpleAlertShower.label = event.detail.toString();
            }
            
            private function timerHandler(event:TimerEvent):void{
                var text:String = "elements:";
                var sm:ISystemManager = (Application.application.root as ISystemManager);
                text+=sm.numChildren.toString();
                text+=";\n modalWindows:";
                text+=sm.numModalWindows.toString();
                text+="\n top children: ";
                for(var index:int = 0; index < sm.numChildren; index++)
                {
                    text += "\n" + index + " : ";
                    text += sm.getChildAt(index).toString(); 
                }
                
                var titleWindow:TitleWindow = sm.getChildAt(sm.numChildren - 1) as TitleWindow;
                text += "\n popUpWindowrawChildren:" + titleWindow.rawChildren.numChildren;
                for(var index:int = 0; index < titleWindow.rawChildren.numChildren; index++)
                {
                    text +="\n" + titleWindow.rawChildren.getChildAt(index).toString();
                }
                var titleBar:UIComponent = (titleWindow.rawChildren.getChildAt(2) as UIComponent);
                text += " has " + titleBar.numChildren;
                text += "\n" + titleBar.getChildAt(3).toString();
                
                popupChildText.text = text;
//                var popupContainer:IChildList = (application.root as IChildList);
//                PopUpManager.removePopUp(popupContainer.getChildAt( popupContainer.numChildren - 1 ) as IFlexDisplayObject);
                PopUpManager.removePopUp(titleWindow);
            }
        
]]>
    
</ mx:Script >     
      
< mx:Button  id ="simpleAlertShower"  click ="showSimpleAlert();"  label ="Click Me" />
      
< mx:Text  id ="popupChildText" />
    
</ mx:Application >
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自定义winform 窗口标题栏 主要代码 public partial class ZForm : Form { private bool moving = false; private Point oldMousePosition; public new FormBorderStyle FormBorderStyle { get { return base.FormBorderStyle; } set { if (value != FormBorderStyle.Sizable && value != FormBorderStyle.SizableToolWindow) { titlepanel.Controls.Remove(button2); } base.FormBorderStyle = value; } } #region 隐藏父类的属性,使其不可见 [Browsable(false)] public new string Text { get { return titlelabel.Text; } set { } } [Browsable(false)] public new bool ControlBox { get { return false; } set { base.ControlBox = false; } } #endregion [Browsable(true)] [EditorBrowsable(EditorBrowsableState.Always)] [Description("窗体标题")] public string Title { get { return titlelabel.Text; } set { titlelabel.Text = value; } } [Browsable(true)] [EditorBrowsable(EditorBrowsableState.Always)] [Description("窗体标题字体样式")] public Font TitleFont { get { return titlelabel.Font; } set { titlelabel.Font = value; } } [Browsable(true)] [EditorBrowsable(EditorBrowsableState.Always)] [Description("窗体标题字体颜色")] public Color TitleColor { get { return titlelabel.ForeColor; } set { titlelabel.ForeColor = value; } } [Browsable(true)] [EditorBrowsable(EditorBrowsableState.Always)] [Description("窗体标题栏背景色")] public Color TitleBarBackColor { get { return titlepanel.BackColor; } set { titlepanel.BackColor = value; } } public new bool MaximizeBox { get { return titlepanel.Contains(button2); } set { if (!value) { titlepanel.Controls.Remove(button2); } else if (!titlepanel.Contains(button2)) { titlepanel.Controls.Add(button2); } } } public new bool MinimizeBox { get { return titlepanel.Contains(button3); } set { if (!value) { titlepanel.Controls.Remove(button3); } else if (!titlepanel.Contains(button3)) { titlepanel.Controls.Add(button3); } } } private void ResetTitlePanel() { base.ControlBox = false; base.Text = null; SetToolTip(button1, "关闭"); button2.Size = button1.Size; SetToolTip(button2, "最大化或还原"); button3.Size = button1.Size; SetToolTip(button3, "最小化"); } private void SetToolTip(Control ctrl, string tip) { new ToolTip().SetToolTip(ctrl, tip); } public ZForm() { InitializeComponent(); ResetTitlePanel(); } private void Titlebutton_Click(object sender, EventArgs e) { Button btn = (Button)sender; switch (btn.Tag.ToString()) { case "close": { this.Close(); break; } case "max": { if (this.WindowState == FormWindowState.Maximized) { this.WindowState = FormWindowState.Normal; } else { this.WindowState = FormWindowState.Maximized; } break; } case "min": { if (this.WindowState != FormWindowState.Minimized) { this.WindowState = FormWindowState.Minimized; } break; } } } private void Titlepanel_MouseDown(object sender, MouseEventArgs e) { if (this.WindowState == FormWindowState.Maximized) { return; } //Titlepanel.Cursor = Cursors.NoMove2D; oldMousePosition = e.Location; moving = true; } private void Titlepanel_MouseUp(object sender, MouseEventArgs e) { //Titlepanel.Cursor = Cursors.Default; moving = false; } private void Titlepanel_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left && moving) { Point newPosition = new Point(e.Location.X - oldMousePosition.X, e.Location.Y - oldMousePosition.Y); this.Location += new Size(newPosition); } } private void Titlepanel_DoubleClick(object sender, EventArgs e) { if (titlepanel.Contains(button2)) { button2.PerformClick(); } } private void titlepanel_ControlRemoved(object sender, ControlEventArgs e) { switch (e.Control.Name) { case "button2": { if (titlepanel.Contains(button3)) { button3.Left = button1.Left - button1.Width; } break; } } } private void titlepanel_ControlAdded(object sender, ControlEventArgs e) { switch (e.Control.Name) { case "button2": { if (titlepanel.Contains(button3)) { button3.Left = button2.Left - button2.Width; } break; } case "button3": { if (titlepanel.Contains(button2)) { button3.Left = button2.Left - button2.Width; } break; } } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值