最近在写一个基于OpenGL的程序程序當中的一个模块需要在mfc基本对话框绘图步骤上面显示三维图形。因为程序的主框架程序用的是OpenGL来进行三维显示所以很直接的想到能不能夠在mfc基本对话框绘图步骤上面使用OpenGL显示。
我首先是按照OpenGL在MFC单文档程序当中的配置方式对mfc基本对话框绘图步骤进行了类似的配置最后得到嘚结果很不理想,无法实现功能
正所谓“他山之石,可以攻玉”遇到问题首先去查查资料,看看别人已经做过的工作是很有必要的艏先参考的是百度文库当中共享的一篇文章——《mfc基本对话框绘图步骤当中使用View类》(/view/bec5da50e27075.html)。程序编译、运行出结果之后貌似没有问题用鼠标一点击显示出来的窗口之后问题就来了:窗口相应鼠标点击的消息有误,并且MFC的框架程序当中的显示效果也别破坏了说明当中的显礻效果如下图:
而我时候这篇文章后得到的结果则很惨:
经过对错误的分析我认为问题出在程序的消息队列里面(有谁知道真相的麻烦告訴我,不甚感激)百度百科文档的例子是一个基于对mfc基本对话框绘图步骤的程序,直接在mfc基本对话框绘图步骤上面进行显示是没有问题嘚我做的程序里面用的的MFC的单文档程序,程序当中原本就有了一个View类现在有在程序当中人为的加入了一个View类,在消息相应的过程当中僦会因为纤细响应存在问题而使程序出错
经过不断地尝试,终于发现了解决问题之道——使用多线程就是将要显示的mfc基本对话框绘图步骤放到一个新建的线程当中去,程序在消息响应的过程中就不会因为消息相应的混乱而发生错误最后得到的结果如下图:
问题终于解決了。现将实现的大致过程列出来:
1 建立一个mfc基本对话框绘图步骤在mfc基本对话框绘图步骤上面放置一个Picture Control类型的控件(控件的大小范围即昰需要用于OpenGL显示的范围);
2 新建一个派生于CView类的类,在这个类当中配置好OpenGL的相关设置(用于三维显示的窗口);
3 新建一个派生于CWndThread类的类茬类中添加一个之前建立的mfc基本对话框绘图步骤类型的变量(进行操作的mfc基本对话框绘图步骤界面);
4 在主程序的View类的响应函数当中使用函数AfxBeginThread建立一个新的线程,使用PostThreadMessage函数向新建的线程发送消息传递相关的初始化信息;
5 在mfc基本对话框绘图步骤的OnInitDialog函数当中添加相关信息(具體内容参见其他网络资料)即可达到预期效果。