MATLAB GUI axes的ButtondownFCN无效的问题

来源:互联网 发布:varian软件 编辑:程序博客网 时间:2024/05/23 13:57

这两天写了一个matlab gui程序,程序中主要用到了两个axes,目的是通过在axes1中用鼠标选取一个点,而在axes2上显示该点对应的图像。本来想着应该是个很简单的程序,但是在编程的过程中,我却遇到了一个很严重的问题:在axes1上画点后,再利用function axes1_ButtonDownFcn(hObject,eventdata, handles)获取鼠标点中的位置时,ButtonDownFcn()函数却没反映,程序无法执行!就是这个问题,使得本来很简单的一个程序变得很费劲。上网搜了很多资料,发现大家也遇到了这样的问题,但是更多情况下,遇到这种问题的人基本是想获得axes上显示的image或者plot的句柄,进而能够正常使用ButtonDownFcn()函数,而没有说明如何解决获取axes的句柄的问题。下面是我在利用网上的资料后解决这个问题的方法,仅供大家参考。

首先,要感谢这个帖子点击打开链接上给出的一个链接点击打开链接,这是个英文链接,链接中 给出了axes句柄消失的深层原因,对于也加深理解的人,推荐阅读一下,废话不多说,直接说解决方法。

解决这个问题,主要用到guidata()函数,用来获取修改后的句柄结构。使用该函数,最好是在最后对axes修改的地方加入(我是用的方法),或者在每一处修改的地方都加入(个人感觉应该可以,没实验)。例如,我要在axes1上plot一些点,这时候我对axes1做出了修改,应该在plot后,我加入了如下代码:

new_handles = guidata(panoramic);set(new_handles.axes1,'ButtonDownFcn',@axes1_ButtonDownFcn);

其中panoramic表示包含axes的figure,new_handles表示改变后的句柄结构体。由于句柄结构已经修改,可以认为axes1已经不是原来最开始初始化后的那个axes1,这就导致了初始化时定义的ButtonDownFcn()已经失效(失效原因请看给出的英文链接),需要重新对axes1的ButtonDownFcn关联上新的响应函数,第二句就是实现了这么一个功能。

到这ButtonDownFcn()无效的问题已经解决了,但是这时候如果要在axes1_ButtonDownFcn(hObject, eventdata, handles)中对新的句柄中的控件进行操作,程序依然出错,这时候需要在该函数中加入一句:

handles = guidata(panoramic);
更新一下handles,这样才能够正常运行。

到这里虽然问题已经全部解决,但是依然存在一些问题,例如为什么

set(new_handles.axes1,'ButtonDownFcn',@axes1_ButtonDownFcn);

时没有把新的句柄结构传给函数,个人感觉是参数传递的问题,但是却不知道怎么进行传递,还希望看到这个帖子的人能够留言告知一声,大家相互学习,共同进步吐舌头

0 0
原创粉丝点击