MFC窗体“抽筋”
??????碰到的這個(gè)問題不知道用怎樣的詞去表達(dá)。能反映在屏幕上的就是MFC的窗體不能正常的進(jìn)入,雙擊圖標(biāo)后,窗體死在那邊,進(jìn)而程序掛掉。在掛掉之前,窗體是不停的閃爍,就像抽筋一樣。
產(chǎn)生問題的背景和條件:
1:用的SDI做框架
2:在CMainFrame中將Frame切割成三部分,是三部分。每部分對應(yīng)一個(gè)View。
3:用GDI重新畫了整個(gè)窗體的邊框,包括標(biāo)題欄,Menu和Toolbar(不是不想用皮膚控件,沒辦法……)
?
產(chǎn)生問題的時(shí)間:
1:美工進(jìn)入后,給做的工具欄圖標(biāo),這樣需要調(diào)整默認(rèn)工具欄大小。
2:在寫代碼的機(jī)器上沒有任何問題,測試跑的筆記本上也沒有問題,在別人的機(jī)器上就開始抽筋。
?
問題解決:
1:開始認(rèn)為是自畫的Title,Menu和Toolbar有問題,全部弄成MFC自己的東西,不能解決,還是抽筋。
2:踢掉很多代碼,發(fā)現(xiàn),在CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中,如果把有個(gè)風(fēng)格的設(shè)置去掉,在很多的機(jī)器上能用,但是還有機(jī)器不行。
3:仔細(xì)觀察抽筋的窗體,Toolbar不顯示。把Toolbar的CreateEx()去掉,不抽了。或者把StatusBar去,掉也不抽。
4:開始考慮屏幕大小和Toolbar大小的問題。
5:經(jīng)過測試:
A:當(dāng)屏幕分辨率的Y值為768的時(shí)候,Toolbar的Height∈?[44,55]的時(shí)候,窗體抽筋。
B:當(dāng)屏幕分辨率的Y值為800的時(shí)候,Toolbar的Height∈?[49,60]的時(shí)候,窗體抽筋。
C:當(dāng)屏幕分辨率的Y值為1050的時(shí)候,Toolbar的Height∈?[86,97]的時(shí)候,窗體抽筋。
?????所以開始懷疑是微軟的bug。難道代碼要跟每個(gè)特定分辨率結(jié)合?還有為什么不能使用Height跨度是13?(在下面的最小的框架中也沒找到我們哪個(gè)地方有個(gè)13,這個(gè)值肯定不是我設(shè)定的)
另外,在PreCreateWindow中去掉那句話的實(shí)際作用是使整個(gè)Frame的大小變了幾個(gè)像素。
6:刪除98%代碼,只剩最簡單框架。挨個(gè)檢查代碼。
在CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext *pContext)中,對Frame切割了兩次:
?????? m_wndSplitter1.SetColumnInfo();?
????? m_wndSplitter2.SetRowInfo();
試著去掉這兩行,這樣做當(dāng)時(shí)只是簡單的認(rèn)為初始化的時(shí)候很必要設(shè)定每個(gè)View的大小,因?yàn)樵谙旅娴?/span>OnSize()函數(shù)中有設(shè)定視圖大小的。
?????去掉了,不管什么值都沒有問題。
?????試著去掉其中一行,也是沒有問題。
?
總結(jié):
?????1:遺留系統(tǒng)總會(huì)給我們意想不到的驚喜。
?????2:MFC太誘惑。
?????3:任何東西初始化都是必要的,但不要過于猛烈的初始化。(下面的OnSize函數(shù)是可以調(diào)整View的大小的)
?????4:與Bug作斗爭其樂無窮。
?
?????我們的生活需要力量。
轉(zhuǎn)載于:https://www.cnblogs.com/onthebox/archive/2009/02/15/1390854.html
總結(jié)
- 上一篇: 如何使用cmd查看本机IP地址
- 下一篇: HDU ACM 1728 逃离迷宫 (广