我正在尝试使用GUIDE创建Matlab GUI。我想插入一张图片与图片显示只有当我按下一个按钮(回调函数),并显示默认图片一旦按钮被释放。我该如何实现呢?我使用坐标轴在提到的位置显示图片
function mc_right_Callback(hObject, eventdata, handles)
% hObject handle to mc_right (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
matlabImage2 = imread('Coor2.png');
imshow(matlabImage2, 'Parent', handles.axes7);
%Vxm_Port_Send(handles.port_handle,sprintf('F,C,I3M-%d,R',handles.x_steps)); % Move along +x (right)
问题是MATLAB uicontrol不允许您创建在按钮按下或按钮释放上执行的单独回调函数。例如,按钮将在按钮释放时执行其Callback
函数。它也有一个ButtonDownFcn
功能,将执行一个按钮按下,但这个回调只有在Enable
属性被设置为'off'
或'inactive'
时才有效,在这种情况下,Callback
功能被禁用。换句话说,您不能同时使用ButtonDownFcn
和Callback
来分别获得按钮按下和释放的响应。
图形窗口确实有办法为按钮按下、按钮释放、甚至鼠标移动或滚轮活动指定单独的回调函数。这就是我通常克服uicontrol行为缺点的方法:我定义图形级回调,当它们在窗口的某些部分上方时执行。下面是一个例子:
function press_release
% Load a sample image:
imgData = imread('peppers.png');
% Create the figure and graphics objects:
hFigure = figure('WindowButtonDownFcn', @press_fcn, ...
'WindowButtonUpFcn', @release_fcn);
hImage = image(imgData, 'Visible', 'off');
hButton = uicontrol(hFigure, 'Style', 'pushbutton', ...
'Position', [10 10 30 30], ...
'Enable', 'inactive');
function press_fcn(~, ~)
if isequal(hButton, get(hFigure, 'CurrentObject'))
set(hImage, 'Visible', 'on');
set(hButton, 'Value', 1);
end
end
function release_fcn(~, ~)
set(hImage, 'Visible', 'off');
set(hButton, 'Value', 0);
end
end
当你运行上面的代码时,它将创建一个窗口,在左下角有一个轴和一个小按钮。按钮没有定义回调。当你点击鼠标的任何地方,但在按钮没有发生。但是,当您在按钮上单击鼠标(使其为图形的CurrentObject
)时,图像将变得可见,并且当您按住按钮时,按钮将按下。释放按钮使图像再次不可见,按钮显示正常。从本质上讲,按钮只是一个假人,除了给用户一种他们按下它来让事情发生的错觉外,它什么也不做。实际上是图形回调函数在起作用