MFC窗体“抽筋”

      碰到的这个问题不知道用怎样的词去表达。能反映在屏幕上的就是MFC的窗体不能正常的进入,双击图标后,窗体死在那边,进而程序挂掉。在挂掉之前,窗体是不停的闪烁,就像抽筋一样。

产生问题的背景和条件:

1:用的SDI做框架

2:在CMainFrame中将Frame切割成三部分,是三部分。每部分对应一个View

3:用GDI重新画了整个窗体的边框,包括标题栏,MenuToolbar(不是不想用皮肤控件,没办法……)

 

产生问题的时间:

1:美工进入后,给做的工具栏图标,这样需要调整默认工具栏大小。

2:在写代码的机器上没有任何问题,测试跑的笔记本上也没有问题,在别人的机器上就开始抽筋。

 

问题解决:

1:开始认为是自画的TitleMenuToolbar有问题,全部弄成MFC自己的东西,不能解决,还是抽筋。

2:踢掉很多代码,发现,在CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中,如果把有个风格的设置去掉,在很多的机器上能用,但是还有机器不行。

3:仔细观察抽筋的窗体,Toolbar不显示。把ToolbarCreateEx()去掉,不抽了。或者把StatusBar去,掉也不抽。

4:开始考虑屏幕大小和Toolbar大小的问题。

5:经过测试:

A:当屏幕分辨率的Y值为768的时候,ToolbarHeight [44,55]的时候,窗体抽筋。

B:当屏幕分辨率的Y值为800的时候,ToolbarHeight [49,60]的时候,窗体抽筋。

C:当屏幕分辨率的Y值为1050的时候,ToolbarHeight [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:遗留系统总会给我们意想不到的惊喜。

     2MFC太诱惑。

     3:任何东西初始化都是必要的,但不要过于猛烈的初始化。(下面的OnSize函数是可以调整View的大小的)

     4:与Bug作斗争其乐无穷。

 

     我们的生活需要力量。

posted @ 2009-02-15 11:09  onthebox  阅读(1407)  评论(0编辑  收藏  举报