扩展MATLAB控件



我想自定义一些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
  1. 没有记录的方式(如R2013a)编写MATLAB处理图形的子类类。事实上,由于MATLAB存储hg对象的方式,我们甚至无法获得一个hg对象的类很容易。例如:

    >> fig = figure();
    >> class(f)
    ans =
    double
    >> isa(f, 'figure')
    ans =
         0
    >> ishghandle(f)
    ans =
         1
    
  2. 解决这个问题的一个方法是编写一个类,它可以继承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');
    
  3. 有未记录的扩展句柄图形类的方法,但我对它们不熟悉。看看这个参考:http://undocumentedmatlab.com/blog/introduction-to-udd/

相关内容

  • 没有找到相关文章

最新更新