1 回答
TA贡献1712条经验 获得超3个赞
你的要求可能无法实现。
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年之前曾经写过上百行这样的回调函数,后来除非对于非常简单的回调函数,一般都不用这种写法了。
- 1 回答
- 0 关注
- 50 浏览
添加回答
举报