490 likes | 647 Views
第 5 章 图形用户界面编程. 图形用户界面. 所谓用户界面就是用户与计算机交互通信联系的平台。 图形用户界面是指包含图形对象的用户界面, MATLAB 包含两类基本的图形对象:控件对象和菜单对象。 MATLAB 提供了 “ 布局编辑器 ” 和 “ 菜单编辑器 ” 等工具设计图形用户界面。. 5.1 布局编辑器. MATLAB 窗口的 File 菜单下选 New 下的 GUI, 或在 MATLAB 命令窗口输入 guide 。. 工具条:排列、菜单编辑、 M 文件编辑器、属性观察器、对象浏览器和图形激活钮。. 布局区域. 图形对象. GUI 制作:需求分析. 要点:
E N D
图形用户界面 • 所谓用户界面就是用户与计算机交互通信联系的平台。 • 图形用户界面是指包含图形对象的用户界面,MATLAB包含两类基本的图形对象:控件对象和菜单对象。 • MATLAB提供了“布局编辑器”和“菜单编辑器”等工具设计图形用户界面。
5.1 布局编辑器 • MATLAB窗口的File菜单下选New下的GUI,或在MATLAB命令窗口输入guide。 工具条:排列、菜单编辑、M文件编辑器、属性观察器、对象浏览器和图形激活钮。 布局区域 图形对象
GUI制作:需求分析 要点: 1)确定需要实现哪些功能; 2)确定数据输入/输出方式; 3)确定所需的窗口图形元素; 4)绘制GUI草图; 5)征求用户或他人的意见,并进行修改。
GUI制作:绘制并测试GUI 要点: 1)在计算机上实现需求分析绘制的草图,并依据实际情况进行调整; 2)从用户使用的角度对GUI进行调试。 注:在完成设计与测试之前,不要编码,因为此时编写的代码可能会因设计的更改而失去意义。 在GUI测试稳定后编写并测试代码。
GUI设计原则 • 简单性 简洁、直接、清晰地体现出界面的功能和特征。 • 风格一致性 例如:图形窗口在左,图形控件在右等。 • 易理解性 尽量使用人们熟悉的标志和符号,界面中的动作必须做到及时、连续、可逆,对连续时间长的运算要给出等待时间提示,并允许用户中断等。
5.2 控件对象 选择 命令钮 单选钮 文本框 滚动条 列表框 坐标轴 开关钮 复选框 标签 框架 弹出式菜单
控件对象属性:外观及风格控制 • BackgrandColor:设置控件的背景色,可以是RGB颜色值,如[1 1 0],也可以是短名颜色值,如‘y’,还可以是长名颜色值,如‘yellow’; • Cdata:设置显示在控件上图象的颜色值;1行3列。(效果不理想) • ForegroundColor:设置控件上显示文本的颜色; • SelectHighlight:用于确定空间被选中时是否显示被选中的状态(取值:on、off); • String:用于设置控件上显示的文本串; • Visible:设置控件的可见状态。
控件对象属性:基本信息属性 • Enable:可用状态on;暂停不用状态inactive;不可用状态:off; • Parent:控件对象的父对象句柄所在图形窗口对象句柄; • Selected:用于确定控件是否被选中; • Sliderstep:用于设置滚动条每次移动的步长; • Style:用于决定所创建控件的类型; • Tag:相当于控件对象的名称,在程序设计时可用来指定控件; • TooltipString:设置简单提示信息; • UserData:保存与控件对象有关的信息或数据,可通过set和get函数来调用这些信息。
控件对象属性:字体控制属性 • FontAngle:用于确定字体的倾斜; • FontName:设置字体的名称; • FontSize:设置字体的大小; • FontUnits:确定字体大小的单位; • FontWeight:定义字体的粗细; • HorizontalAlignment:定义字符对齐方式。
控件对象属性:回调例程控制 • ButtonDownFcn:定义当鼠标在控件对象上按下时执行的回调例程,可以是字符串、MATLAB表达式或M文件的文件名; • Callback:定义单击控件时执行的回调例程; • CreateFcn:定义在控件对象创建阶段执行的回调例程; • DeleteFcn:定义在控件对象删除阶段执行的回调例程; • BusyAction:决定回调例程的调用方式,取值有cancel与queue,与Interruptible联合使用; • Interruptible:决定回调例程的中断调用模式,如为on则新的回调例程中断当前正在执行的回调例程,如为off则由BusyAction决定调用模式; • UIContextMenu:建立与上下文菜单(context menu)对象的联系,其属性的取值为菜单对象句柄。
控件对象属性:当前状态信息属性 • ListboxTop:用于显示在列表框最上头的字符串的索引号,默认值为1;是String属性定义的字符串向量的某个元素的索引值。 • Value:决定空间的当前值;对弹出式菜单控件pop_up menus,该属性为已选中的列表项的索引值。
控件对象属性:当前状态信息属性Max • Max:定义Value属性允许的最大值。 在不同的控件类型中,Max有不同的意义: 复选框:选中时Value属性的值为Max的值; 文本框:Max-Min>1则可进行多行输入; 列表框:Max-Min>1则可允许多个列表项选择; 单选钮:选中时Value属性的值为Max的值; 滚动条:定义了滚动条变化范围的最大值; 开关钮:选中时Value属性的值为Max的值。
控件对象属性:当前状态信息属性Min • Min:定义了Value属性允许的最小值。 复选框:未选中时Value属性的值为Min的值; 单选钮:未选中时Value属性的值为Min的值; 滚动条:定义了滚动条变化范围的最小值; 开关钮:未选中时Value属性的值为Min的值。
控件对象属性的操作方式和步骤 • 命令方式:利用uicontrol建立控件对象时,定义控件属性的属性值; 利用set设置、修改属性的属性值; 利用get获得属性的属性值。 • GUI方式:通过Property Inspector GUI设计工具设置控件对象的属性值。 • 程序中控件对象的一般操作步骤:1)获取对象句柄;2)对对象属性进行操作。
Root(根屏幕) Figure(图) Uicontrol(界面控制) Axes(坐标系) Uimenu(界面菜单) UicontextMenu(上下文菜单) Line (线) Surface (面) Rectangle (方) Patch (贴片) Image (图象) Text (文本) Light (光) MATLAB句柄图形 • 句柄图形:MATLAB每幅图的每个组成部分是一个对象,每个对象有一个句柄与其相联。 • MATLAB句柄图体系如下:
图形句柄 • 在MATLAB中,每个图形对象都由一个数字来表识,称为句柄,用来唯一确定图形对象。 • 计算机屏幕:根对象(Root),句柄为0; • 图形窗口:句柄为整数; • 其它:句柄为浮点值。
图形对象句柄的获取 • 每个对象在创建时可以返回该对象的句柄。例如: h=plot(0:.1:2*pi,sin(0:.1:2*pi)); • 利用标准对象句柄获取函数获取: gcf:获取当前图形窗口的句柄; gca:获取当前坐标轴的句柄; gco:获取当前图形的当前对象的句柄; gcbf/gcba/gcbo:获取回调例程图形窗口/坐标轴/当前对象的句柄。
图形对象句柄的获取findobj • h=findobj(‘Propertyname’,propertyValue,…):获得指定属性Propertyname的属性值为propertyValue对应对象的句柄。 • h=findobj(objHandle,‘Propertyname’,propertyValue,…):同上,但将查找范围限制在objHandle指定的对象及其子对象中。 • h=findobj(objHandle,’flat’,‘Propertyname’,propertyValue,…):同上,但将查找范围不包括子对象。 • h=findobj:返回一个列向量,是根对象及其所有子对象的句柄值。
图形对象句柄的获取举例 % --- Executes on button press in pushbutton1. function pushbutton1_Callback(hObject, eventdata, handles) h=findobj('Tag','axes1'); x=-pi:0.1:pi; y=sin(x); plot(x,y,'Parent',h); % --- Executes on button press in pushbutton2. function pushbutton2_Callback(hObject, eventdata, handles) h=findobj('Tag','axes2'); x=-pi:0.1:pi; y=cos(x); plot(x,y,'Parent',h);
对象及属性的操作:删除和拷贝 • delete(handle):删除句柄handle对应对象及其子对象; • c=copyobj(h,p):复制对象句柄,c为新得到的句柄。如果h和p均为向量,则将h对应的句柄分别作为p各对应对象的子对象的句柄;如果h为向量,p为标量,则将h对应的句柄作为p对应对象的子对象的句柄;如果h为标量,p为向量,则将h对应的句柄分别作为p对应对象的子对象的句柄。
对象及属性的操作copyobj举例 mesh(peaks(30)); text(30,20,2,'\leftarrow peak'); h=findobj('String','\leftarrow peak'); figure mesh(peaks(20)); ha=copyobj(h,gca);
对象及属性的操作:创建、设置和获取 • h=uicontrol(parent,’PropertyName’,propertyValue,…) 缺省parent表示在当前图形窗口创建控件对象。 • set(handle ,’PropertyName’,propertyValue,…) 用来设置句柄为handle的控件对象的属性值。 • get(handle, ’PropertyName’) 返回句柄为handle的对象中名为PropertyName的属性的属性值。
对象及属性的操作举例 x=0:.1:2*pi; y=sin(x); h_sin=plot(x,y,'*'); lineWidth=get(h_sin,'LineWidth'); set(h_sin,'Color',[1 0.5 0],'LineWidth',lineWidth+4); hpop=uicontrol('Style','popup','String','Black|Green|Blue|Red',... 'Position',[340 190 100 150],'Callback','setmap',... 'Tag','popup'); setmap.m文件中的内容: hp=findobj('Tag','popup'); val=get(hp,'Value'); if val==1 set(gca,'Color',[0,0,0]); elseif val==2 set(gca,'Color',[0 1 0]); elseif val==3 set(gca,'Color',[0 0 1]); elseif val==4 set(gca,'Color',[1 0 0]); end
5.3 菜单对象和上下文菜单 • 在MATLAB中有两类菜单:下拉式菜单uimenu和上下文菜单uicontextmenu。 • 下拉式菜单(菜单对象)的位置是固定的。 • 上下文菜单的位置是不固定的,且总与某个图形对象相联系,通过鼠标右键激活,同时下拉式菜单可为其中的菜单项。
菜单对象的创建 hm=uimenu(h,’PropertyName’,value,…) 以h为父对象的句柄创建一个菜单对象,并返回该菜单的句柄。例如: h0=figure('MenuBar','none','Toolbar','none','Name','Draw Graph'); h1=uimenu(h0,'Label','&Draw'); h11=uimenu(h1,'Label','&Membrane','Accelerator','M','Callback','Membrane'); h12=uimenu(h1,'Label','&Peaks','Accelerator','P','Callback','Peaks'); h13=uimenu(h1,'Label','&Sphere','Accelerator','S','Callback','Sphere'); h2=uimenu(h0,'Label','&Color'); h21=uimenu(h2,'Label','&Hot','Accelerator','H','Callback','Colormap(hot)'); h22=uimenu(h2,'Label','&Cool','Accelerator','C','Callback','Colormap(cool)'); h23=uimenu(h2,'Label','c&Opper','Accelerator','O','Callback','Colormap(copper)'); h24=uimenu(h2,'Label','RGB','Separator','on'); h241=uimenu(h24,'Label','&Red','Callback','set(h241,''Checked'',''on'');'); h242=uimenu(h24,'Label','&Green','Callback','set(h242,''Checked'',''on'');'); h243=uimenu(h24,'Label','&Blue','Callback','set(h243,''Checked'',''on'');'); ‘‘Checked’’
上下文菜单创建 • h=uicontextmenu(‘PropertyName’,propertyValue,…) • 一般步骤: 1)利用uincontextmenu创建上下文菜单对象; 2)利用uimenu制作菜单项; 3)利用set将上下文菜单与具体的图形对象联系起来。
上下文菜单创建举例 cmenu=uicontextmenu; hline=plot(1:10,'UIContextMenu',cmenu); item1=uimenu(cmenu,'Label','dashed',... 'Callback','set(hline,''LineStyle'',''--'')'); item2=uimenu(cmenu,'Label','dotted',... 'Callback','set(hline,''LineStyle'','':'')'); item1=uimenu(cmenu,'Label','Solid',... 'Callback','set(hline,''LineStyle'',''-'')');
菜单属性 • 在菜单编辑器的右边有少量有关菜单属性值的设置。 Checked:对选中的菜单打标记(对顶层菜单无用);Label:设置菜单标题;Separator:用于在菜单上设置分隔条;Visible:设置菜单的可见状态;Accelerator:用于设置菜单加速键;Callback:定义单击菜单对象时执行的回调例程;Tag:标记菜单项的名称,便于在程序设计时通过该名称指定菜单项。
5.4 对话框 • 在GUI程序设计中,对话框是最重要的显示信息和取得用户数据的用户界面对象。 • MATLAB的对话框分为两类:公共对话框和一般对话框。 公共对话框:文件打开对话框、文件保存对话框、颜色设置对话框、字体设置对话框、打印页面对话框、打印预览对话框和打印对话框。 一般对话框:帮助对话框、出错信息对话框、信息提示对话框等。
文件打开对话框 • [fname,pname]=uigetfile(‘FilterSpec’,’DialogTitle’,x,y) 获取待打开文件的文件名fname及路径信息pname。FilterSpec指定文件类型;DialogTitle指定对话框标题名;x,y指定对话框位置信息。 • uigetfile并未打开有关文件。MATLAB提供了基于C语言实现的低级文件I/O函数。 >> [fn,pn]=uigetfile('*.m','Open M File',10,10); >> fn fn = sample1.m >> pn pn = C:\MATLAB6p5\work\
打开、关闭文件 • [fid,errormessage]=fopen(filename,permission); 使用permission指定的模式打开filename指定的文件,成功时返回文件标识,否则返回系统错误信息errormessage. permission的取值及含义:‘r’:只读模式;‘w’:写模式(含创建);’a’:添加;‘r+’:读写;‘w+’:读写(含创建);‘a+’:添加(含创建)。 • status=fclose(fid):关闭fid指定的文件,操作成功时返回0,否则返回1。
无格式输入/输出 • [a,count]=fread(fid,size,precision,skip):从指定文件fid中读取size个单位长度为precision的数据元素至a中,skip表示每次读后跳过的字节数。 count表示实际读入的数据个数。 size取值含义:标量n(读取n个元素);inf(读到文件结尾);[m,n](读取m*n个元素)。 precision: ‘uchar’(8位无符号字符—缺省值);‘schar’(8位带符号字符);‘int8’(8位带符号整数);‘uint8’(8位无符号整数);‘single’(32位浮点数);‘double’(64位浮点数)。 • count=fwrite(fid,a,precision,skip):将a中数据转换成precision指定的数据元素写入fid指定的文件中,count为成功写入的元素数目。
格式化输入/输出 • count=fprintf(fid,format,a,…):将a中数据用format格式化后写入文件fid中,count为写入的字节数。 fid缺省表示向显示屏输出。例如: x=0:.2:2; y=[x;2*exp(x)]; fid=fopen('data.txt','w'); fprintf(fid,'%6.2f %12.8f\n',y); fclose(fid); • [a,count]=fscanf(fid,format,size):从fid指定文件中读取size指定的数据,并根据format指定的格式对其转换后返回a,count为读取的元素数目。
按行从文件读数据 • line=fgetl(fid):从文件fid中读1行数据至line,返回的行不包括换行符。遇到文件结尾则返回-1。 • line=fgets(fid):从文件fid中读1行数据至line,返回的行包括换行符。遇到文件结尾则返回-1。
文件测试 • eofstat=feof(fid): 文件结尾返回-1,否则返回0。 • frewind(fid):将文件位置指针反绕到文件开头。 • status=fseek(fid,offset,origin):将文件的位置指针定位到origin偏移offset指定的位置。Origin的取值为 ‘bof’或 -1 文件开始 ‘cof’或 0 文件当前位置 ‘eof’或 1 文件结束 • position=ftell(fid):返回位置指针指向的位置,失败时返回-1。
文件保存对话框 • [fname,pname]=uinputfile(‘Initfile’,’DialogTitle’,x,y): Initfile为指定待保存文件类型,DialogTitle为对话框标题,x和y为对话框位置。 例如:>> uiputfile('*.m','Save') ans = kk
颜色设置对话框 • c=uisetcolor(h_or_c,’DialogTitle’): h_or_c为初始颜色,可以是一个1X3的RGB向量,也可以是一个图形对象的句柄(该图形对象必有一个颜色属性)。 >> c=uisetcolor([1 0 1],'Select Color') c = 0.2510 0 0.2510
字体设置对话框 • s=uisetfont(h_or_s,’Dialog Title’):h_or_s为初始字体属性,可以是一个对象的句柄,也可以是一个字体属性结构;s为字体属性结构,包括(FontName,FontUnits,FontSize,FontWeight,FontAngle等域)。 Text1 = uicontrol('style','text','string','XxYyZz'); Text2 = uicontrol('style','text','string','AxBbCc',... 'position', [200 20 60 20]); s = uisetfont(Text1, 'Update Font'); if isstruct(s) % Check for cancel set(Text2, s); end
帮助对话框 • h=helpdlg(‘HelpString’,’dlgname’): HelpString为帮助信息;dlgname为对话框标题。例如: >> helpdlg('This is a dialogue!','Help')
在线帮助窗口helpwin(补) >> str={'Topic 1','Help string for topic1‘;'Topic 2' 'Help string for topic2'}; >> helpwin(str,'Topic 2','My Title')
信息提示对话框 • h=msgbox(message,title,’icon’): icon的取值为:‘none’,’error’,’help’和‘custom’,默认为‘none’。 Data=1:64;Data=(Data'*Data)/64; h=msgbox('String','Title','custom',Data,hsv(64));
5.5 GUI编程 • 设计一个如下所示的GUI,当单击“绘图”按钮时,将在坐标轴上绘制选择的图形。 标签的String属性的值为‘图形选择’ Figure的Name属性值为‘GUI例子程序’ 单选钮的string属性值为‘正弦曲线’,Tag属性值为sin 坐标轴的Tag属性值为‘axes1’ 单选钮的string属性值为‘余弦曲线’,Tag属性值为cos, Value属性值为1.0 命令钮的string属性值为‘绘图’,Tag属性值为draw 保存时文件名为fgui
fgui.m程序说明:gui_State % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @fgui_OpeningFcn, ... 'gui_OutputFcn', @fgui_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin & isstr(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT gui_OpeningFcn窗口创建前执行的函数; gui_OutputFcn输出时执行的函数; gui_Callback确定控件的回调函数; gui_mainfcn调用分派函数。 gui_Singleton大于0表示只有一个实例化的图形窗口存在; gui_Name图形窗口对应文件名;
fgui.m程序说明: fgui_OpeningFcn % --- Executes just before fgui is made visible. function fgui_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to fgui (see VARARGIN) % Choose default command line output for fgui handles.output = hObject; % Update handles structure guidata(hObject, handles); % UIWAIT makes fgui wait for user response (see UIRESUME) % uiwait(handles.figure1); guidata:存储或检索应用数据。
fgui.m程序说明: fgui_OutputFcn % --- Outputs from this function are returned to the command line. function varargout = fgui_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get default command line output from handles structure varargout{1} = handles.output;
fgui.m程序说明:draw_Callback % --- Executes on button press in draw. function draw_Callback(hObject, eventdata, handles) % hObject handle to draw (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) x=-pi:.1:pi; if get(handles.sin,'Value')>0 plot(x,sin(x),'Parent',handles.axes1); elseif get(handles.cos,'Value')>0 plot(x,cos(x),'Parent',handles.axes1); end 用户输入程序
fgui.m程序说明:sin_Callback % --- Executes on button press in sin. function sin_Callback(hObject, eventdata, handles) % hObject handle to sin (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hint: get(hObject,'Value') returns toggle state of sin set(handles.cos,‘Value’,get(handles.cos,‘Min’)); %设置cos单选钮为补选中状态 Cos_Callback与此类似