查看: 130|回复: 3|关注: 0

[已解决] [请教] 左键单击按钮和右键单击按钮,为何获得的单击点坐标不同?

[复制链接]

新手

18 麦片

财富积分


050


15

主题

38

帖子

0

最佳答案
程序建立一个窗口figure(句柄hf),然后建立一个按钮(句柄hbtn)
代码中含有按钮的两个回调函数 btnButtonDownFcn 和 btnCallback,
按钮的Enable=on,根据控件回调函数的定义,鼠标左键单击按钮,将会执行btnCallback,鼠标右键单击按钮,将会执行btnButtonDownFcn
代码如下:

function testMousePos
close all;  clear;  clc;
hf=figure('Tag','hf');
hbtn=uicontrol(hf,'Style','pushbutton','String','TEST','Tag','hbtn');
set(hbtn,'Position',[100 200 200 50]);
set(hbtn,'Callback',@btnCallback);
set(hbtn,'ButtonDownFcn',@btnButtonDownFcn);
set(hbtn,'Enable','on');
handles=guihandles;
guidata(hf,handles);
disp('------end of main------');

function btnButtonDownFcn(hObj, event)
    strFuncName='btnButtonDownFcn';
    handles=guidata(gcbo);
    hf=handles.hf;
    MousePoint=get(hf,'CurrentPoint');
    msgbox([strFuncName, ', 鼠标点击坐标:', num2str(MousePoint)]);
    disp(sprintf('-------- end of %s --------',strFuncName));

function btnCallback(hObj, event)
    strFuncName='btnCallback'
    handles=guidata(gcbo);
    hf=handles.hf;
    MousePoint=get(hf,'CurrentPoint');
    msgbox([strFuncName, ', 鼠标点击坐标:', num2str(MousePoint)]);
    disp(sprintf('-------- end of %s --------',strFuncName));

运行程序后,鼠标还未点击界面,此时左键单击按钮,执行btnCallback,
会弹出信息框显示单击位置坐标为[0 0]
若在窗口的左下角左键点击,再左键单击按钮,信息框显示单击点坐标为很小的数值,比如[2 3]
在窗口右上角左键单击,再左键单击按钮,信息框显示单击点坐标为很大的数值,比如[557 419]
总之,btnCallback 显示的都是单击按钮之前的那一次的单击坐标,而不是本次在按钮上单击时的坐标。

若右键单击按钮,执行btnButtonDownFcn ,就能显示在按钮上单击时的坐标,比如 [200 225],这正好是按钮的中心位置。

请教为何 btnCallback 总是显示上一次单击点的坐标?怎样才能显示本次单击点的坐标呢?谢谢!


MATLAB 基础讨论
版块优秀回答者

入门

143 麦片

财富积分


50500


1

主题

107

帖子

27

最佳答案
  • 关注者: 1
发表于 2019-11-5 17:11:16 | 显示全部楼层 |此回复为最佳答案
CurrentPoint:The coordinates indicate the location of the last mouse click, unless there is a WindowButtonMotionFcn callback defined for the figure. If the WindowButtonMotionFcn callback is defined, then the coordinates indicate the last location of the mouse pointer.

Current Point属性有这样一段描述,在没定义WindowButtonMotionFcn的情况下,该值只有在鼠标最后一次点击时才会更新。当你左击按钮时,触发的是控件的callback而不是figure的ButtonDownCallback,所以坐标没更新。右键点击时因为不算是对控件的有效点击,所以先触发了figure的ButtonDownCallback后再触发控件的ButtonDownCallback。
解决的办法很简单,增加一个空函数作为figure的WindowButtonMotionFcn属性即可。

新手

18 麦片

财富积分


050


15

主题

38

帖子

0

最佳答案
 楼主| 发表于 2019-11-5 21:08:03 | 显示全部楼层
asliulue 发表于 2019-11-5 17:11
Current Point属性有这样一段描述,在没定义WindowButtonMotionFcn的情况下,该值只有在鼠标最后一次点击 ...

谢谢你的回答!
按你的建议,增加了一个空函数作为figure的WindowButtonMotionFcn,现在能正常运行了。
但这也就意味着鼠标每次移动都会调用这个空函数,我甚至发现,移动一小段距离会调用无数次这个空函数。
虽然是空函数,不执行任何语句,但总觉得要有一次调用,还是有些浪费。
不知道是否有更好的方法。

禁止访问

17 麦片

财富积分



7

主题

309

帖子

3

最佳答案
发表于 7 天前 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

新手

46 麦片

财富积分


050


1

主题

6

帖子

0

最佳答案
发表于 7 天前 | 显示全部楼层
:hug::hug::hug::hug:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表