matlab中关于pushbotton的左键双击响应问题

如注释所示,我想在按钮上实现四种点击响应,在运行的时候,其它的都行,就是无法实现“左键双击变蓝色”的效果,程序也没有任何报错信息,求大侠指点下到底是烦什么?怎么修改?如果... 如注释所示,我想在按钮上实现四种点击响应,在运行的时候,其它的都行,就是无法实现“左键双击变蓝色”的效果,程序也没有任何报错信息,求大侠指点下到底是烦什么?怎么修改?如果有更好的办法的话我会提高悬赏的!
a=uicontrol(gcf,'style','push','BackgroundColor',[0,0.7,0],...
'ButtonDownFcn',['if strcmp(get(gcf,''SelectionType''),''open'')'...%鼠标右键双击时按钮变黄色
'set(gco,''style'',''push'',''backgroundcolor'',[1,1,0]);'...
'else set(gco,''style'',''push'',''backgroundcolor'',[1,0,0]);'...%鼠标右键单击变红色
'end'],...
'Callback',['if strcmp(get(gcf,''SelectionType''),''open'')'...%鼠标左键双击变蓝色
'set(gco,''style'',''push'',''backgroundcolor'',[0,0,1]);'...
'else set(gco,''style'',''push'',''backgroundcolor'',[0,0,0]);'...%鼠标左键单击变黑色
'end']);
展开
 我来答
tianxiawulang
2014-01-08 · TA获得超过2.7万个赞
知道大有可为答主
回答量:4732
采纳率:89%
帮助的人:2635万
展开全部

你的要求可能无法实现。

 

请注意,在文档 Figure Properties 关于SelectionType 属性下面有这样一段注解:

 

Note   For uicontrols whose Enable property is on, a single left-click, Ctrl-left click, or Shift-left click sets the figure SelectionType property to normal. For a list box uicontrol whose Enable property is on, the second click of a double-click sets the figure SelectionType property to open. All clicks on uicontrols whose Enable property is inactive or off and all right-clicks on uicontrols whose Enable property is on set the figure SelectionType property as specified in the preceding table.

 

这段话有四个方面的信息:

1、对于除listbox之外的其它所有控件类型,当控件处于活动状态(Enable为on)时,任何点击鼠标左键的动作(包括同时按下Ctrl或Shift键),窗口的SelectionType属性都会设置为normal

2、对于处于活动状态的列表框,双击鼠标左键会把窗口的SelectionType设为open。换言之,列表框是唯一能响应双击鼠标左键的控件类型。

3、对于所有的鼠标右键动作,窗口的SelectionType属性能够正常体现(单击为alt,双击为open)。

4、如果控件处于不活动或禁用状态(Enable属性为inactive或off),鼠标的按键动作能够被窗口SelectionType属性正常体现。

 

所以,如你所写的代码,对于按钮类型的控件,是不可能捕捉到鼠标的左键双击动作的。要想实现你所说的变色,只有把按钮设置为非活动状态,例如:

a=uicontrol(gcf,'style','push','BackgroundColor',[0,0.7,0],'Enable','inactive',...
    'ButtonDownFcn',[ ...
    'if strcmp(get(gcf,''SelectionType''),''open'')'...%右键双击时变黄色
    '  if strcmp(lastclick,''left'')'...%左键双击变蓝色
    '    set(gco,''backgroundcolor'',[0,0,1]);'...
    '  else,' ...
    '    set(gco,''backgroundcolor'',[1,1,0]);'...
    '  end,' ...
    'elseif strcmp(get(gcf,''SelectionType''),''alt'')' ...
    '    lastclick=''right'';'...
    '    set(gco,''backgroundcolor'',[1,0,0]);'...%鼠标右键单击变红色
    'else' ...
    '    lastclick=''left'';'...
    '    set(gco,''backgroundcolor'',[0,0,0]);'...%鼠标左键单击变黑色
    'end']);

 

这里,有必要说明几个细节问题:

1、对于鼠标双击按键的动作,其实会产生两个消息:第一个是normal或alt(区分左右键);第二个为open(不区分左右键),但可以借助于前一个消息来区分。

2、当控件处于活动状态时,按鼠标左键会执行控件的Callback回调函数,但不设置窗口的CurrentPoint属性,也不执行控件的ButtonDownFcn以及窗口的WindowButtonDownFcn回调函数;而对于控件处于不活动状态或者按鼠标右键的情况,在执行ButtonDownFcn之后,还会执行窗口的WindowButtonDownFcn回调函数。

3、从MFC类的继承关系来说,控件也是一种窗口,当鼠标点击按键时,鼠标消息是被按键捕获的,所以,Figure的SelectionType属性是由MATLAB在后台进行设置的,而也正因如此,才会根据鼠标左右按键、控件类型以及是否活动而存在比较复杂的逻辑。

 

顺便说一声,这样写回调函数太费劲,我在2000年之前曾经写过上百行这样的回调函数,后来除非对于非常简单的回调函数,一般都不用这种写法了。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式