Matlab 版 (精华区)
发信人: zjliu (秋天的萝卜), 信区: Matlab
标 题: 将matlab的figure显示在MFC程序的窗口中
发信站: 哈工大紫丁香 (Thu May 13 11:10:38 2004), 转信
from energy的个人主页
MATLAB6.x & VC6.0: 将plot图片显示在MFC程序的窗口中
实验环境:
Pwin2K SP3, MATLAB6.5, Visual C++ 6.0 SP?
1 问题的提出
通过调用mcc,可以将MATLAB程序编译为C/C++或库文件,并嵌入到自己的VC应用程序中。
该方法不仅适于纯粹的运算代码,也适于图形函数,比如plot等等。不过遇到的问题是,
每次调用plot函数,将产生一个新的窗口,这使得我们的VC程序风格不能统一,看起来很
别扭。而且,这个跳出来的窗口特征太明显,让人一下子就认出来是MATLAB做的,这在有
些时候会让您的客户、老板、同事、同学、gg、mm觉得很不屑:偷懒呐!
那么为了让程序看上去更专业,能否将图片嵌入我们的VC窗口,或者对话框里面,而不让
它跳出来呢?
2 分析
实际上,在执行plot之后,执行以下命令:
set(gca)
你会发现有这样一个属性:Parent,它就是该窗口的父窗口,也就是在哪个父窗口中显示
。对它进行设置,可以形成复杂的GUI界面,我们看看MATLAB提供的demo就知道了。如果该
属性为空,这个plot窗口就会以独立窗口的形式显示出来。
因此,MATLAB的绘图功能本身是支持显示在某个特定父窗口中的。然而遗憾的是,Parent
属性不是用Win32的handle指定的,而是用MATLAB的字符串形式的ID。我们在VC中很难利用
此功能。
3 逆向思维
既然不能直接把图画在指定窗口中,那么画好后再挪到这个窗口可以吗?
思路就是这么简单,查一下Win32 API,可以找到两个函数:FindWindow和SetParent。顾
名思义,我想怎么做,你已经猜出八九分了吧:)
4 代码实现
核心代码如下:
m_hmat = ::FindWindow(NULL, "Figure No. 1");
::SetParent(m_hmat, m_hWnd);
首先找到窗口名为"Figure No. 1"的窗口的句柄,然后将它的父窗口设置为某个窗口就行
了。这段代码包含于个DOC/VIEW结构的MFC程序的View类中,m_hWnd就是该View的窗口句柄
。
5 应用实例
应用实例在这里下载:SglMFC.zip ( http://energy.51.net/matlab/SglMFC.zip )
这个程序是以《MATLAB扩展编程》第九章的例子SGLMFC为基础改制的,在SglMFCView.cpp
中加入了菜单项Embed及其回调函数OnSGLEmbed。至于如何对该工程进行编译,请参考该书
的相关内容。
6 其它细节
几点说明如下:
■ 该程序是个简单的示范程序,编程并不严密。内含debug版本的可执行程序,请严格按
照下面流程运行:
(1) SGL|Start
(2) SGL|Demo,这时显示出一个plot窗口
(3) SGL|Embed,plot窗口跑到View中
(4) 双击窗口栏,充满整个View
(5) 关闭该窗口
(6) SGL-Stop
(7) 退出程序
点击这里看演示结果。
■ 该方法仍然会先显示弹出式plot窗口,为了禁止在VC窗口之外显示plot,应该先用fig
ure命令显示一个隐含的窗口,绘图完毕、并挪动到VC窗口内部后在显示出来,例如
>> figure('Visible','off')
>> plot([1:100])
>> figure(1)
■ 为了去掉plot的菜单和按钮,在相应的MATLAB程序中应该先执行:set(gcf, 'MenuBar
','none');
■ 如果显示的图片比较多,就不能用"Figure No. 1"唯一确定各个窗口了,应该是2或者
3等等。这需要你用MATLAB代码和VC代码巧妙地编程加以控制
■ 用Win32API还可以将窗口的名字和图标改掉,彻底去除MATLAB的痕迹:)
5 声明
程序本身并不完善,如果遇到问题,请尽量自己解决:)
energy
2002.12.3
--
╔═══════════════════╗
║★★★★★友谊第一 比赛第二★★★★★║
╚═══════════════════╝
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.229.*]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.899毫秒