📄 tabfig.m
字号:
function varargout = tabfig(varargin)
%tabfig建立基于uipanel的tab图形(默认'visible','off')
% [hfig, sheetPos] = tabfig(...
% 'create',strings,tabDims,callback,sheetDims,offsets,default_page)
%
% 'create' - 建立标识
%
% strings - tab字符串
%
% tabDims -
% tabDims{1} -矢量 每个tab的长度(pixels)
%
% tabDims{2} -标量 字符高度 (pixels).
%
% callback - 每次按tab时调用的函数名,传给它的参数为:
% 1) 'tabcallbk' - 标识 'tabcallbk'
% 2) pressedTab - 选择tab的字符串
% 3) pressedTabNum - 选择tab号码
% 4) previousTab - 上一个选择的tab的字符串
% 5) previousTabNum - 上一个选择的tab的号码
% 6) hfig - 图形句柄
%
% sheetDims - [width, height] 底板的宽高(pixels)
%
% offsets -底板四个元素的偏置矢量(pixels):
% [左边
% 上边
% 右边
% 底边]
%
% default_page - 默认第几个tab.
%
% 可选参数:
% font -两元素 cell array (arg 8)
% {'fontname', fontsize}
%
% hfig - 图形的句柄(arg 9)
% 若指定之,arg 8也要指定,若用默认字体用{}
% hfig用来计算图形大小,可以先设为invisible
%
% 返回:
% hfig -所建图形句柄.
% sheetPos -底板位置.
%
%
% 附加功能
%
% tabDims = tabfig('tabdims', strings, font)
%
% 例: tabDims = tabfig('tabdims', {'cat', 'bird'});
% font为可选参数
Action = lower(varargin{1});
switch(Action),
case 'create',
[fig, sheetPos] = i_CreateTabbedDialog(varargin{2:end});
varargout = {fig, sheetPos};
case 'tabdims',
varargout = {i_DetermineTabDims(varargin{2:end})};
case 'tabpress',
hfig = varargin{2};
DialogUserData = i_GetDialogData(hfig);
previousTabNum = DialogUserData.activeTabNum;
[DialogUserData, bModified] = ...
i_ProcessTabPress(hfig, DialogUserData, varargin{3:end});
if bModified == 1,
activeTabNum = varargin{end};
i_SetDialogData(hfig, DialogUserData);
feval(DialogUserData.callback, ...
'tabcallbk', ...
DialogUserData.strings{activeTabNum}, ...
activeTabNum, ...
DialogUserData.strings{previousTabNum}, ...
previousTabNum, ...
hfig ...
);
end
case 'resize',
figresize
otherwise,
error('Invalid action.');
end
%******************************************************************************
% Function - 从所按tab取得user data ***
%******************************************************************************
function data = i_GetDialogData(dialog),
oldHiddenHandleStatus = get(0, 'ShowHiddenHandles');
set(0, 'ShowHiddenHandles', 'on');
dataContainer = findobj(dialog,...
'Type', 'uicontrol', ...
'Style', 'text', ...
'Tag', 'TMWDlgDat@#' ... %图形数据在'Style','text','Tag', 'TMWDlgDat@#'的控件中
);
data = get(dataContainer, 'UserData');
set(0, 'ShowHiddenHandles', oldHiddenHandleStatus);
%******************************************************************************
% Function - 为所按tab设置user data ***
%******************************************************************************
function i_SetDialogData(dialog, data),
oldHiddenHandleStatus = get(0, 'ShowHiddenHandles');
set(0, 'ShowHiddenHandles', 'on');
dataContainer = findobj(dialog,...
'Type', 'uicontrol', ...
'Style', 'text', ...
'Tag', 'TMWDlgDat@#' ...
);
if isempty(dataContainer),
dataContainer = uicontrol(...
'Parent', dialog, ...
'Style', 'text', ...
'Visible', 'off', ...
'Tag', 'TMWDlgDat@#' ...
);
end
set(dataContainer,'UserData', data);
set(0,'ShowHiddenHandles', oldHiddenHandleStatus);
%==============================================================================
% Function - 建立tab图形
%==============================================================================
function [hfig, sheetPosActual] = i_CreateTabbedDialog( ...
strings, tabDims, callback, sheetDims, offsets, default_page, font, hfig...
),
%==============================================================================
% 变量检查
%==============================================================================
if nargin >= 7 & ~isempty(font),
fontsize = font{2};
fontname = font{1};
else
fontsize = get(0, 'FactoryUicontrolFontSize');
fontname = get(0, 'FactoryUicontrolFontName');
end
if nargin ~= 8,
hfig = -1;
end
%==============================================================================
% 建立图形
%==============================================================================
origDefaultUicontrolEnable = get(0, 'DefaultUicontrolEnable');
if hfig == -1,
hfig = figure( ...
'Visible', 'off', ...
'Color', get(0,'FactoryUicontrolBack'), ...
'Units', 'pixels', ...
'Resize', 'on', ...
'MenuBar', menubar, ...
'IntegerHandle', 'off', ...
'NumberTitle', 'off', ...
'DefaultUicontrolUnits', 'pixels', ...
'DefaultUicontrolEnable', 'inactive' ...
);
else,
set(hfig, ...
'Color', get(0,'FactoryUicontrolBack'), ...
'Units', 'pixels', ...
'Resize', 'on', ...
'MenuBar', menubar, ...
'NumberTitle', 'off', ...
'DefaultUicontrolUnits', 'pixels', ...
'DefaultUicontrolEnable', 'inactive' ...
);
end
set(hfig,'resizefcn','tabfig(''resize'')');
%==============================================================================
% 计算几何常数
%==============================================================================
stringHeight = tabDims{2};
tabHeight = tabDims{2} + 5;
tabWidths = [0; tabDims{1}(:)];
numTabs = length(tabWidths) - 1;
switch(computer),
case 'PCWIN',
leftBevelOffset = 0;
rightBevelOffset = 2;
topBevelOffset = 1;
selectorHeight = 2;
selectorLeftFudgeFactor = 0;
deltaTabs = 3;
selectionHoffset = 1;
sheetEnableState = 'off';
case 'MAC2',
leftBevelOffset = 2;
rightBevelOffset = 2;
topBevelOffset = 2;
selectorHeight = 3;
selectorLeftFudgeFactor = -1;
deltaTabs = 1;
selectionHoffset = deltaTabs;
sheetEnableState = 'inactive';
otherwise,
leftBevelOffset = 3;
rightBevelOffset = 3;
topBevelOffset = 2;
selectorHeight = 2;
selectorLeftFudgeFactor = 0;
deltaTabs = 0;
selectionHoffset = deltaTabs;
sheetEnableState = 'off';
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
selectionVoffset = 2;
%==============================================================================
% 设定图形宽高
%==============================================================================
figPos = get(hfig, 'Position');
figHeight = ...
offsets(4) + ...
sheetDims(2) + ...
tabHeight + ...
selectionVoffset + ...
offsets(2);
figWidth = offsets(1) + sheetDims(1) + offsets(3);
figPos(3:4) = [figWidth, figHeight];
set(hfig, 'Position', figPos);
%==============================================================================
% 计算底板位置
%==============================================================================
sheetPos = [
offsets(1) + 1
offsets(4) + 1
sheetDims(1)
sheetDims(2)
];
%==============================================================================
% 建立底板
%==============================================================================
sheetPosActual = sheetPos;
sheetPosActual(4) = sheetPosActual(4) + topBevelOffset;
t3(1)=sheetPosActual(1)/figWidth;
t3(2)=sheetPosActual(2)/figHeight;
t3(3)=sheetPosActual(3)/figWidth;
t3(4)=sheetPosActual(4)/figHeight-.003;
sheet = uipanel( ...
'Parent', hfig, ...
'unit', 'norm',...
'borderwidth', 1,...
'position', t3 ...
);
set(sheet,'visible','on')
%==============================================================================
% 建立tab标签并存贮挡板位置
%==============================================================================
posTab(4) = tabHeight;
posTab(2) = sheetPos(2) + sheetPos(4) - 1;
tabs(numTabs) = 0;
selectorPos = zeros(numTabs, 4);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -