2012-12-25 90 views
1

我遇到問題。我在一個線程中創建了一個窗口。我創建了一個互斥體,這樣的窗口句柄不能通過函數檢索,直到它不爲0檢測窗口是否完成繪圖並顯示在屏幕上(WINAPI)

我還使用了while循環,以確保手柄不爲0

事情是,手柄從不0,因爲在窗口顯示在屏幕上之前,CreateWindowEx返回窗口句柄。

所以我的互斥和while循環失敗。我需要知道窗口什麼時候完全顯示並完成了它所做的任何事情,以便我可以從另一個線程中繪製它。

手柄不是0,DC不是0.但是當我畫畫時,它什麼都沒畫。如果我在做了CreateWindowEx和ShowWindow之後立即安裝了Sleep(100),就會顯示窗口並正確地繪製圖像。我也嘗試循環IsWindowVisisble(WindowHandle)。這也失敗了。

我不想睡覺(100),我該怎麼辦?

+0

Ehm,只是處理'WM_SHOWWINDOW'? – demorge

+0

你是什麼意思「句柄」WM_SHOWWINDOW? – Brandon

+0

如果你可以從窗口過程中完成它,我相信它是'WM_SETWINDOWPOS'它一旦完成初始化就會收到它。 Raymod Chen談過一次,我想這就是結果。 – chris

回答

7

不要試圖從另一個線程繪製窗口。

發送一些數據到窗口,讓它根據這些數據繪製自己。它無論如何都需要準備好響應WM_PAINT,並且無論如何都需要任何必要的數據。跳過箍環來做不同的初始繪圖將會增加大量的工作,並且不會給你帶來任何回報。

+0

我不明白:S這個窗口是這樣創建的:http://pastebin.com/raw.php?i=bJh0Ceuf 然後我使用main中的另一個類來繪製它。我不想在窗口上畫按鈕或任何東西。我只想使用我製作的Pen類來繪製圓形和長方形到空白窗口,以查看它們的外觀。我不想編輯WM_PAINT。 – Brandon

+0

但是,正確的做法是將您的畫圖添加到WM_PAINT中發生的畫面 - 這就是它的工作原理,這就是系統中其他所有內容所期望的。不好的事情(往往很難追蹤,奇怪,並且對環境中的各種變化敏感 - 在不同類型的機器上運行代碼,並且行爲有所不同,更換顯卡,處理器等等,事情也會改變)。如果您需要花費很長時間繪製圖形,請將其繪製到屏幕外位圖,然後將位圖移動到屏幕上。 –

0

請注意,除非您對消息隊列執行任何操作,否則不會顯示任何內容(窗口不會顯示);即PeekMessage/GetMessageDispatchMessage。而且,正如其他人所說,如果您使用GDI繪圖,則必須在WM_PAINT中執行此操作。如果您想強制更新,請使用InvalidateRect。請記住,如果您嘗試使用其他線程創建的窗口,則會出現很多問題。

相關問題