我有一個winforms應用程序和兩個控件,我在其中進行自定義繪圖。主控件顯示道路的長連續圖像的一小部分,而另一個控件顯示整個道路圖像的水平壓扁表示。第二個控件用於導航第一個控件:您可以單擊概覽中的任意位置以在主視圖中滾動到該位置。這裏的一個屏幕截圖,其中主視圖是在頂部和概述是對底部:爲什麼一個控件會比另一個更頻繁地重繪?
有在概覽控制指示在主視圖中被示出的圖像的位置處的青色線。 (在這個屏幕截圖中,它的寬度僅爲左側的1/3)。用戶可以在概覽中單擊並拖動該行,這將導致主視圖滾動。
我注意到了一些關於重繪的奇怪現象:當我在總覽控件中拖動青色線時,主視圖比概覽更頻繁地重繪,即使兩者都響應鼠標移動而失效。我知道WM_PAINT消息只在隊列中沒有其他消息時才被髮送,但我不明白爲什麼一個控件會比另一個更頻繁地重繪,如果它們同時失效。
其實,當我輸入最後一句話時,我想我偶然發現了原因。告訴我這聽起來是否正確:
每個控件都有自己的消息隊列,並且主控件沒有收到任何與輸入有關的消息,所以它的消息隊列比概覽中的消息隊列更爲頻繁,它必須處理所有的鼠標事件。所以它比概覽更頻繁地收到WM_PAINT消息。
所以在這一點上,我想問題是,「這有道理嗎?這是怎麼回事?」
在整體概覽中,「整個道路圖像的水平壓扁表示」是如何實現的?你在Paint()事件中進行計算,還是迭代一些數據並自定義繪製位置上的線條?我猜測繪製概覽需要比主視圖花費更長的時間。 –
@Idle_Mind,實際上我最近優化了概覽控件的繪製,以便它保持最後一個完整渲染的位圖,並且只是在blot時加上繪製青線。它只在場景實際發生變化時更新位圖,這在滾動期間很少見,而且絕對不會發生。但是,即使它的呈現時間比主視圖要花費更長的時間,但如果它們以相同的頻率發生,效果只會是普遍的遲緩,這不是我所看到的。主要控制是跟上鼠標事件,而概覽不是。 – adv12