来源:http://www.simwe.com/cgi-bin/ut/topic_show.cgi?id=36244&h=1&bpg=2&age=-1
写在前面的话:
最近论坛上原创气氛比较高,大家都纷纷拿出自己的看家本领,或者如饥似渴地学习新东西以解决大家在实际使用matlab时遇到的一些棘手问题。我个人觉得这是一个以技术性讨论为主的论坛健康发展所应该看到的现象。这种现象对大家都是有益的,无论是发贴的,还是看贴的,都会获得一些收获。对于我来说,把自己的业余时间花在浏览这样的论坛以及参与其中的讨论,我不会后悔。网络上论坛不少,但是有特色的不多,而且注重技术讨论的论坛更少,希望大家继续保持这样的热情,希望simwe变得更好。
正文:
最近论坛的一个问题是如何去掉在MATLAB李编译生成的可知行文件在运行的时候所产生的那个黑色的窗口。这种现象主要是指在Windows平台。比如在附图中出现的左边那个黑色背景的窗口。在这个例子里,可知行文件名为:myapp01.exe,它是从MATLAB程序myapp01.m编译得到的。在MATLAB里,myapp01.m是一个简单的GUI程序,界面上有两个按钮和一个图形。
如何在MATLAB里编译这里不讨论,得到那个myapp01.exe以后,如果运行的话,就会出现如附图所示的黑色窗口。关于如何去掉那个黑色窗口,现在来说MathWorks公司还没有什么好的办法。民间流传着几种方法:比如,这里的SCIE同学提出的修改MATLAB在编译该可知行文件的过程中所产生的C/C++原文件的方式已达到去掉那个黑色窗口的方法。另外,在MathWorks的网站也有人提出用免费的工具NSIS来制作另外一个可执行文件,它可以启动我们的可执行文件比如myapp01.exe,但不会出现那个黑色的窗口。
其实,如果只是简单的取出那个黑色窗口可能并不是件好事,因为那个窗口有时也显示一些有用的信息,比如程序运行时产生的一些错误信息,或者程序也可以利用它来产生一些运行当中的信息(用disp()函数)。
我在这里提供另外一种方法,就是用事先写好的一个软件,来运行由MATLAB编译生成的可执行文件比如myapp01.exe。myapp01.exe在运行当中所产生的一些信息也可以在这个loader软件里被捕捉并显示。document.body.clientWidth-300) {this.height=(document.body.clientWidth-300)*this.height/this.width;this.width=document.body.clientWidth-300}" border=0>
所需文件在附件中,其中包括
1。WgLoader.exe ---- 启动程序,可运行于Windows NT/2000/XP,但可能无法运行在Windows 98/Me. 解压到任何路径都行
2. myapp01.zip ---- MATLAB所编译得到的可执行文件和必要的支持文件,解压到任何路径都行。 附件
WgLoader运行后的界面如下:图中有使用说明。document.body.clientWidth-300) {this.height=(document.body.clientWidth-300)*this.height/this.width;this.width=document.body.clientWidth-300}" border=0>
比如,我把myapp01.exe解压缩到c:/temp目录,那么WgLoader可以这样设定,document.body.clientWidth-300) {this.height=(document.body.clientWidth-300)*this.height/this.width;this.width=document.body.clientWidth-300}" border=0>
启动myapp01以后,可以点选“Start”按钮,结果可以得到一个简单的图形。document.body.clientWidth-300) {this.height=(document.body.clientWidth-300)*this.height/this.width;this.width=document.body.clientWidth-300}" border=0>
听cwit说过,MATLAB的legend函数在编译后会有问题,我以前没有注意到这个问题,所以在myapp01里专门加了一个legend调用,不过编译以后没有发现问题,而且编译后的legend的操作也正常,比如可以用鼠标拖拉到别的地方。document.body.clientWidth-300) {this.height=(document.body.clientWidth-300)*this.height/this.width;this.width=document.body.clientWidth-300}" border=0>