2010-03-27 95 views
2

我直接繪圖使用BitBltGetDC(IntPtr.Zero)屏幕時後自己清理。當我完成後,有沒有辦法在整個屏幕上調用Refresh或Invalidate,這樣我就不會在任何地方(數字地說)留下大量的繪畫?當你直接畫到屏幕上,就像我正在做的一樣,你繪製的任何東西都會保留在那裏,直到它下面的窗口重新繪製(這樣做,重新繪製它覆蓋的屏幕部分)。如何直接在屏幕上繪圖

問題是,Windows桌面的某些部分不會長時間重新繪製自己。例如,如果我繪製任務欄的頂部,實際任務會很快重新繪製自己(以及「開始」按鈕等),但任務欄本身會保留我繪製的內容,只需幾分鐘。

如果我的應用程序有一個覆蓋整個屏幕的窗口,我只需在該窗體上調用Invalidate(),這將導致它重新繪製自身,從而重新整個屏幕。我需要的是在整個屏幕本身上調用InvalidateRefresh的某種方式。

+0

你能更具體嗎?你在哪裏/在做什麼,以及你想要完全無效的領域? (即,你想要某些窗口重新繪製?如果是這樣,哪些窗口?等) – vladr 2010-03-29 18:01:08

+0

你可能想要做GetWindowDC(GetDesktopWindow())使你的代碼更明顯,並確保你的不受支持的使用魔術值不讓你的應用程序分解線。 – 2010-03-29 21:20:49

回答

3

InvalidateRect(NULL, NULL, TRUE)應該使無效和重繪所有窗口。雖然這將是昂貴的操作。

另一種方法是記住你所繪製,並試圖枚舉該矩形的任何窗口,只有它們無效。

您還可以嘗試在您想要使窗口無效時在您繪製的區域上創建透明窗口。請注意,您希望執行alpha混合分層窗口,而不是WS_TRANSPARENT窗口。如果您以99%的透明度進行操作,DWM應該在它被破壞後重新繪製它下面的所有窗口。當然,這可能會導致目標區域幾乎感覺不到閃爍,這是由於窗口在將其摧毀之前進行了alphablending。

+0

看起來像這樣會工作。沒關係,這很貴,因爲我只會打這一次。我正在做的是渲染一個全屏動畫,所以我只需要在動畫完成後重畫整個屏幕一次。 – MusiGenesis 2010-04-02 09:04:25

1

「屏幕」由一組窗口組成,該窗口以父窗口爲桌面窗口。我會想象你可以簡單地使桌面窗口無效,儘管你可能需要通過它的子窗口(頂層應用程序窗口)進行遞歸併使它們失效。 (也有可能是複式顯示器的問題,但是這應該給你一個起點)

GetDesktopWindow()

或者,創建一個覆蓋整個屏幕的表單,並使用透明繪圖。然後,當你完成後簡單地關閉它。

+0

他可能只需枚舉所有窗口並使其中每個窗口中的清理矩形無效。廣播'WM_PAINT'也在過去恢復,但它幾乎肯定是矯枉過正。 – vladr 2010-04-01 05:08:46