碰到的这个问题不知道用怎样的词去表达。能反映在屏幕上的就是MFC的窗体不能正常的进入,双击图标后,窗体死在那边,进而程序挂掉。在挂掉之前,窗体是不停的闪烁,就像抽筋一样。
产生问题的背景和条件:
1:用的SDI做框架
2:在CMainFrame中将Frame切割成三部分,是三部分。每部分对应一个View。
3:用GDI重新画了整个窗体的边框,包括标题栏,Menu和Toolbar(不是不想用皮肤控件,没办法……)
产生问题的时间:
1:美工进入后,给做的工具栏图标,这样需要调整默认工具栏大小。
2:在写代码的机器上没有任何问题,测试跑的笔记本上也没有问题,在别人的机器上就开始抽筋。
问题解决:
1:开始认为是自画的Title,Menu和Toolbar有问题,全部弄成MFC自己的东西,不能解决,还是抽筋。
2:踢掉很多代码,发现,在CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中,如果把有个风格的设置去掉,在很多的机器上能用,但是还有机器不行。
3:仔细观察抽筋的窗体,Toolbar不显示。把Toolbar的CreateEx()去掉,不抽了。或者把StatusBar去,掉也不抽。
4:开始考虑屏幕大小和Toolbar大小的问题。
5:经过测试:
A:当屏幕分辨率的Y值为768的时候,Toolbar的Height∈ [44,55]的时候,窗体抽筋。
B:当屏幕分辨率的Y值为800的时候,Toolbar的Height∈ [49,60]的时候,窗体抽筋。
C:当屏幕分辨率的Y值为1050的时候,Toolbar的Height∈ [86,97]的时候,窗体抽筋。
所以开始怀疑是微软的bug。难道代码要跟每个特定分辨率结合?还有为什么不能使用Height跨度是13?(在下面的最小的框架中也没找到我们哪个地方有个13,这个值肯定不是我设定的)
另外,在PreCreateWindow中去掉那句话的实际作用是使整个Frame的大小变了几个像素。
6:删除98%代码,只剩最简单框架。挨个检查代码。
在CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext *pContext)中,对Frame切割了两次:
m_wndSplitter1.SetColumnInfo();
m_wndSplitter2.SetRowInfo();
试着去掉这两行,这样做当时只是简单的认为初始化的时候很必要设定每个View的大小,因为在下面的OnSize()函数中有设定视图大小的。
去掉了,不管什么值都没有问题。
试着去掉其中一行,也是没有问题。
总结:
1:遗留系统总会给我们意想不到的惊喜。
2:MFC太诱惑。
3:任何东西初始化都是必要的,但不要过于猛烈的初始化。(下面的OnSize函数是可以调整View的大小的)
4:与Bug作斗争其乐无穷。
我们的生活需要力量。