Matlab GUI 回调问题

Matlab GUI callback troubles

我尝试在除输入和面板按钮之外的其他地方按下和释放鼠标按钮时让 uipanel 改变边框颜色。

function    [oldpropvalues,varargout]=DisableFigure(handlearray,prop,propvalue,varargin);

  oldpropvalues=get(handlearray,prop);

  %this IF is used to highlight the "modal" panel when anywhere outside it is pressed

  if length(varargin)==2  

    %these two are the old windowbutton functions which will be put back when the window is put back to normal.
    varargout{1}=get(varargin{1},'windowbuttondownfcn');    
    varargout{2}=get(varargin{1},'windowbuttonupfcn');

    set(varargin{1},'windowbuttondownfcn',['set(varargin{2},''bordertype'',''line'',''borderwidth'',2,''highlightcolor'',[0 0 0])']);
    set(varargin{1},'windowbuttonupfcn',['set(varargin{2},''bordertype'',''beveledout'',''borderwidth'',1,''highlightcolor'',[1 1 1])']);

  end 

  set(handlearray,prop,propvalue);

错误显示 未定义变量 "varargin" 或 class "varargin".

评估图 WindowButtonDownFcn 时出错

未定义变量 "varargin" 或 class "varargin".

评估图 WindowButtonUpFcn 时出错

你没有说明错误是如何产生的,但从错误消息来看,我猜你调用的函数输入参数少于 4 个。那么varargin不存在,所以matlab报错

为避免错误,您需要在使用varargin之前检查nargin,例如,将您的if语句行替换为

if nargin==5 % so length(varargin)==2

您的问题是您正在定义 window callbacks as character vectors, which are evaluated in the base workspace where the variable varargin doesn't exist. You can define them as anonymous functions 而不是:

set(varargin{1}, 'WindowButtonDownFcn', ...
    @(~, ~) set(varargin{2}, 'BorderType', 'line', 'BorderWidth', 2, ...
                'HighlightColor', [0 0 0]));
set(varargin{1}, 'WindowButtonUpFcn', ...
    @(~, ~) set(varargin{2}, 'BorderType', 'beveledout', 'BorderWidth', 1, ...
                'HighlightColor', [1 1 1]));