我正在尝试为鼠标悬停功能开发代码。我需要的是以下内容。
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