Event Size Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
integer
Earned a small fee
Earned a small fee
Posts: 11
Joined: Fri Dec 04, 2009 5:41 pm

Event Size

Post by integer »

Добрый день!
Такой вопрос. В процессе, когда мы меняем размеры окна, мы с помощью EVT_SIZE и wxSizeEvent можем получать событие об этом и перерисовывать окно. Мне же нужно перерисовать окно только после того, как размеры будут изменены. Можно как-нибудь узнать об окончании изменения размеров окна?
Kolya
Experienced Solver
Experienced Solver
Posts: 85
Joined: Mon Dec 11, 2006 11:35 am
Location: /dev/null

Re: Event Size

Post by Kolya »

А почему не подходит перерисовка окна в обработчике EVT_PAINT?
integer
Earned a small fee
Earned a small fee
Posts: 11
Joined: Fri Dec 04, 2009 5:41 pm

Post by integer »

Она там и происходит. Может я не так пояснил. Мне на время, пока мы растягиваем окно, нужно прекратить отрисовку, а потом возобновить.
Еще похожий вопрос. Окна управляются auimanager'ом. Как отловить события, когда мы начинаем перемещать окно и когда заканчиваем (окно причаливает куда-нибудь)?
Kolya
Experienced Solver
Experienced Solver
Posts: 85
Joined: Mon Dec 11, 2006 11:35 am
Location: /dev/null

Post by Kolya »

integer wrote:Она там и происходит. Может я не так пояснил. Мне на время, пока мы растягиваем окно, нужно прекратить отрисовку, а потом возобновить.
Как я понимаю перерисовка происходит довольно медленно и при этом она зависит от размеров окна, иначе проблемы по идее не должно быть.

Под Windows есть событие EVT_MOUSE_CAPTURE_CHANGED, которое может подойти.
Можно подключить таймер и отслеживать все изменения состояния самостоятельно, но это достаточно громоздкий и нехороший способ реализации.
Отдельного события окончания растягивания окна я не припоминаю, а событие EVT_LEFT_UP не приходит в этом случае.
integer wrote: Еще похожий вопрос. Окна управляются auimanager'ом. Как отловить события, когда мы начинаем перемещать окно и когда заканчиваем (окно причаливает куда-нибудь)?
Реализация причаливания в wxAUI довольно сильно отличается от перемещения обычных окон. Существующие события похоже не подойдут для этого. Можно попытаться в отладке зайти в wxAUI и отыскать событие или виртуальную функцию за которую можно было бы зацепится.
integer
Earned a small fee
Earned a small fee
Posts: 11
Joined: Fri Dec 04, 2009 5:41 pm

Post by integer »

Спасибо за помощь! EVT_MOUSE_CAPTURE_CHANGED действительно подходит. С aui буду разбираться.
integer
Earned a small fee
Earned a small fee
Posts: 11
Joined: Fri Dec 04, 2009 5:41 pm

Post by integer »

Вопрос успешно решен!
По поводу AUI:

Code: Select all

class myAuiFloatingFrame :
	public wxAuiFloatingFrame
{
//...
protected:
	virtual void OnMoveStart();
	virtual void OnMoveFinished();
}
class myAuiManager :
	public wxAuiManager
{
public:
	virtual wxAuiFloatingFrame* CreateFloatingFrame(...); // создает myAuiFloatingFrame
}
Но все решается проще. Нашел на этом форуме похожую тему. Вот слова 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."
То есть,

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));
	}
}
Post Reply