1

我正在尝试为鼠标悬停功能开发代码。我需要的是以下内容。

1.) 如果鼠标在绘图范围内,则能够更改为小十字光标,如果鼠标在绘图范围外,则更改回箭头。

2.) 能够在绘图范围内单击并绘制点,并为光标类型保留小十字准线。

我得到了工作的第一个要求。我遇到了第二个问题。我正在尝试使用 mathworks 中修改后的 ginput 函数 myginput。在 myginput 函数中,我将函数更改为 myginput() 并设置 arg1 == 1 并设置 strpointertype = 'Crosshair'。

从我正在创建 mouseover.m 的函数中,在 if/else 语句中检查光标是否在绘图范围内,我将 ButtonDownFcn 设置为调用 myginput。如果我运行程序并尝试在绘图范围内单击,则使用 @myginput 时会出现错误,“输入参数过多”。我没有使用任何输入参数,因为我已经在 myginput 函数中指定了它们。

关于如何解决这个问题的任何建议?主 GUI 通过调用 mouseover 函数

set (gcf, 'WindowButtonMotionFcn', @mouseover);

并且用于绘图的轴句柄是 plot_data。因此,只需制作一个带有标签 plot_data 的绘图的虚拟 GUI(alpha),并在此 GUI 中设置一个全局变量。

function varargout = alpha_OutputFcn(hObject, eventdata, handles) 
global plot_data


% Get default command line output from handles structure
varargout{1} = handles.output;

% now attach the function to the axes
set(gca,'ButtonDownFcn', @mouseclick)


set (gcf, 'WindowButtonMotionFcn', @mouseover);

下面是我的 mouseover.m 函数代码

function [data] = mouseover(gcbo,eventdata,handles)
global plot_data


cp = get(gca,'Position');           %get postion data of the current axes

LeftBound = cp(1);
RightBound = LeftBound + cp(3);

LowerBound = cp(2);
UpperBound = LowerBound + cp(4);

%check to see if mouse is within the bounds of the axes
in_bounds = @(mx, my) LeftBound < mx && mx < RightBound && LowerBound < my && my < UpperBound;

mp = get(gcf, 'CurrentPoint');      %get current position of mouse

if in_bounds(mp(1,1),mp(1,2)) == 1
    set(gcf,'pointer','Crosshair');
    set(gca,'ButtonDownFcn', @myginput)
else
    set(gcf,'pointer','Arrow');
end
4

1 回答 1

0

如果您指的是http://www.mathworks.com/matlabcentral/fileexchange/12770上的文件交换中提供的 myginput ,它看起来不像是为用作回调而编写的。ButtonDownFcn 的回调函数应始终采用两个输入参数。它们是 src 和 eventData。请参阅http://www.mathworks.com/help/matlab/creating_plots/function-handle-callbacks.html上的函数句柄回调文档。您可以尝试定义自己的函数,该函数接受所需的两个输入,然后从该函数中调用 myginput。

于 2013-02-05T02:50:21.137 回答