摘要:3Matlab图像嵌入VC界面[3]3.1基于CWnd类的图像嵌入在Windows操作系统下,所有应用程序的窗口都是基于MFC中的CWnd类。所以可以通过调用该类或其派生类中的方法实现图像嵌入。基本思想:在Matlab平台下用COM封装产生图形窗口的程序;在VC平台获取Figure窗口的句柄,将Figure窗口设为VC程序的子窗口;(3)将Figure窗口移动到指定显示
3 Matlab图像嵌入VC界面[3]
3.1 基于CWnd类的图像嵌入
在Windows操作系统下,所有应用程序的窗口都是基于MFC中的CWnd类。所以可以通过调用该类或其派生类中的方法实现图像嵌入。基本思想:在Matlab平台下用COM封装产生图形窗口的程序;在VC平台获取Figure窗口的句柄,将Figure窗口设为VC程序的子窗口;(3)将Figure窗口移动到指定显示位置。
程序实现如下:
(1)将原pcamat.m进行修改,添加生成图像的相关代码
function [eigenvector,eigenvalue] = pcamat(oriData,row,column,picName)
//增加picName参数,VC平台下hFig将通过该名称获取生成图像的句柄
figure(‘NumberTitle','Off','MenuBar','None','ToolBar','Figure','Name',picName,'Units','Points’);
//图像参数预设,保留工具栏。使用Matlab提供的工具栏的所有功能是使用该方法的最大优点
percent = 100*eigenvalue /sum(eigenvalue);
//计算贡献率
pareto(percent); //画图
xlabel(‘主成分’);
ylabel(‘方差占的比重(%)’);
(2)封装打包成名为figure的COM组件,并完成注册等相关操作。因为修改后的m文件运行结果包含输出结果和图像两部分,所以下面有关图像处理的代码依然在PCATest控件的响应函数中。
CString WNDName = “Demo”; //自定义窗口名称
Ifigureclass *pic;
VARIANT oriData, row, col, picName,eigVector, eigValue; VariantInit(&picName);
……
picName.vt = VT_BSTR; //将自定义窗口名称赋予
Matlab生成图像
picName.bstrVal = WNDName.AllocSysString();
HWND hFig; int timer = 50;
//用死循环确保可以获取到图像句柄,注意此处必须使用sleep(),给予系统足够的响应时间
while(1){
pic->pcamat(2,&eigVector,&eigValue,oriData,row,col,
picName);
Sleep(timer);
hFig = ::FindWindow(NULL,FigName);
if(hFig != NULL){
break;
}
timer += 10;
pic->Release();
}
long lStyle = ::GetWindowLong(hFig,GWL_STYLE); //设置Figure窗口样式。[1] [2] [3] [4] [5]