- 积分
- 99
- 帖子
- 40
- 主题
- 4
- 精华
- 0
- 最后登录
- 2021-6-25
- 在线时间
- 21 小时
- 私信
|
发表时间 : 2012-9-9 18:26:05
|
浏览 : 4132 评论 : 4
本帖最后由 wwwronin 于 2012-9-9 06:28 PM 编辑
前段时间在网上苦寻怎样在MFC中嵌入GLSUDIO,苦无结果,于是自己开动脑筋,在MFC下用最笨的办法嵌入了GLSUDIO。不过貌似仅支持VC6.0,在.net及以上版本编译没错,但是运行出错,估计是堆栈分配的关系吧,我也查不出来。
具体方法其实很简单:
1、请保持GLStudio工程设置为standalone.
2、将Glstudio的工程(即用.gls)文件生成.cpp、.h等文件,将source文件夹里除winmain.cpp以外的文件拷贝出来,放入到mfc工程目录下。(请保证.cpp文件不超过10M,负责编译不过)
3、例如我的工程名为:EHSI,则将生成的EHSIAPP类加入MFC工程。
4、设置编译路径:Include:C:\Program Files (x86)\GL Studio 3.2\include,C:\Program Files (x86)\GL Studio 3.2\include\FL,C:\Program Files (x86)\GL Studio 3.2\plugins\include,
Lib:C:\Program Files (x86)\GL Studio 3.2\plugins\lib,
c盘是我的glstudio的安装路径,请根据你的安装路径进行修改。
5、屏蔽相关预编译项,如下所示:
//#ifdef _AFXDLL
#include "stdafx.h"
//#endif
6、将cpp文件中的main函数剪切,后面还有用。
7、编译时有很多警告,直接忽略即可。
8、将main函数的内容作为线程在VC中创建,示例线程入口函数代码如下:
UINT CEmbdDlg::ThreadEntryEhsi(LPVOID lPvoid)
{
CEmbdDlg* dlg = (CEmbdDlg*)AfxGetApp()->m_pMainWnd;
EHSIClass* eHSI;
glsCommandLine::Instance()->ReadCommandLine(1,NULL);
eHSI = new EHSIClass("EHSI",742,725);
eHSI->CreateObjects();
//////////////////// User Code from section: "Main Initialization" ////////////
///////////////////////////////////////////////////////////////////////////////
eHSI->SetRedraw();
// eADI->theWindow->hide();
Timer frameTimer;
do
{
//////////////////// User Code from section: "Main Loop" //////////////////////
if( dlg->m_size && dlg->m_cy != 0 && dlg->m_cx != 0)
{
//动态改变仪表窗口大小
eHSI->theWindow->resize(0,dlg->m_cy,dlg->m_cx,dlg->m_cy);
dlg->m_size = false;
}
eADI->fGlobVrtIns_MaxAirSpeed = g_dataSwap.maxAirSpeed;
eADI->fGlobVrtIns_AccelerationVertical = g_dataSwap.verticalAcceleration;
eADI->bGlobVrtIns_RADCWork = g_dataSwap.rightADCNormal;
eADI->fGlobVrtIns_LADCIAS = g_dataSwap.indiAirSpeedInLeftADC;
eADI->bGlobVrtIns_GSFail = g_dataSwap.gsFailed;
eADI->bGlobVrtIns_AttFail = g_dataSwap.attFailed;
eADI->fGlobVrtIns_GsDeg = g_dataSwap.gsDegree;
eADI->bGlobVrtIns_LocFail = g_dataSwap.locFailed;
eADI->fRollDeg = g_dataSwap.rollDeg;
eADI->pitchDeg = g_dataSwap.pitchDeg;
///////////////////////////////////////////////////////////////////////////////
eHSI->RecordCalculateStart();
eHSI->Calculate(frameTimer.ElapsedSecondsDouble());
eHSI->RecordCalculateEnd();
}
while(eHSI->FrameAnimate());
// Delete the instance
// delete eHSI;
return 1;
}
有兴趣的可以交流下,但是我更想将它生成activex插件,苦于木有工具啊。
我的邮箱:luozxl@126.com,QQ就不留了,呵呵
最后上个效果图,很粗糙,望见谅。
|
|
|