Aufgabe 4.6 – Kanalauswahl mit GUI

 

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

select-channels-checkbox

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

Ähnliche Artikel

Kommentar verfassen