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