我已经设置了一个wxAuiManager
包含八个文本控件的简单系统,每个控件都设置为一个窗格,所有控件都围绕着一个中央静态控件.我有两个对齐到顶部,左,右和底部窗格方向.这部分工作正常.
我现在想修改每个窗格的属性,我认为可以通过重置关联来完成wxAuiPaneInfo
.例如,我想添加/删除引脚或最大化图标.我可以让它自己工作,但重置这些属性后重绘托管窗口被证明是一个挑战.
这是我目前使用的代码:
// Get the currently selected pane $paneIndex = $this->getSelectedPaneIndex(); /* @var $paneInfo wxAuiPaneInfo */ $paneInfo = $this->getPaneInfoByIndex($paneIndex); // Set new flag true/false on paneinfo, using setter methods /* @var $ctrl wxCheckBox */ $ctrl = wxDynamicCast($event->GetEventObject(), "wxCheckBox"); $methods = $this->getPaneSetterMethods(); $method = $methods[$ctrl->GetName()]; $paneInfo->$method($ctrl->GetValue()); /* @var $window \wxTextCtrl */ /* @var $manager \wxAuiManager */ $window = $this->getManagedWindow()->getWindowByIndex($paneIndex); $manager = $this->getManagedWindow()->getAuiManager(); // This sort of works, but the pane sometimes ends up being moved $manager->DetachPane($window); $manager->AddPane($window, $paneInfo); // Now redraw the panes $this->getManagedWindow()->getAuiManager()->Update();
正如您所看到的,我现在所做的是将窗格从管理器中分离出来,重新添加它,然后强制管理器重绘所有内容.这很好,除了它经常将窗口重新置于新位置.它也"感觉不对" - 修改这些属性必须能够独立于分离窗格而实现.
而不是这个,我认为值得尝试隐藏和显示窗格,但无济于事:
// This does not work at all $paneInfo->Hide(); $paneInfo->Show();
此外,我已经尝试使用窗格加载器,虽然我不知道什么是"透视字符串" - 据我所知,它不是一个控件属性.
// The string should be a "perspective string" $this->getManagedWindow()->getAuiManager()->LoadPaneInfo('auiPane0', $paneInfo);
总而言之:我有一个可行的解决方案,但它并不理想,因为它会重新讨论相关的窗格.我想我可以找出正确的命令将它重新停靠在同一个地方,但仍然觉得我应该能够以一种更简单的方式做到这一点.
有任何想法吗?
更新:我已经找到了如何使用透视捕获窗格信息,这可以这样做:
$this->winSave = []; for($i = 0; $i <= 7; $i++) { $pi = $this->getPaneInfoByIndex($i); $persp = $this->getManagedWindow()->getAuiManager()->SavePaneInfo($pi); echo $persp . "\n"; $this->winSave[$i] = $persp; }
我现在需要做的就是捕获一个窗格移动事件,然后我可以使用这些数据LoadPaneInfo()
.这证明有点困难 - wxPHP似乎没有提供足够的wxEVT
常量来允许这一点.我问了一个关于这个的新问题.
我会继续尝试一些新的东西.