Здравствуйте!
Я пытаюсь в своем приложении использовать компонент 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 );
Неужто все вручную придется расставлять?
wxGradientButton & EVT_SIZE & Sizers Topic is solved
wxGradientButton & EVT_SIZE & Sizers
WBR, Blind_Cat.
Единственные изменения в оригинальном коде примера работы это:
Объявление в с реализацией wxTestMainFrame.h в
и в начале wxTestMainFrame.h добавил обработку данного события
ЗЫ Если OnResize изменить на
То выводит корректно, только не могу понять почему.
ЗЗЫ wxWidgets-2.8.10, C::B 8.02, MinGW 3.4.5, WinXP
Объявление в с реализацией wxTestMainFrame.h в
Code: Select all
public:
void OnResize(wxSizeEvent& event) { Refresh(); }
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()
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 166 times
WBR, Blind_Cat.
Ок. Спасибо. Таким образом это не в компоненте дело, а в понимании обработки событий в wxWidgets.
Прочел доку на wxEvent.Skip() внимательнее.
Достаточно неочевидная фишка.
Таким образом получается, что везде где есть обработка EVT_SIZE, и если у этого компонента есть родной обработчик, то необходимо вызывать Skip пришедшего события, для прокидывания сообщения родному обработчику.
Интересно, а придет ли к родному обработчику событие скипнутым или этот флаг имеет отношение только к перебору обработчиков в очереди сообщений?! Скорее второе. Или и первое и второе. При случае нужно будет глянуть. Или ты знаешь что будет после Skip()?
Прочел доку на wxEvent.Skip() внимательнее.
Достаточно неочевидная фишка.
Таким образом получается, что везде где есть обработка EVT_SIZE, и если у этого компонента есть родной обработчик, то необходимо вызывать Skip пришедшего события, для прокидывания сообщения родному обработчику.
Интересно, а придет ли к родному обработчику событие скипнутым или этот флаг имеет отношение только к перебору обработчиков в очереди сообщений?! Скорее второе. Или и первое и второе. При случае нужно будет глянуть. Или ты знаешь что будет после Skip()?
WBR, Blind_Cat.