вторник, 19 июня 2012 г.

Как скрыть wxMediaCtrl

Задача

Вчера постала передо мной интересная задача. Нужно было скрыть wxMediaCtrl, который занимается проигрыванием видео на форме. Вообще, поскольку в wxPython все, что рисуется, является окном (window), посмотрел в методы wxWindow.

В лоб

Ну, логично предположить, что для скрытия понадобится метод Hide(), но тут-то и обнаружились грабли. Hide() действительно прячет контрол, для чего он и предназначен, но, с другой стороны, ламает позиционирование во всех сайзерах, из-за чего у меня все другие контролы поплыли. Конечно, если сайзеры отсутствуют, и все позиционирование делается в абсолютных координатах - никаких проблем, Hide() подойдет, но в моем случае - нет.

Неожиданное решение

Переделывать все в корне не хотелось, хотя и форма у меня в принципе не ресайзится, поэтому методом научного тыка обнаружил, что проблему можно решить использованием метода Freeze(). Соответственно, обратный результат достигается методом Thaw().

Почему решение неожиданное? Потому что я никак не ожидал, что после вызова Freeze() контрол станет невидимым, собственно, если обратиться к реализации Freeze(), то можна обнаружить, что он предотвращает любые визуальные изменения объекта, невзирая на работу, которая над ним производится.

Freeze

Сам по себе метод Freeze() интересен тем, что позволяет оптимизировать работу окон на етапе визуализации. Например, перед вставкой большого количества элементов в комбо-бокс, стоит ему перед вставкой сделать Freeze(), а после, - Thaw(), таким образом, пока элементы вставляются, вызовы перерисовки производится не будут.

2 комментария:

В этом гаджете обнаружена ошибка