2013-03-08 78 views
2

我想定制一些MATLAB的uicontrols(如下拉框),给他们更多的用户友好的功能。扩展MATLAB uicontrol

我的问题是:是否可以扩展/继承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 

回答

0
  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 
    

    然后,您可以使用ComboBox,就像任何其他uicontrol手柄:

    obj = ComboBox(figure, 'hello|goodbye'); 
    set(obj, 'items', 'newItem1|newItem2'); 
    
  3. 有延伸的把手图形类, 无证方式,但我不熟悉它们。查看该参考文献: http://undocumentedmatlab.com/blog/introduction-to-udd/