MATLAB6.x & VC6.0: 将plot图片显示在MFC程序的窗口中--From energy's homepage

   2023-02-08 学习力0
核心提示:MATLAB6.xVC6.0: 将plot图片显示在MFC程序的窗口中 实验环境: Pwin2K SP3, MATLAB6.5, Visual C++ 6.0 SP? 1 问题的提出 通过调用mcc,可以将MATLAB程序编译为C/C++或库文件,并嵌入到自己的VC应用程序中。该方法不仅适于纯粹的运算代码,也适于图形函数,比
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。顾名思义,我想怎么做,你已经猜出八九分了吧MATLAB6.x & VC6.0: 将plot图片显示在MFC程序的窗口中--From energy's homepage


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
这个程序是以《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,应该先用figure命令显示一个隐含的窗口,绘图完毕、并挪动到VC窗口内部后在显示出来,例如
 >> figure('Visible','off')
 >> plot([1:100])
 >> figure(1)

■ 为了去掉plot的菜单和按钮,在相应的MATLAB程序中应该先执行:set(gcf, 'MenuBar','none');

■ 如果显示的图片比较多,就不能用"Figure No. 1"唯一确定各个窗口了,应该是2或者3等等。这需要你用MATLAB代码和VC代码巧妙地编程加以控制

■ 用Win32API还可以将窗口的名字和图标改掉,彻底去除MATLAB的痕迹MATLAB6.x & VC6.0: 将plot图片显示在MFC程序的窗口中--From energy's homepage




5 声明

程序本身并不完善,如果遇到问题,请尽量自己解决MATLAB6.x & VC6.0: 将plot图片显示在MFC程序的窗口中--From energy's homepage




energy
2002.12.3
 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 如何在Abaqus的python中调用Matlab程序
    目录1. 确定版本信息2. 备份python3. 设置环境变量4. 安装程序5. 调试运行参考资料Abaqus2018操作系统Win10 64位Python版本2.7(路径C:\SIMULIA\CAE\2018\win_b64\tools\SMApy\python2.7)2. 备份python将上述的“python2.7”文件夹复制出来,避免因操作错误
    03-16
  • 如何将极坐标数据转换为笛卡尔坐标系并绘制[MATLAB]
    如何将极坐标数据转换为笛卡尔坐标系并绘制[MAT
    你想做的事考虑根据与原点的距离 $r$ 和 $xy$ 平面上的角度 $heta$ 绘制数据 $P(r, heta)$。例如,雷达获取的信号包含有关目标范围 $r$ 和方位角 $heta$ 的信息。就是下图。在本文中,$heta$ 是从 $x$ 轴测量的角度。显示示例考虑创建依赖于 $r, heta$ 的虚拟
    03-16
  • 【MATLAB与机械设计】一维优化进退法确定初始区间
    【MATLAB与机械设计】一维优化进退法确定初始区
    在讨论一维搜索时,首先保证搜索区间函数具有单峰性,也就是在区间[a,b]中函数是凸函数,对于求极小值问题,函数值具有高—低—高的特性,在区间[a,b]上有唯一的最小值。1,方法的建立2.进退法确定搜索区间的程序框图3,根据上述的程序框图,编写的MATLAB程序
    03-08
  • 用于微型四轮驱动的 6T 小齿轮原型和使用 MATLAB 的 FEM 结构分析
    用于微型四轮驱动的 6T 小齿轮原型和使用 MATLA
    介绍我使用迷你 4WD 套件使用 Raspberry Pi 制作机器人汽车。定制零件丰富且方便,因为它们在附近的商店很容易买到。但是,由于Mini 4WD的速度非常快,因此在低速时很难控制速度。因此,我使用 3D 打印机制作了自己的 6T 小齿轮,并尝试改变齿轮比。 成型小齿
    03-08
  • ROS与Matlab系列:一个简单的运动控制 基于matl
    转自:http://blog.exbot.net/archives/2594Matlab拥有强大的数据处理、可视化绘图能力以及众多成熟的算法函数,非常适合算法开发;在控制系统设计中,Simulink也是普遍使用的设计和仿真工具。而ROS系统,则是一种新的标准化机器人系统软件框架。通过ROS,你
    02-10
  • matlab 遍历结构体struc的成员
    MATLAB中专门用于对结构数组的操作的函数并不多,通过 help datatypes获取数据类型列表,可以看到其中的结构数据类型的有关的函数,主要如表4.3.1所示。表4.3.1 结构数组的操作函数函数名             功能描述 deal                 把输入处
    02-09
  • 02-09
  • schroeder reverb matlab实现
    schroeder reverb matlab实现
    原理参考:Natural sounding artificial reverberation combFilter.m:function output = combFilter(delay, gain, input)fs = 48000;delaySample = int32(delayTime * fs / 1000);B = [1 zeros(1, delaySample - 1)];A=[1 zeros(1, delaySample - 2) -gain];
    02-09
  • C/C++中调用matlab引擎计算 matlab转c
    原帖地址:http://blog.sina.com.cn/s/blog_6adcb3530101cvot.html一,在linux环境使用matlab引擎必须先进行一些必要的配置1,matlab引擎依赖/bin/csh启动,所以不管你使用何种shell,都必须安装csh。**2,matlab引擎依赖的动态库文件目录必须在系统当前的
    02-09
  • MATLAB 图像放大/缩小,双线性插值
    MATLAB 图像放大/缩小,双线性插值
    半年前写过matlab最邻近插值的图像缩放,没怎么考虑边界问题。更早之前用Opencv写过双线性插值图像放大,不过写的比较混乱。所以这里用matlab重新再清楚的写一遍。 1 close all; 2 clear all; 3 clc; 45 m=1.8;%放大或缩小的高度 6 n=2.3;%放大或缩小的宽度 7
    02-09
点击排行