2009-10-25 102 views
1

我正在尋找一些C++代碼來讓我快速移動窗口周圍的位圖,在移動時恢復背景。目前,我在應用程序初始化期間將窗口內容捕獲到位圖中,並在OnPaint()中繪製該位圖,然後繪製覆蓋位圖。我雙緩衝油漆。覆蓋的位圖位置隨着使窗口無效的鼠標移動。在C++中快速圍繞窗口​​移動位圖

這工作正常,除非它太慢,當背景窗口很大(認爲Windows桌面)和PC是慢的。我的猜測是,每次鼠標移動時重繪大背景位圖都是瓶頸。必須有更好更快的方式來做到這一點,但我的搜索沒有找到我需要的答案。

回答

1

也許你最快的方法是將你的可移動圖像存儲在一個位圖中,然後在內存中保留第二個相同大小的臨時位圖。要在主圖像上繪製可移動位圖,首先使用BitBlt API函數將要繪製可移動位圖的區域複製到臨時位圖中,然後將可移動位圖BitBlt複製到主圖像上。當你移動可移動位圖時,你將1)BitBlt臨時位圖到其原始位置,然後2)BitBlt新位置到臨時位圖,然後3)BitBlt移動圖像到主位圖中的新位置。

+0

是的,我正在考慮這些方面,但我曾嘗試過這樣的事情,結果沒有我希望的那麼快。所以我想知道是否有更好的方法。 我正在使用GDI +,我認爲從我的閱讀中回落到GDI可能會更好,因爲視頻硬件加速不支持GDI +。 – nevf 2009-10-25 22:37:43

+0

BitBlt應該幾乎是瞬間的,所以我不確定爲什麼這不適合你。 – MusiGenesis 2009-10-25 22:40:18

1

您應該看看Image Lists其中dragging效果

Win32 API包括 在屏幕上拖動圖像的功能。拖動功能可平滑移動圖像 ,以彩色方式移動光標並且不會有任何 閃爍。兩者都被屏蔽了 和未被屏蔽的圖像可以被拖動。

當然,用戶實際上並不需要拖動圖像。 通過改變圖像位置來做到這一點。

+0

被移動的圖像可調整大小(即用戶可以改變其大小),所以我不認爲ImageList是一個好的解決方案。 – nevf 2009-10-25 22:33:47

+0

您可以嘗試分層的窗口,http://msdn.microsoft.com/en-us/library/ms997507.aspx(我沒有嘗試,所以我不知道你是否可以調整它們的大小) – 2009-10-25 22:43:37

+0

我曾嘗試過分層窗口,但沒有做我所需要的。 – nevf 2009-10-25 23:39:15