openGL+MFC导致闪烁、不刷新等问题的解决方法
来源:互联网 发布:原创ai算法 编辑:程序博客网 时间:2024/05/21 14:10
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
return TRUE;
//return CView::On
}
上文相当详细的解释了MFC中使用OpenGL的基本的流程。并给出了实现无闪烁的步骤。
现在给出第一个问题:如果你在MFC生成向导中选择了“拆分窗口”,你会发现即使重载了OnEraseBkgnd,也无法解决闪烁问题!
笔者经过排查,发现问题出现在CMainFrame中MFC帮你生成的如下代码:
也就是说MFC为实现拆分窗口帮你重载了OnCreateClient函数。我们知道MainFrm继承自CFrameWnd。我们看一下CFrameWnd的OnCreateClient做了什么:这里就创建了我们初始化OpenGL的视图类CxxxView了。
但是,如果使用了拆分,MFC会自动添加一个类型为CSplitterWnd的对象m_wndSplitter,而你的CxxxView类则仅仅是CSplitterWnd内部的视图罢了。
在改变窗口大小时,CSplitterWnd首先响应ON_WM_SIZE,然后在其响应函数中让CxxxView进一步处理。
CSplitterWnd的窗口大小要略大于其内部的CxxxView。因此CSplitterWnd自身的刷新会影响CxxxView的刷新而而导致闪烁。
那么解决方法,要么不使用拆分,这个绝对没有问题。
如果必须要拆分窗口,那么可能需要派生自己的CSplitterWnd类,修改其行为.
下一个问题,你可能遇到窗口不刷新,只有改变窗口大小的情况才刷新。
这是因为你的CxxxView只重载了OnDraw的原因。OnDraw是如何被调用的?
参见*\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc\viewcore.cpp
响应ON_WM_PAINT消息的是CView,他调用了你重载的OnDraw。正因为这里的CPaintDC dc(this);导致了窗口不能持续刷新。
要知道更详细的原因,请参见http://peipengshuai.blog.163.com/blog/static/1901226620123169431072/
你只需要知道,CPaintDC会从刷新消息队列中移除ON_WM_PAINT即可。移除后,如果窗口没有发生改变,就不会自动刷新。
因此,你需要做的很简单。自己响应你的CxxxView类的ON_WM_PAINT,并不要在里面使用CPaintDC dc(this);(注释掉)即可。
再下一个问题:最大化窗口后,窗口某些区域(如工具栏)无法刷新,留下空白。
这个问题尚未得到完美解决方案。参考http://topic.csdn.net/t/20020220/16/534304.html,一说是驱动问题。暂时无法验证。
如果有解决方案,希望读者留言告之。
- OpenGL+MFC导致闪烁、不刷新等问题的解决方法
- openGL+MFC导致闪烁、不刷新等问题的解决方法
- winform频繁刷新导致界面闪烁解决方法
- 解决OpenGL在MFC下的闪烁问题
- OpenGL绘制纹理,缩放相机导致纹理闪烁的解决方法gluPerspective ()
- C#Winform频繁刷新导致界面闪烁解决方法
- 局部刷新闪烁的问题
- 刷新ListView刷新时的闪烁问题
- MFC应用程序闪烁的问题
- 解决ListView下拉刷新时导致图片闪烁问题
- ajax异步问题导致的刷新页面数据不更新
- MFC DLL PreTranslateMessage 导致的快捷键不响应的问题?
- C++ vector变量等导致内存泄露问题的解决方法
- 消除图层刷新而导致的严重闪烁-1
- 消除图层刷新而导致的严重闪烁-2
- ogre mfc刷新时闪烁
- ListBox刷新闪烁问题
- 窗口刷新闪烁问题
- 网上商城项目实战之使用nexus搭建maven私有服务器
- Toad的快捷键
- Linux指令_xargs
- Unix学习笔记-----Unix编程练习实例-----lstat()&& stat 结构体详解
- Objective-c中Category解析
- openGL+MFC导致闪烁、不刷新等问题的解决方法
- android progressBar自下而上加载
- UI设计中我们需要了解的知识
- 一个Android开发菜鸟的自剖
- Unity5的AssetBundle的一点使用心得
- 6-2 多态性与虚函数
- Java到底是传引用还是传值?
- 再详细的介绍一下Unity5的AssetBundle
- PTAM图像接口需要灰度图像