前一段时间一直存在的问题,前几天才解决。MFC的程序在第一次相应菜单的时候屏幕会有闪烁问题。
当时就感觉比较怪,因为已经用了双缓冲,应该不存在这种问题。现在搞定了,感觉还是细节原理方面不是很了解。当然问题也有特殊性,就是菜单栏的事件响应是写在view里面的,但是只有第一次会有闪烁还是有些问题。
那么先要说一下MFC响应事件的过程:当点击一个菜单项的时候,最先接受到菜单项消息的是CMainFrame框架类,CMainFrame框架类将会把菜单项消息交给它的子窗口View类,由View类首先进行处理;如果View类检测到没对该菜单项消息做响应,则View类把菜单项消息交由文档类Doc类进行处理;如果Doc类检测到Doc类中也没对该菜单项消息做响应,则Doc类又把该菜单项消息交还给View类,由View类再交还给CMainFrame类处理。如果CMainFrame类查看到CMainFrame类中也没对该消息做响应,则最终交给App类进行处理。
看来问题是出现在活动view的选择上,因为一开始并没有指定活动的view,所以处理要有一个传递的过程,这导致了屏幕的刷新。这里我使用了暴力解决法,在mainframe加载的时候指定了activeview,那么就不会出现闪烁了。
另外在后来分屏CSplitterWnd的时候也出现了类似的问题,可以使用函数CSplitterWnd::SetActivePane()解决。