【问题标题】:Testing to see if a window is maximized测试窗口是否最大化
【发布时间】:2009-08-05 10:43:01
【问题描述】:

我注意到在 Windows 中,如果您最大化一个窗口,您将无法调整它的大小,直到您再次取消最大化它。这似乎是一种正常行为,因此我想在窗口最大化时移除我的调整大小抓手。

目前我找不到一个属性来检测窗口是否最大化,虽然我可以在我的控制器中添加一个布尔值,但它不一定会捕获来自操作系统的最大化请求。

如果您知道测试窗口是否最大化的可靠方法,请告诉我。

在相关说明中,我使用的是自定义镶边,当我最大化一个窗口时,它会与 Windows 任务栏重叠。我可以想到检测可用屏幕尺寸的技巧(使用透明的系统镀铬窗口),但最好知道更好的方法。

谢谢

罗伯

【问题讨论】:

    标签: windows apache-flex actionscript-3 air


    【解决方案1】:

    在您的应用程序 (MXML) 中的 init 方法中,您通常会在 creationComplete 上调用:

    <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
        creationComplete="init()" >
    

    添加以下代码:

    this.addEventListener(NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGE, trackState);
    

    方法如下:

    public function trackState(event:NativeWindowDisplayStateEvent):void
        {
            if (event.afterDisplayState == NativeWindowDisplayState.MAXIMIZED)
            {
                isMaximised = true;
            } else {
                isMaximised = false;
            }
        }
    

    【讨论】:

    • 谢谢!这是一种更简洁的状态跟踪方式。
    【解决方案2】:

    多亏了 TheBrain 的一些建议,我已经弄清楚了如何最好地做到这一点。

    首先,您需要注意调整要控制的窗口的大小事件:

    NativeApplication.nativeApplication.activeWindow.addEventListener(NativeWindowBoundsEvent.RESIZE, onWindowResize);
    

    然后处理那个事件来决定窗口是否最大化:

    public function onWindowResize(event:NativeWindowBoundsEvent):void
    {
        if (event.afterBounds.height >= Screen.mainScreen.visibleBounds.height && event.afterBounds.width >= Screen.mainScreen.visibleBounds.width)
            isMaximised = true;
        else
            isMaximised = false;
    }
    

    然后您需要捕获或创建自己的最大化按钮,并在单击时执行以下代码:

                if (isMaximised)
                {
                    var bounds:Rectangle = Screen.mainScreen.visibleBounds;
                    NativeApplication.nativeApplication.activeWindow.bounds = bounds;
                }
                else
                {
                    NativeApplication.nativeApplication.activeWindow.bounds = new Rectangle(100, 100, 500, 600);
                }
    

    您可以将边界修改为过度最大化(这对于带有阴影的自定义 chrome 窗口很方便),您还可以将应用程序设置为在最大化按钮已最大化时重置为默认大小(或什么都不做)。

    我遇到了关于何时分配窗口调整大小侦听器的问题,并最终在每次单击最大化按钮时删除和添加它。这有点矫枉过正,但还不错。

    【讨论】:

    • 查看 Ril 的答案,了解一种更简洁的跟踪状态的方法!
    • 我更喜欢这个答案,因为它不是特定于 MXML 的 - 将侦听器添加到活动窗口让我感到困惑
    【解决方案3】:

    有 Win32 API 调用可以为您执行此操作:

    BOOL IsZoomed(HWND hWnd);

    【讨论】:

    • 恐怕你无法通过 AIR 运行时访问它!
    • 哦,是的。对不起。忘记先检查标签了。
    【解决方案4】:

    要从屏幕上获取实际可用空间,请使用flash.display.Screen 类,或者您可以使用返回操作系统允许的最大窗口大小的systemMaxSize()。为了最大化,您有一些事件在最大化/最小化/恢复时窗口正在调度。您可以在 adobe 页面上找到更多信息(systemMaxSize 下的链接)。

    检测窗口是否最大化...我不认为有这样的功能(我可能错了)但是您可以测试应用程序大小是否与可用的屏幕大小相等,这意味着它已最大化。或者挂钩在应用最大化/最小化/调整大小时触发的调整大小事件

    【讨论】:

    • 我认为使用 systemMaxSize() 函数我可以制作自己的最大化命令来调整窗口大小。但是,当用户在窗口大小 == systemMaxSize() 时单击最大化按钮时,我还需要添加一个小管理器,然后将其恢复到最后一次单击最大化按钮时的窗口大小。不过应该不是太大问题:)
    【解决方案5】:

    这是检查窗口是否最大化的更简单方法:

    if(stage.nativeWindow.displayState == NativeWindowDisplayState.MAXIMIZED)
    {
        //do something
    }
    

    【讨论】:

      【解决方案6】:

      以下内容对我有用。无需设置事件监听,这段代码可以用来查看原生窗口的实时状态:

      if (nativeWindow.displayState == 'maximized')
      {
          trace('Maximized');
      }
      else
      {
          trace('Minimized');
      }
      

      【讨论】:

        【解决方案7】:

        你可以使用like this 来挂钩maximize() 事件吗?

        【讨论】:

        • 是的,应该可以,但并不理想。您还可以将其构建到控制器中以最大化窗口。不确定仅在 Windows 上解决问题的最佳方法...
        猜你喜欢
        • 2020-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-23
        相关资源
        最近更新 更多