www.gusucode.com > GUI的布局工具箱 > GUI的布局工具箱/GUI的布局工具箱/GUILayout-v1p10/+uiextras/makeFlexDivider.m

    function uic = makeFlexDivider( parent, position, bgCol, orientation, showMarks )
%makeFlexDivider  Create a divider widget and add markings if desired
%
%   This function is for internal use only.
%
%   See also: uiextras.VBoxFlex
%             uiextras.HBoxFlex
%             uiextras.GridFlex

%   Copyright 2010 The MathWorks, Inc.
%   $Revision: 354 $
%   $Date: 2010-11-01 10:07:13 +0000 (Mon, 01 Nov 2010) $

error( nargchk( 5, 5, nargin, 'struct' ) );

if strcmpi( showMarks, 'off' ) || position(3)<3 || position(4)<3
    % No amarkings or too small to show them, so draw a blank
    cdata = ones( position(4)-1, position(3)-1 ); % One less than the space since uicontrols always start with a blank pixel
    cdata = cat( 3, cdata*bgCol(1), cdata*bgCol(2), cdata*bgCol(3) );
else
    
    % Make the divider slightly darker than it's surroundings
    bgCol = 0.97*bgCol;
    
    % Determine the highlight and lowlight colors and create an empty image
    hiCol = 1-0.2*(1-bgCol);
    loCol = 0.8*bgCol;
    fgCol = 1-0.7*(1-bgCol);
    cdata = ones( position(4)-1, position(3)-1 ); % One less than the space since uicontrols always start with a blank pixel
    cdata = cat( 3, cdata*bgCol(1), cdata*bgCol(2), cdata*bgCol(3) );
    
    % Fill central region with foreground color. Note that the top and left get
    % a spare pixel anyway, so start at 1,1.
    cdata(1:end-1,1:end-1,1) = fgCol(1);
    cdata(1:end-1,1:end-1,2) = fgCol(2);
    cdata(1:end-1,1:end-1,3) = fgCol(3);
    
    % Add fletchings if there's space
    if strcmpi( orientation, 'Vertical' )
        % Vertical divider requires horizontal fletchings
        numFletches = min( 10, floor( position(4)/6 ) ); % Fill no more than half the space (3 pixels per mark, so divide by 6)
        y0 = round( (position(4)-numFletches*3 ) / 2 );
        for ii=1:numFletches
            y = y0+(ii-1)*3;
            % Add highlight
            cdata(y,1:end-1,1) = hiCol(1);
            cdata(y,1:end-1,2) = hiCol(2);
            cdata(y,1:end-1,3) = hiCol(3);
            % Add shadow
            cdata(y+1,1:end-1,1) = loCol(1);
            cdata(y+1,1:end-1,2) = loCol(2);
            cdata(y+1,1:end-1,3) = loCol(3);
        end
    else
        % Horizontal divider requires vertical fletchings
        numFletches = min( 10, floor( position(3)/6 ) ); % Fill no more than half the space (3 pixels per mark, so divide by 6)
        x0 = round( (position(3)-numFletches*3 ) / 2 );
        for ii=1:numFletches
            x = x0+(ii-1)*3;
            % Add highlight
            cdata(1:end-1,x,1) = hiCol(1);
            cdata(1:end-1,x,2) = hiCol(2);
            cdata(1:end-1,x,3) = hiCol(3);
            % Add shadow
            cdata(1:end-1,x+1,1) = loCol(1);
            cdata(1:end-1,x+1,2) = loCol(2);
            cdata(1:end-1,x+1,3) = loCol(3);
        end
        
    end
end

% If the first argument is a divider, we update it, otherwise create from
% scratch.
if strcmpi( get( parent, 'Type' ), 'UIControl' )
    % Update existing
    set( parent, ...
        'BackgroundColor', bgCol, ...
        'ForegroundColor', bgCol, ...
        'CData', cdata, ...
        'Position', position );
    uic = parent;
else
    % Create the widget
    uic = uicontrol( 'Parent', parent, ...
        'Style', 'Checkbox', ...
        'BackgroundColor', bgCol, ...
        'ForegroundColor', bgCol, ...
        'CData', cdata, ...
        'HitTest', 'on', ...
        'Enable', 'inactive', ...
        'Units', 'Pixels', ...
        'Position', position, ...
        'HandleVisibility', 'off' );
end

% Store the original position for later
setappdata( uic, 'OriginalPosition', position );