簡體   English   中英

我可以在處理完內置 wxWidgets 事件后運行代碼嗎?

[英]Can I run code *after* a built-in wxWidgets event is handled?

我懷疑必須有一種內置的方法來做到這一點,但我的 Google-fu 讓我失望了。

我正在使用wxScrolledWindow ,每次滾動window時,我都必須在內容后面繪制未滾動的背景圖片。 我做了一個這樣的滾動處理程序......

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

...這會迫使它每次都重新繪制整個 window。 不幸的是,它在處理滾動之前繪制了 window,因此重新繪制了背景,然后向上或向下滾動,搞砸了 alignment。 文檔建議Refresh只是使屏幕無效,這意味着滾動處理程序必須強制重繪。

我能看到的唯一解決方法是自己處理滾動代碼,如果我不需要,我寧願不這樣做。

想法、建議、線索……?

我發現在處理事件后運行代碼的唯一通用解決方案是在跳過當前事件之前將第二個不同的事件發布到事件隊列(以便它由默認處理程序處理),並在它發生時處理它過來。

但是,仔細閱讀 wxWidgets 源代碼,我找到了我的具體問題的答案:有一個 function, wxScrolledWindow::EnableScrolling 雖然從名稱上看並不明顯,但這將啟用或禁用“物理滾動”,這是強制即時重繪的原因。 所以調用EnableScrolling(false, false); 在窗口的構造函數中完全解決了這個問題。

要在wxScrolledWindow中繪制“固定”背景,您應該在繪制之前偏移 DC 原點以補償滾動(當然,然后將其重置回來),實際上根本不需要處理事件。

但是,如果您確實需要定義“發布處理程序”,那么有一種方法可以做到,請參閱此博客文章 雖然其中描述的 API 僅在 wx 2.9.5 中可用,但您在以前的 wx 版本中手動使用wxEVT_IDLE執行相同的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM