怎么全是bug(哭 2023-12-30 18:20 采纳率: 0%
浏览 12

matlab鼠标键盘交互

鼠标移动到相应位置显示对应数据以及画出十字光标,此时点击键盘右键则十字光标向右移动,点击键盘左键则十字光标向左移动。

img

鼠标部分已经可以实现左右移动,但键盘仍无法控制移动。

问题如下:

  1. 我尝试键盘操作时,直接获取鼠标位置。
    结果:只能单次移动,例:鼠标位置在x=1处,点击右键x=2,再次点击右键无变化(因为点击右键时都会执行读取鼠标位置操作,导致每次都是从x=1处右移一位);此时点击左键,x=0,再次点击左键无变化(原因同上)。

currPt = get(gca, 'CurrentPoint');
x0 = currPt(1,1);
y0 = currPt(1,2);

2.使用坐标线handle.A,handle.B获得位置信息x0,y0 --> 改变位置 --> 更新handle.A,handle.B
结果:handle.A,handle.B传递的是数组,尝试添加 x0=x0(1);和y0=y0(1); 运行结果错误。

x0 = get(handles.A, 'XData');
y0 = get(handles.B, 'YData');
x0=x0(1);
y0=y0(1); 

% 键盘操作
function figure1_WindowButtonMotionFcn(hObject, eventdata, handles)
keyReleased = get(gcf, 'CurrentKey');
% 获取x0,y0,用于后续操作
x0 = get(handles.A, 'XData');
y0 = get(handles.B, 'YData');

% 改变x0,y0的值,从而改变十字坐标线
if strcmp(keyReleased, 'rightarrow')
    x0 = x0 + 1;
elseif strcmp(keyReleased, 'leftarrow')
    x0 = x0 - 1;
else
    return;
end

3.我想着使用一个变量仅存储鼠标位置,由于实现上的偏差,最终结果仍和(1.)的错误相同。

function figure1_WindowButtonMotionFcn(hObject, eventdata, handles)
global currentMousePosition;
currPt = get(gca, 'CurrentPoint');
x0 = currPt(1,1);
y0 = currPt(1,2);
currentMousePosition = [x0, y0];
function figure1_WindowButtonMotionFcn(hObject, eventdata, handles)
global currentMousePosition;
x0 = currentMousePosition(1);
y0 = currentMousePosition(2);
%改变x0,y0值,并改变十字光标 

鼠标操作如下:

#鼠标
function figure1_WindowButtonMotionFcn(hObject, eventdata, handles)
#获取鼠标位置
currPt = get(gca, 'CurrentPoint');
x0 = currPt(1,1);
y0 = currPt(1,2);
Xminmax = get(gca,'Xlim');
Yminmax = get(gca,'Ylim');
if Xminmax(1)<=x0&&x0<=Xminmax(2)&&Yminmax(1)<=y0&&y0<=Yminmax(2)
    x0=round(x0);
    #画出十字坐标线
    try
        set(handles.A,'XData',Xminmax,'YData',[y0,y0]);%水平线
        set(handles.B,'XData',[x0,x0],'YData',Yminmax);%竖直线
    catch
        handles.A = line(Xminmax,[y0,y0],'Color','magenta');
        handles.B = line([x0,x0],Yminmax,'Color','magenta');
        guidata(hObject, handles);
end
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-30 20:20
    关注

    【以下回答由 GPT 生成】

    我阅读了您的问题,并理解您的需求:您想编写一个Matlab程序,当鼠标移到指定位置时显示对应数据,并在那个位置画出十字光标。同时,您想通过键盘操作实现十字光标的左右移动。您已经实现了鼠标移动的功能,但是无法通过键盘控制移动。您尝试了一些方法,但无法达到预期效果。

    在理解了您的问题后,我建议您尝试以下解决方案:

    1. 在Figure窗口中,设置WindowButtonDownFcn函数来捕获鼠标和键盘事件。在该函数中,您可以获取键盘按键信息以处理光标移动的操作。这样,无需在WindowButtonMotionFcn函数中处理键盘操作。例如:
    function figure1_WindowButtonDownFcn(hObject, eventdata, handles)
        % 获取鼠标按下的按钮
        button = get(hObject, 'SelectionType');
    
        if strcmp(button, 'alt')
            % 向右移动十字光标
            moveCursorRight(handles);
        elseif strcmp(button, 'extend')
            % 向左移动十字光标
            moveCursorLeft(handles);
        end
    end
    
    1. 实现moveCursorRight()moveCursorLeft()函数来处理十字光标的移动操作。在这些函数中,您可以获取鼠标位置和坐标线,并更新位置信息,以达到光标移动的效果。例如:
    function moveCursorRight(handles)
        x0 = get(handles.A, 'XData');
        y0 = get(handles.B, 'YData');
    
        % 向右移动
        x0 = x0 + 1;
    
        % 更新坐标线的位置
        set(handles.A, 'XData', x0);
        set(handles.B, 'XData', x0);
    
        % 更新数据显示
        updateDataDisplay(x0, y0);
    end
    
    function moveCursorLeft(handles)
        x0 = get(handles.A, 'XData');
        y0 = get(handles.B, 'YData');
    
        % 向左移动
        x0 = x0 - 1;
    
        % 更新坐标线的位置
        set(handles.A, 'XData', x0);
        set(handles.B, 'XData', x0);
    
        % 更新数据显示
        updateDataDisplay(x0, y0);
    end
    
    function updateDataDisplay(x, y)
        % 在指定位置显示数据
        disp(['Data at position (', num2str(x), ', ', num2str(y), ')']);
    end
    
    1. 在Figure窗口中添加WindowButtonMotionFcn函数来实现当鼠标移到指定位置时显示对应数据的功能。例如:
    function figure1_WindowButtonMotionFcn(hObject, eventdata, handles)
        % 获取鼠标位置
        mousePos = get(hObject, 'CurrentPoint');
        x0 = mousePos(1);
        y0 = mousePos(2);
    
        % 更新坐标线的位置
        set(handles.A, 'XData', x0);
        set(handles.B, 'YData', y0);
    end
    

    请确保在主程序中包含以上所有函数,并将其设置为正确的Figure对象的回调函数。

    这些代码示例应该能够帮助您实现您的需求。如果您有任何疑问,请随时提问。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 12月30日

悬赏问题

  • ¥50 AI大模型精调(百度千帆、飞浆)
  • ¥15 关于#c语言#的问题:我在vscode和codeblocks中编写c语言时出现打不开源文件该怎么办
  • ¥15 非科班怎么跑代码?如何导数据和调参
  • ¥15 福州市的全人群死因监测点死亡原因报表
  • ¥15 Altair EDEM中生成一个颗粒,并且各个方向没有初始速度
  • ¥15 系统2008r2 装机配置推荐一下
  • ¥500 服务器搭建cisco AnyConnect vpn
  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊
  • ¥15 快速扫描算法求解Eikonal方程咨询