- 积分
- 149
- 注册时间
- 2003-5-22
- 仿真币
-
- 最后登录
- 1970-1-1
|
最近在论坛上看到了下面的帖子讨论如何在MATLAB的GUI程序中给Edit实现KeyPressFnc函数,以实现每次按下键盘都能处理的效果。看起来似乎是个简单的问题,没想到试过后才发现它其实并不容易实现。由于自己已好久没有动过GUI的开发,想借机练习一下;再加上对这个问题很感兴趣,于是认真琢磨了一下,最终形成了一个思路,并产生了一个有意思的m函数,个人觉得可能对大家有用,所以开了这个新贴,和大家分享。
http://www.simwe.com/forum/thread-756702-1-2.html
(题外话:从做这个练习的过程中再次的感觉到MATLAB对GUI的支持仍然有很大的局限,象这个问题,在其他的编程语言比如Visual C++中可以很容易地搞定的,在MATLAB中却要费九牛二虎之力。)
这里还是以上贴中的例子程序myGUI02为例,程序很简单,界面上有一个Edit Box,以及几个Static Text,我们需要实现这样的功能:当用户在Edit Box中输入一个字符时,程序实时地捕捉用户输入,把有关信息显示在那些Static Text。
myGUI02的设计思路是利用那个Edit Box的KeyPressFcn特性(这个可能是最近几版matlab的新特性,以前只有Figure才有KeyPressFcn特性),所有的功能都在这个函数中实现,而Edit Box的CallBack是空的。遇到的问题是所实现的功能时灵时不灵。问题的根源是在执行EditBox的CallBack之前,get(hEdit, 'String')不能给出当前正确的内容。
于是有了一个思路:仍然使用KeyPressFcn特性,但在这个函数中我们把界面的输入焦点从该Edit Box移到另外任何一个控件上,其结果将导致MATLAB调用该Edit Box的CallBack,然后在CallBack里实现所需的功能。移动输入焦点其实很容易,用uicontrol函数就能轻松实现。但在这个例子中有一个很烦人问题,那就是当把输入焦点重新移回该Edit Box后,其中的字符串就会被高亮显示,好像被选中一样。
这时用鼠标点击该Edit Box就会使那个字符串正常显示。但是能不能在程序中自动实现呢?经过一番搜索后发现,有可能利用Java技术实现。于是现学现用,摸索一阵后,编写了一个m函数叫做mysetfocus,它利用Java技术实现模拟鼠标点击动作,以达到重新设置输入焦点的功能。主要思路来自MATLAB的File Exchange服务器上的函数setfocus,它用了一个MEX文件来实现模拟鼠标点击;又没有给出MEX文件的源码,所以无法使用于其他平台,而且经测试也无法使用于MATLAB R2006B。
mysetfocus的好处是利用Java技术,由于MATLAB很好地支持Java,所以mysetfocus的可移植性高。源码在附件中。同时也附上修改过的myGUI02(不包含mysetfocus)来演示mysetfocus的用法。欢迎大家讨论。
Have fun!
[ 本帖最后由 taohe 于 2006-12-21 18:10 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
评分
-
1
查看全部评分
-
|