我想自定义一些MATLAB uiconcontrols(如下拉框),以使它们具有更多用户友好的功能。
我的问题是:是否可以扩展/继承uicontrol?如果有,你怎么做?如果没有,是否有解决方法?
我已经尝试了这个基本的代码,只是为了得到它的设置,但我收到以下错误: The specified super-class 'uicontrol' contains a parse error or cannot be found on
MATLAB's search path, possibly shadowed by another file with the same name.
classdef ComboBox < uicontrol
methods(Access = public)
function obj = ComboBox()
set(obj, 'Style', 'popup');
end
end
end
当我尝试将它添加到一个数字时发生错误:
cmb = ComboBox();
set(cmb, 'Parent', obj.ui_figure);
编辑:经过思考,我认为这将是一个体面的解决方案,然而,我仍然想知道如何扩展uicontrol,如果它是可能的。
classdef ComboBox < uicontrol
properties(Access = public)
Control;
end
methods(Access = public)
function obj = ComboBox(parent, items)
obj.Control = uicontrol();
set(obj.Control, 'Style', 'popup');
set(obj.Control, 'Parent', parent);
set(obj.Control, 'String', items);
end
end
end
-
没有记录的方式(如R2013a)编写MATLAB处理图形的子类类。事实上,由于MATLAB存储hg对象的方式,我们甚至无法获得一个hg对象的类很容易。例如:
>> fig = figure(); >> class(f) ans = double >> isa(f, 'figure') ans = 0 >> ishghandle(f) ans = 1
-
解决这个问题的一个方法是编写一个类,它可以继承
handle
或hgsetget
,并将uicontrol对象的句柄作为私有属性。例如:classdef ComboBox < hgsetget properties (Access = private) Control end properties % extend the functionality of your new uicontrol with additional % properties newProp1 newProp2 end properties (Dependent = true) % make any properties of uicontrol for which you want to still % allow access as dependent properties. define set and get methods % for these properties below fontSize foregroundColor backgroundColor items end methods function obj = ComboBox(parent, items) obj.Control = uicontrol(parent, 'Style', 'popup', ... 'String', items); % make sure to delete this object if you delete the uicontrol set(obj.Control, 'DeleteFcn', {@(source, eventData)delete(obj)}) end % Define set and get methods for your new properties. These methods % will set the actual properties, and then modify the uicontrol in % some way function prop = get.newProp1(obj) prop = obj.newProp1; end function set.newProp1(obj, newVal) obj.newProp1 = newVal; % do something else end function prop = get.newProp2(obj) prop = obj.newProp2; end function set.newProp2(obj, newVal) obj.newProp2 = newVal; % do something else end % Define set and get methods for any uicontrol properties you wish % to retain. These methods will simply redirect calls to the % uicontrol object. function size = get.fontSize(obj) size = get(obj.Control, 'FontSize'); end function set.fontSize(obj, newSize) set(obj.Control, 'FontSize', newSize); end function color = get.backgroundColor(obj) color = get(obj.Control, 'BackgroundColor'); end function set.backgroundColor(obj, newColor) set(obj.Control, 'BackgroundColor', newColor); end function color = get.foregroundColor(obj) color = get(obj.Control, 'ForegroundColor'); end function set.foregroundColor(obj, newColor) set(obj.Control, 'ForegroundColor', newColor); end % You can even rename some uicontrol properties to fit your % purpose. function items = get.items(obj) items = get(obj.Control, 'String'); end function set.items(obj, newItems) set(obj.Control, 'String', newItems); end end end
你可以像使用其他
uicontrol
句柄一样使用ComboBox
:obj = ComboBox(figure, 'hello|goodbye'); set(obj, 'items', 'newItem1|newItem2');
-
有未记录的扩展句柄图形类的方法,但我对它们不熟悉。看看这个参考:http://undocumentedmatlab.com/blog/introduction-to-udd/