Schreiben Sie eine Funktion sel=channel_select(channels), die, wie im Bild dargestellt, eine Auswahl von Messkanälen mit Hilfe von Checkboxes ermöglicht.

Die zur Verfügung stehenden Kanäle werden über den Vektor channels spezifiziert, die ausgewählten Kanäle im Vektor sel zurückgegeben. Über die beiden Pushbuttons check all und uncheck all können gleichzeitig alle Kanäle ausgewählt bzw. zurückgesetzt werden. Nach Betätigen des Pushbutton ok wird die aktuelle Auswahl in sel zurückgegeben. Bei Abbruch des Dialogs mit cancel wird ein leerer Vektor zurückgegeben. (Hinweis: Verwenden Sie die Eigenschaft ‘WindowStyle’, ‘modal’ um alle Nutzeraktionen während des Dialogs auf die aktuelle Figure zu beschränken und unterbrechen Sie den Programmfluss in der Funktion, bis der Dialog über ok oder cancel verlassen wird!
Lösung
function sel=channelselect(channels)
% set parameters
BoxW=40; % width of checkboxes [pixels]
BoxH=15; % height of checkboxes [pixels]
BtnW=60; % width of pushbuttons [pixels]
BtnH=15; % height of pushbuttons [pixels]
d=20; % distance of controls to window frame [pixels]
nchn=length(channels); % number of channels
% compute size of main window
FigW=max(nchn*BoxW+2*d, 2*BtnW+4*d);
FigH=4*BoxH+2*d;
% create main window
fhd=figure ('MenuBar','none','Name','select channels',...
'NumberTitle','off','Units','pixels',...
'Position',[0 0 FigW FigH],'Resize','off');
movegui(fhd,'center') % center gui on screen
set(fhd,'WindowStyle','modal'); % restrict user action
% to main window
% create checkboxes
for i=1:nchn
boxhandles(i)=uicontrol(fhd,'Style','checkbox',...
'Units','pixel','String',num2str(channels(i)),...
'Position',[d+(i-1)*BoxW d+3*BoxH BoxW BoxH]);
end
set(boxhandles,'BackgroundColor',get(fhd,'Color'))
% create push button 'ok'
uicontrol('parent',fhd,'Style','pushbutton','Units','pixel',...
'String','ok','position',[FigW-d-BtnW d+BtnH BtnW BtnH],...
'Callback',@call_ok);
% create push button 'cancel'
uicontrol('parent',fhd,'Style','pushbutton','Units','pixel',...
'String','cancel','position',[FigW-d-BtnW d BtnW BtnH],...
'Callback',@call_cancel);
% create push button 'check all'
uicontrol('parent',fhd,'Style','pushbutton','Units','pixel',...
'String','check all','position',[d d+BtnH BtnW BtnH],...
'ToolTipString','check all channels',...
'Callback',{@call_setall,1});
% create push button 'uncheck all'
uicontrol('parent',fhd,'Style','pushbutton','Units','pixel',...
'String','uncheck all','position',[d d BtnW BtnH],...
'ToolTipString','uncheck all channels',...
'Callback',{@call_setall,0});
uiwait(fhd) % wait for figure being closed
%---------------------------------------------------------------
% local callback functions
function call_setall(source,events,value)
% check (value=1) or uncheck (value=0) all checkboxes
set(boxhandles,'Value',value)
end
function call_cancel(source,events)
% quit main function
sel=[];
delete(fhd)
end
function call_ok(source,events)
% get values of checkboxes and extract selected channels
sel=channels(logical(cell2mat(get(boxhandles,'Value'))));
delete(fhd);
end
end


