【问题标题】:Is there a AUI pane move (or dock) event in wxPHP?wxPHP 中是否存在 AUI 窗格移动(或停靠)事件?
【发布时间】:2016-04-22 01:43:36
【问题描述】:

this question 上,我一直在尝试捕获 AUI 窗格配置,以便在关闭任何窗格时可以恢复它。 wxPHP 的文档有些有限,wxWidgets 的文档在上游,所以我在很大程度上是摸索着自己的方式。

我意识到SavePaneInfo 将帮助我捕捉窗格的状态 - 它输出一个透视字符串,表示在给定时刻窗格的位置和选项。因此,我需要做的就是捕捉窗格何时发生变化并更新它的内部表示。

为了感兴趣,透视图如下:

name=auiPane3;caption=Caption 3;state=2099196;dir=3;layer=0;row=0;pos=1;prop=100000;bestw=90;besth=25;minw=-1;minh =-1;maxw=-1;maxh=-1;floatx=-1;floaty=-1;floatw=-1;floath=-1

但是,事实证明,捕获移动/停靠事件并非易事。我可以看到与 AUI 相关的六个事件:

wxEVT_AUI_FIND_MANAGER
wxEVT_AUI_PANE_BUTTON
wxEVT_AUI_PANE_CLOSE
wxEVT_AUI_PANE_MAXIMISE
wxEVT_AUI_PANE_RESTORE
wxEVT_AUI_PANE_RENDER

我已经能够捕获恢复和关闭事件,而 find_manager 似乎没有做任何事情。我在这个窗口上试过wxEVT_ANY,它似乎也没有捕捉到任何东西。我也在单个窗格上尝试过,但无济于事(据我所知,没有任何调用):

$managedWindow->getWindowByIndex(0)->Connect(wxEVT_ANY, array($this, "onAny"));

上游库 wxWidgets 的文档提到了这个事件:

EVT_AUI_PANE_ACTIVATED

然而,这似乎并没有在 wxPHP 中实现——这就是我想要的吗?这听起来不太对,但如果我可以在没有常量的情况下访问它,我肯定会尝试它。

我想我可以将wxAuiManager::SetArtProvider 与标准艺术提供者对象一起使用,经过修改以捕获窗格状态,但这感觉就像是一把大锤来破解坚果。我还可以捕获关闭事件并更改返回的透视字符串,因此未设置“关闭”位,但这也不是特别优雅。

我想做的事情感觉真的很琐碎,并且会与 wxWidgets 的其他部分保持一致,但事实并非如此。有什么可以尝试的建议吗?

【问题讨论】:

  • 目前还不清楚您到底想做什么。通常,您保存程序关闭的透视图并在(下一次)启动时恢复它。您想在每次布局更改后自动保存它吗?如果是这样,为什么(你确定这是个好主意)?
  • @VZ.: 用户可以关闭一些窗格,我希望他们能够在上次停靠或浮动的位置重新打开窗格。为此,我在另一个窗口上有一个按钮。
  • wxEVT_AUI_PANE_CLOSE 上保存视角就足够了(请注意,如果需要,您也可以否决此事件以防止窗格被关闭)。
  • @VZ.:我已经这样做了:关闭窗格时,我捕获透视字符串。但是,当我加载透视图时,并非所有窗格都已恢复,这让我想知道有时state 位域是否包含未正确设置的“打开/关闭”位(由于窗格已关闭)。这就是为什么我想知道在使用它之前是否需要修改透视图 - 否则我可能会将它恢复到关闭状态。
  • 我想知道我接下来要调试的是否是查看是否有一个特定的窗格(或窗格类型)没有重新打开 - 可能有另一个错误阻止它。感谢您的回复。

标签: php wxwidgets wxphp


【解决方案1】:

我有一个解决方案。我希望从wxAuiManagerEvent 中检测到哪个窗格正在关闭,这样我只需在窗格关闭时记录它的透视字符串。然而,这似乎是不可能的:

  • 来自$event->GetEventObject() 的引用是NULL - 这可能是一个 wxPHP 错误;
  • $event->GetPane() 返回的窗格没有读取窗格名称的属性或方法。

因此,我采取了在一个窗格关闭时保存所有透视字符串的方法。

我发现透视字符串包含一个位来表示窗格的关闭状态,因此在存储这些字符串时我确保该位未设置。重新组装透视字符串并不是最优雅的事情,但它确实有效,并且比取消停靠和重新停靠要好得多(请参阅原帖中的链接问题)。

这里有一些代码在我的窗格中循环,获取透视字符串,取消设置关闭标志并将透视保存在窗口列表中:

public function onPaneClose(wxAuiManagerEvent $event)
{
    for($i = 0; $i <= 7; $i++)
    {
        $pi = $this->getPaneInfoByIndex($i);
        $persp = $this->getManagedWindow()->getAuiManager()->SavePaneInfo($pi);

        // Split perspective string into pieces, get the second one (state)
        $items = explode(';', $persp);
        $state = $items[2];

        // Decode the bitfield within
        $stateItems = explode('=', $state);
        $stateBitfield = (int) $stateItems[1];

        // Set up bitmask to ignore closed state
        $bitMask = (-1 ^ 2);

        // Reset the perspective string minus the closed state bit
        $replacementBitfield = $stateBitfield & $bitMask;
        $items[2] = "state=" . $replacementBitfield;
        $newPersp = implode(';', $items);

        // Finally save the perspective
        $this->windowSaves[$i] = $newPersp;
    }
}

【讨论】:

    【解决方案2】:

    我找到了另一种解决方案,我认为我比较喜欢。事实证明,可以从wxAuiPaneInfo 对象中获取窗格名称 - 透视图包含它!这让我可以简化算法 - 我只是将名称转换为序数,然后单独保存窗格透视图。

    由于窗格关闭事件总是在关闭之前触发(即当它们仍然可否决时),它们不会设置关闭位,所以很高兴我不必修改它。这是我的新事件处理程序:

    public function onPaneClose(wxAuiManagerEvent $event)
    {
        // In the absence of being able to read the pane name from a paneinfo
        // method, we can parse it out from the perpective string
        $info = $event->GetPane();
        $persp = $this->getManagedWindow()->getAuiManager()->SavePaneInfo($info);
    
        // Fish out the number, which represents the pane ordinal
        $matches = [];
        preg_match('#name=auiPane(\d+)#', $persp, $matches);
        if ($matches)
        {
            $index = $matches[1];
            $this->windowSaves[$index] = $persp;
        }
    }
    

    我刚刚在透视字符串上使用了一个与我的命名格式auiPane&lt;index&gt; 匹配的正则表达式。

    【讨论】:

    • 这看起来是个不错的解决方案。
    • 谢谢@VZ。 - 我的偏好是使用 $event-&gt;GetPane()-&gt;GetName() 来节省自制的字符串解析,但这不可用(至少在 wxPHP 中,我不知道其他绑定)。
    • 至少在 C++ 中name 只是这个类中的一个公共变量(是的,这很奇怪和不寻常......)。
    • 感谢@VZ.. 我在 PHP 对象 ($event-&gt;GetPane()-&gt;Name) 中尝试过,但无济于事 - 我可能会将其标记为错误。
    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 2011-03-06
    相关资源
    最近更新 更多