想要实现和交易平台中行情图中:鼠标移动到相应位置显示对应数据以及画出十字光标,此时点击键盘右键则十字光标向右移动并更新显示框中的数据,点击键盘左键则十字光标向左移动并更新显示框中的数据。
最初写的是键盘操作是每次都从鼠标所在位置读入坐标点,导致:
最初x0=1,点击左键x1=1,再次点击无法移动;点击右键x2=2,再次点击右键无法移动。
即:每次都以x0=1为起点移动,且只能移动一次。
#鼠标操作
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
% 键盘操作
function figure1_WindowButtonMotionFcn(hObject, eventdata, handles)
% 获取x0,y0,用于后续操作
keyReleased = get(gcf, 'CurrentKey');
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
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
在这里陷入僵局,想了很久,最终:
设置坐标的全局变量,通过一个函数单独读取鼠标所在位置并传递给键盘函数。
#单独获取鼠标坐标位置,以供键盘使用
function axes1_ButtonDownFcn(hObject, eventdata, handles)
global x2;
global y2;
axes(handles.axes1);
currPt = get(gca, 'CurrentPoint');
x2 = currPt(1,1);
y2 = currPt(1,2);
#鼠标操作
function figure1_WindowButtonMotionFcn(hObject, eventdata, handles)
axes1_ButtonDownFcn(hObject, eventdata, handles)#因为matlab按照顺序执行,跳转到鼠标函数后依然需要实时更新axes1_ButtonDownFcn函数,保证键盘接受到的是此刻的鼠标所在位置
#获取鼠标位置
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
% 键盘操作
function figure1_WindowButtonMotionFcn(hObject, eventdata, handles)
global x2;
global y2;
keyReleased = get(gcf, 'CurrentKey');
if strcmp(keyReleased, 'rightarrow')
x2 = x2 + 1;
elseif strcmp(keyReleased, 'leftarrow')
x2 = x2 - 1;
else
return;
end
Xminmax = get(gca,'Xlim');
Yminmax = get(gca,'Ylim');
if Xminmax(1)<=x2&&x2<=Xminmax(2)&&Yminmax(1)<=y2&&y2<=Yminmax(2)
x2=round(x2);
try
set(handles.A,'XData',Xminmax,'YData',[y2,y2]);
set(handles.B,'XData',[x2,x2],'YData',Yminmax);
catch
handles.A = line(Xminmax,[y2,y2],'Color','magenta');
handles.B = line([x2,x2],Yminmax,'Color','magenta');
guidata(hObject, handles);
end
axes1_ButtonDownFcn函数和 figure1_WindowButtonMotionFcn函数的区别: