Skonfigurowałem prosty system wxAuiManager
zawierający osiem kontrolek tekstowych, każdy skonfigurowany jako panel, z wszystkimi ustawionymi wokół centralnej kontroli statycznej. Mam dwa z nich, które są przyciągane do górnego, lewego, prawego i dolnego panelu. Ta część działa dobrze.Jak odświeżyć panele wxAuiManager podczas aktualizowania ich właściwości wxxp?
Chciałbym teraz zmodyfikować właściwości każdego panelu, co, jak myślę, może zostać wykonane przez zresetowanie skojarzonego wxAuiPaneInfo
. Na przykład chciałbym dodać/usunąć ikony pinezek lub maksymalizacji. Mogę sprawić, żeby to działało samo w sobie, ale ponowne rysowanie zarządzanego okna po zresetowaniu tych właściwości okazuje się być pewnym wyzwaniem.
Oto kod używam obecnie:
// 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();
Jak widać, to, co obecnie zrobić, to odłączyć panel od kierownika, dodaj je ponownie, a następnie zmusić zarządcę do ponownego wszystko. To jest w porządku, z wyjątkiem tego, że często zmienia położenie okna w nowej pozycji. Nie "czuje się dobrze" - modyfikowanie tych właściwości musi być możliwe do osiągnięcia niezależnie od odłączenia szyby.
Zamiast tego myślałem, że warto byłoby próbuje ukryć i pokazać okienko, bezskutecznie:
// This does not work at all
$paneInfo->Hide();
$paneInfo->Show();
Również próbowałem użyciem ładowacza okienka, choć nie wiem co "ciąg perspektywy" jest - nie jest to właściwość kontrolna, o ile mogę powiedzieć.
// The string should be a "perspective string"
$this->getManagedWindow()->getAuiManager()->LoadPaneInfo('auiPane0', $paneInfo);
Podsumowując: Mam działające rozwiązanie, ale nie jest to idealne rozwiązanie, ponieważ powoduje ono ponowne otwarcie danego panelu. Przypuszczam, że mogłem opracować poprawne polecenie, aby ponownie umieścić go w tym samym miejscu, ale nadal wydaje mi się, że powinienem móc to zrobić w łatwiejszy sposób.
Wszelkie pomysły?
Update: Znalazłem się jak przechwytywać informacje szyby za pomocą perspektyw, które mogą być wykonane w następujący sposób:
$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;
}
Wszystko co trzeba zrobić to teraz, aby przechwycić zdarzenie szyba przenieść, a wtedy mogę użyć tych danych z LoadPaneInfo()
. Jest to nieco trudniejsze - wxPHP nie wydaje wystarczających stałych, aby na to pozwolić. Mam o tym asked a new question.
Będę nadal próbować nowych rzeczy.
Czy to działa? Mam coś z tego samego problemu w moim projekcie ... – Gal
@ Gal, nie próbowałem niczego nowego odkąd napisałem post. Raczej zabrakło pomysłów, więc toleruję to na razie i mam nadzieję, że ktoś to zauważy w przyszłości. Czy używasz wxPHP specjalnie, lub wxWidgets z innym powiązaniem języka? – halfer
Mam nadzieję, że ktoś to zauważy i będzie mógł pomóc. Używam wxWidgets z powiązaniem Python. – Gal