【问题标题】:Resize AIR app window while dragging拖动时调整 AIR 应用程序窗口的大小
【发布时间】:2011-02-03 21:09:24
【问题描述】:

所以我注意到 Windows 7 有一种令人不安的倾向,即阻止您将窗口的标题栏拖离屏幕顶部。如果您尝试 - 在这种情况下,使用在窗口底部具有可拖动区域的空中应用程序,允许您将窗口顶部向上推过屏幕 - 它只会将窗口向下踢得足够远,以至于标题栏位于它认为的“可见区域”的顶部。

一种解决方案是在应用程序窗口移动时调整其大小,以便标题栏始终位于窗口所需的位置。但是,在拖动窗口时如何调整窗口大小?你会这样吗?

dragHitArea.addEventListener(MouseEvent.MOUSE_DOWN, function(e:MouseEvent):void{
    stage.nativeWindow.height += 50;
    stage.nativeWindow.startMove();
    stage.nativeWindow.height -= 50;
});

看看那里发生了什么?当我单击时,我正在执行startMove(),它连接到操作系统的用于拖动窗口的功能。我还将窗口的高度增加和减少了 50 像素 - 这应该不会给我带来净增加,对吧?

错误 - 第一个 '.height +=' 被执行,但 .startMove() 之后的 '.height -=' 从未运行。

为什么?

【问题讨论】:

  • update - 如果你好奇,我正在编写一个带有向右和向上扩展的弹出式菜单的空气小部件 - 因为这些元素只能显示在应用程序窗口本身的边界(即使窗口设置为无镶边和透明)我必须扩展应用程序的边界以包含菜单“弹出”到的区域。在极端情况下,小部件位于左下角,菜单完全扩展到屏幕的右侧和顶部边缘,应用程序区域可以很好地覆盖整个桌面。
  • 问题是,当它像这样展开时,如果用户将它向上和向右拖动,它会导致应用程序窗口的“标题栏”区域移动到桌面的上边缘之上通常无法到达的区域;一旦.startMove() 操作完成,Windows 会自动将窗口重新定位到该边缘下方。所以我想做的是为了操作系统的利益不断调整应用程序的高度,以便窗口的标题栏永远不会超过桌面区域的顶部边界。
  • 我想知道是否有人意识到正确答案很可能是“你不能”,如果他们提交它,他们会得到这个赏金吗?

标签: flash actionscript-3 air desktop-application


【解决方案1】:

您是否尝试过调查NativeWindowBoundsEvent.MOVING 事件?

stage.nativeWindow.addEventListener(NativeWindowBoundsEvent.MOVING, windowMove); 私有函数 windowMove(e:NativeWindowBoundsEvent) : void { 跟踪(e.beforeBounds); 跟踪(e.afterBounds); // 根据需要调整窗口大小 }

参考资料:Google,将我引至http://lowpitch.com/blog/nativewindow-using-air-windows-with-actionscript-part-3-of-3/,将我引至http://livedocs.adobe.com/flex/3/langref/flash/events/NativeWindowBoundsEvent.html

NativeWindowBoundsEvent.MOVING 在位置实际改变之前被触发,而NativeWindowBoundsEvent.MOVE 在位置改变之后被触发,如果你想知道的话。因此,您将需要 MOVING 事件

(顺便说一句,我很想在不为赏金做任何研究的情况下直接说“你做不到”......但觉得这很刻薄)

【讨论】:

  • 明天早上我到办公室时会看看这个。我知道,切得很近。 :)
  • 不 - 添加“e.curentTarget.height = 50;”在您的事件处理程序中,并且当由于 stage.nativeWindow.startMove() 而触发时,无论您在听什么,高度都不会跳到 50。我真的认为这是无法做到的-在拖动窗口以重新定位它时不能调整窗口大小,也不能以标题栏结束的方式拖放窗口在桌面区域上方。
  • 我希望你尝试e.currentTarget 而不是e.curentTarget 呵呵。但无论如何,如果这不起作用......那么这是一个可能的解决方法。不要使用内置的东西,而是伪造它。将 MOUSE_DOWN 附加到您想要移动屏幕的位置。然后,当 MOUSE_DOWN 被激活时,附加一个 MOUSE_MOVE 和 MOUSE_UP。在 MOUSE_MOVE 中,您将手动移动窗口,必要时调整大小。在 MOUSE_UP 中,您将删除 MOUSE_MOVE 和 MOUSE_UP。请注意,MOUSE_MOVE 可能应该附加到舞台上。
  • 是的,这仍然是一种可能性 - 问题是,从我所看到的来看,操作系统的重新定位窗口的功能比 AIR 的功能要流畅得多......但我可能最终不得不这样做.
  • 对不起,我帮不上什么忙。但至少你知道至少有一种可能的方法可以做到这一点:)
【解决方案2】:

我开发了一个类似的应用程序,带有飞出窗口,在遇到一些问题后,我决定摆脱 NativeWindows,并在一个屏幕大小的无铬窗口中完成所有操作。 每次应用程序启动时,我都会将窗口大小调整为屏幕大小。我设计了一个带有按钮和所有内容的自定义标题栏,小部件的主窗口实际上是一个画布,我在应用程序的窗口上拖动它。弹出式菜单和窗口也是如此:它们只是基于 Canvas 的组件。 将组件拖到窗口的可见区域之外没有问题,因为它与屏幕相同。

但是,就像我说的那样,做出如此剧烈的改变可能为时已晚。

【讨论】:

  • 啊 - 我真的试过了,它几乎可以工作,除了一个特定的用例 - 一个多显示器设置,包括不均匀的屏幕。想象一下笔记本电脑屏幕和投影仪,或者一对水平的屏幕和一个垂直对齐的屏幕,或者三角形配置的三个屏幕 - 闪光灯很难制作一个准确跨越整个可见区域的窗口,除非你'有方法吗?
  • 我没有想到...我对只有一个屏幕感到满意 :)
  • 哦,cornelui - 相信我,帮自己一个忙,至少把双屏设置放在一起。你将永远想回去。
【解决方案3】:

这似乎是一个有趣的效果,而不是所有标准的窗口行为。为什么你觉得有必要做任何事情?如果需要,为什么不让用户自己调整窗口大小?

【讨论】:

  • 我的意思是,我为什么要这样做并不重要,问题是 如何 这样做......但因为它可能听起来有点奇怪,我将更新问题以澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多