1. 程式人生 > >win32繪制自定義類窗口導致繪制11個窗口的解決辦法

win32繪制自定義類窗口導致繪制11個窗口的解決辦法

解決 另一個 這樣的 情況 即使 新的 自定義類 組合 聲明

上網查了一圈也沒有找到解決問題的辦法,一旦創建了一個窗口,並且在過程函數中繪制窗口,尤其是一些非子窗口的自定義類窗口,都會生成11個窗口(算上主窗口就是12個),但是使用系統通用控件就不會有這種情況的發生,且繪制的過程都寫在WM_CREATE裏面了,那麽可以間接證明,在程序被初始化知道主窗口被顯示之後,該進程一共發送了11條WM_CREATE消息。假設是這樣的話,那麽使用系統的控件怎麽就不會發生這種現象呢?按照這種思路,當主窗口被創建之前,會初始化自定義類,且該主窗口會對應唯一的一個過程函數,那麽在其過程函數內部創建一個與自己同類的窗口還是會發送相應的消息到過程函數,這樣就循環創建窗口了。假如這樣,但是為什麽會是11呢,而不是更多或更少呢?試下查查createwindowex需要的參數個數,正好是12個,算上本身的就是12個窗口,通過實驗,不論使用哪種組合,註冊類並使用該類創建窗口都會產生11個附屬窗口,且不論其參數如何。那麽註冊哪個類對其為何沒有影響,我覺得是這樣的,不管註冊時使用registerclass還是使用registerclassex,系統都會分配較大的那個的內存,這樣windows才能做到向下兼容,比如,原來使用registerclass在較早的版本使用該函數一切正常,但到了較新的系統依然使用該函數,系統就會為他分配新函數所需要的內存大小了,這樣即使原來的代碼不需要修改,原來的庫還是能適應新的系統及調用。

有趣的是,如果使用新的窗口樣式來創建附加窗口,新窗口會使用新樣式而不導致主窗口的樣式失效.


解決辦法:新的窗口必須使用另一個過程函數,即在類中聲明一個新的過程函數,至於在新窗口使用setclasslong或者setwindowlong我還沒有試過。。。

win32繪制自定義類窗口導致繪制11個窗口的解決辦法