wxGradientButton & EVT_SIZE & Sizers Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
Blind_Cat
Earned a small fee
Earned a small fee
Posts: 15
Joined: Thu Sep 24, 2009 8:04 am

wxGradientButton & EVT_SIZE & Sizers

Post by Blind_Cat » Thu Oct 29, 2009 11:55 am

Здравствуйте!

Я пытаюсь в своем приложении использовать компонент wxGradientButton. http://wxwidgets.info/howto_draw_gradient_buttons/

Вроде бы все хорошо отрабатывает до тех пор пока я не вешаю на изменение размера окна (wxFrame) обновление этого окна. После обновления самого окна по событию EVT_SIZE все компоненты внутри него смещаются в позицию (0,0) с дефолтными размерами. Подскажите пожалуйста что я делаю не так?

Предполагаю, что я не до конца понимаю обработку события EVT_SIZE и работу сайзеров. Демонстрацию этого поведения можно получить добавив в демку wxGradientButton

В wxTestMainFrame.h:
void OnResize(wxSizeEvent& event) { Refresh(); }

И в реализацию, в таблицу событий:
EVT_SIZE( wxTestMainFrame::OnResize );

Неужто все вручную придется расставлять? :(
WBR, Blind_Cat.

User avatar
T-Rex
Moderator
Moderator
Posts: 1195
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex » Thu Oct 29, 2009 1:32 pm

Код создания формы и код обработчика EVT_SIZE давай.

Blind_Cat
Earned a small fee
Earned a small fee
Posts: 15
Joined: Thu Sep 24, 2009 8:04 am

Post by Blind_Cat » Thu Oct 29, 2009 3:00 pm

Единственные изменения в оригинальном коде примера работы это:
Объявление в с реализацией wxTestMainFrame.h в

Code: Select all

public:
void OnResize(wxSizeEvent& event) { Refresh(); }
и в начале wxTestMainFrame.h добавил обработку данного события

Code: Select all

BEGIN_EVENT_TABLE( wxTestMainFrame, wxFrame )

////@begin wxTestMainFrame event table entries
    EVT_MENU( wxID_EXIT, wxTestMainFrame::OnExitClick )

// Эта строка ниже добавлена мной
    EVT_SIZE( wxTestMainFrame::OnResize )


////@end wxTestMainFrame event table entries
END_EVENT_TABLE()
ЗЫ Если OnResize изменить на

Code: Select all

void OnResize(wxSizeEvent& event) { event.Skip(); Refresh(); }
То выводит корректно, только не могу понять почему. :(

ЗЗЫ wxWidgets-2.8.10, C::B 8.02, MinGW 3.4.5, WinXP
Attachments
wxGradientButton.zip
Измененные исходники
(3.22 KiB) Downloaded 114 times
WBR, Blind_Cat.

User avatar
T-Rex
Moderator
Moderator
Posts: 1195
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex » Thu Oct 29, 2009 4:33 pm

Потому что если убрать event.Skip() то не будет отрабатывать обработчик ресайза из родительского класса (тоесть из класса формы), в котором еще куча логики по коррекции лайаута.

Blind_Cat
Earned a small fee
Earned a small fee
Posts: 15
Joined: Thu Sep 24, 2009 8:04 am

Post by Blind_Cat » Fri Oct 30, 2009 7:32 am

Ок. Спасибо. Таким образом это не в компоненте дело, а в понимании обработки событий в wxWidgets.

Прочел доку на wxEvent.Skip() внимательнее. :)
Достаточно неочевидная фишка.

Таким образом получается, что везде где есть обработка EVT_SIZE, и если у этого компонента есть родной обработчик, то необходимо вызывать Skip пришедшего события, для прокидывания сообщения родному обработчику.

Интересно, а придет ли к родному обработчику событие скипнутым или этот флаг имеет отношение только к перебору обработчиков в очереди сообщений?! Скорее второе. Или и первое и второе. При случае нужно будет глянуть. Или ты знаешь что будет после Skip()? :)
WBR, Blind_Cat.

Post Reply