Можно ли запустить код * после * обработки встроенного события wxWidgets? - PullRequest
1 голос
/ 22 июля 2011

Я подозреваю, что должен быть встроенный способ сделать это, но мой Google-фу подвел меня.

Я использую wxScrolledWindow, и я должен нарисовать unscrolled фоновая картинка за содержимым при каждой прокрутке окна.Я сделал обработчик прокрутки вот так ...

void homewindow_t::onScroll(wxScrollEvent &evt) {
    Refresh();
    evt.Skip();
}

..., который заставляет его каждый раз перерисовывать все окно.К сожалению, он рисует окно до обработки прокрутки, поэтому фон перекрашивается, а затем прокручивается вверх или вниз, оборачивая выравнивание.Документация предполагает, что Refresh просто делает недействительным экран, а это означает, что обработчик прокрутки должен форсировать перерисовку.

Единственный способ обойти это, что я вижу, - это обрабатывать код прокрутки самостоятельно, что я былучше не делать, если мне не нужно.

Идеи, предложения, подсказки ...?

Ответы [ 2 ]

2 голосов
/ 22 июля 2011

Единственное общее решение, которое я нашел для запуска кода после обработки события, - это отправить второе, другое событие в очередь событий, прежде чем пропустить текущее событие (так, чтобы оно обрабатывалось обработчиком по умолчанию), и обработать что, когда это подходит.

Однако, просматривая исходный код wxWidgets, я нашел ответ на мою конкретную проблему: есть функция, wxScrolledWindow::EnableScrolling. Хотя это не очевидно из названия, это включит или отключит «физическую прокрутку», которая и вызывает мгновенную перерисовку. Поэтому вызов EnableScrolling(false, false); в конструкторе окна полностью решает проблему.

1 голос
/ 28 февраля 2013

Чтобы нарисовать «фиксированный» фон в wxScrolledWindow, вам просто нужно сместить источник постоянного тока, чтобы компенсировать прокрутку перед его рисованием (и затем сбросить обратно, конечно), на самом деле вообще не нужно иметь дело с событиями .

Однако, если вам действительно нужно определить «обработчик сообщений», то есть способ сделать это, см. это сообщение в блоге . Хотя API, описанный в нем, будет доступен только в wx 2.9.5, вы делаете то же самое в предыдущих версиях wx вручную, используя wxEVT_IDLE.

...