Добрый день!
Такой вопрос. В процессе, когда мы меняем размеры окна, мы с помощью EVT_SIZE и wxSizeEvent можем получать событие об этом и перерисовывать окно. Мне же нужно перерисовать окно только после того, как размеры будут изменены. Можно как-нибудь узнать об окончании изменения размеров окна?
Event Size Topic is solved
Re: Event Size
А почему не подходит перерисовка окна в обработчике EVT_PAINT?
Как я понимаю перерисовка происходит довольно медленно и при этом она зависит от размеров окна, иначе проблемы по идее не должно быть.integer wrote:Она там и происходит. Может я не так пояснил. Мне на время, пока мы растягиваем окно, нужно прекратить отрисовку, а потом возобновить.
Под Windows есть событие EVT_MOUSE_CAPTURE_CHANGED, которое может подойти.
Можно подключить таймер и отслеживать все изменения состояния самостоятельно, но это достаточно громоздкий и нехороший способ реализации.
Отдельного события окончания растягивания окна я не припоминаю, а событие EVT_LEFT_UP не приходит в этом случае.
Реализация причаливания в wxAUI довольно сильно отличается от перемещения обычных окон. Существующие события похоже не подойдут для этого. Можно попытаться в отладке зайти в wxAUI и отыскать событие или виртуальную функцию за которую можно было бы зацепится.integer wrote: Еще похожий вопрос. Окна управляются auimanager'ом. Как отловить события, когда мы начинаем перемещать окно и когда заканчиваем (окно причаливает куда-нибудь)?
Вопрос успешно решен!
По поводу AUI:
Но все решается проще. Нашел на этом форуме похожую тему. Вот слова DavidHart:
"One alternative that you could try is to catch wxSizeEvents instead. In the handler, set a class member bool, and Connect() wxIdleEvents to a handler.
In the IdleEvent handler, check the button state using wxGetMouseState(). If it's up, do whatever you wanted to do (are you sure the sizer system couldn't cope anyway) then Disconnect() and reset the bool."
То есть,
По поводу AUI:
Code: Select all
class myAuiFloatingFrame :
public wxAuiFloatingFrame
{
//...
protected:
virtual void OnMoveStart();
virtual void OnMoveFinished();
}
class myAuiManager :
public wxAuiManager
{
public:
virtual wxAuiFloatingFrame* CreateFloatingFrame(...); // создает myAuiFloatingFrame
}
"One alternative that you could try is to catch wxSizeEvents instead. In the handler, set a class member bool, and Connect() wxIdleEvents to a handler.
In the IdleEvent handler, check the button state using wxGetMouseState(). If it's up, do whatever you wanted to do (are you sure the sizer system couldn't cope anyway) then Disconnect() and reset the bool."
То есть,
Code: Select all
void myWindow::OnIdle(wxIdleEvent &event)
{
if (flag && !wxGetMouseState().LeftDown())
{ flag = false;
//...
Disconnect(wxEVT_IDLE, wxIdleEventHandler(myWindow::OnIdle));
}
}
void myWindow::OnSize(wxSizeEvent& event)
{
if (!flag)
{ flag = true;
//...
Connect(wxEVT_IDLE, wxIdleEventHandler(myWindow::OnIdle));
}
}
void myWindow::OnMove(wxMoveEvent &event)
{
if (!flag)
{ flag = true;
//...
Connect(wxEVT_IDLE, wxIdleEventHandler(myWindow::OnIdle));
}
}