最近在產(chǎn)品中遇到一個回退問題:產(chǎn)品的主窗口在點擊最大化按鈕后,無法最大化顯示,和整個屏幕殘留了一些gap意狠,并且只有的win7上發(fā)生。
1. 由于是從branch合并回到main之后的產(chǎn)生的問題疮胖,一開始希望通過changelist對比找到有問題的代碼环戈,但由于branch合并后有數(shù)十個源文件,難以找到可疑代碼而放棄這種方法澎灸;
2. 由于主窗口是MFC程序院塞,通過查詢MSDN知道窗口最大化時,窗口大小性昭,位置發(fā)生變化拦止,onsize,windowposchanged消息函數(shù)會被調(diào)用巩梢,并且MFC framework會發(fā)出MAXMIN消息函數(shù)去處理對應(yīng)屏幕的最大化面積的計算创泄;
因此,先使用spy確定了這些消息函數(shù)確實被調(diào)用括蝠,然后在對應(yīng)函數(shù)入口設(shè)置斷點調(diào)試鞠抑,發(fā)現(xiàn)在發(fā)送最大化時首先調(diào)用MAXMIN消息函數(shù),而后是windowposchanged忌警,onsize函數(shù)搁拙;
進(jìn)入MAXMIN時的屏幕最大化參數(shù)正確秒梳,但等到進(jìn)入隨后兩個函數(shù)時,最大化參數(shù)變小箕速,因此懷疑在MAXMIN有重算最大化面積的邏輯酪碘。
調(diào)試MAXMIN后發(fā)現(xiàn),該函數(shù)會針對無邊框類型的主窗口進(jìn)行最大化面積重算盐茎,但在檢查創(chuàng)建主窗口函數(shù)時兴垦,窗口風(fēng)格為有邊框,因此字柠,在此之前有邏輯除去了邊框風(fēng)格探越;
于是在代碼中搜索除去邊框風(fēng)格的代碼,最后發(fā)現(xiàn)在處理visualmanager的消息函數(shù)中會除去邊框風(fēng)格窑业,而在產(chǎn)品中我們繼承了MFC的visual manager? office2007做了自己的實現(xiàn)钦幔。在該函數(shù)中,有虛函數(shù)會檢查是否由windows或GPU去own窗口的渲染常柄,而該函數(shù)在office2007的visualmanager的實現(xiàn)中會調(diào)用API去檢查DWM(desktop window manager)是否被打開運行鲤氢。在win7中由于該函數(shù)始終返回false,導(dǎo)致虛函數(shù)的返回值false西潘,從而移除了邊框風(fēng)格卷玉,最終導(dǎo)致最大化面積的重算。
最終喷市,重現(xiàn)該虛函數(shù)即可修復(fù)問題揍庄。
但問題在于,1. 為何DWM的檢查總是false东抹,即使該服務(wù)已經(jīng)打開運行蚂子?2. 為何同樣使用office2007 visualmanager的visualstudiodemo沒有出現(xiàn)無法最大化的問題?