最近工作中遇到对FOCT中大量的数据进行拟合,如果用excel来操作,比较繁杂,由于数据比较多容易出错。故接MATLAB的GUI设计了一款适合多组数据处理、拟合功能的仿真软件,它的功能会在以后详述。做完后,感觉一直使用matlab的GUI,有必要对其M文件中的内容了解一下。以下内容摘自网络:
http://blog.sina.com.cn/s/blog_5f7f49ff0101oc9f.html
由GUIDE生成的M文件,控制GUI并决定GUI对用户的响应。它包含了运行GUI(fig文件)的所有代码。用户建立GUI时,系统自动建立了其M文件的基本框架,用户在该框架下,编写自己设置的控件的回调函数。
GUI的M文件由一系列的子函数构成,其中包括主函数:MainFcn、Opening函数、Output函数和各个控件的回调函数。其中,主函数不能修改,否则导致GUI界面初始化失败:
M文件的主函数代码:如文件名为plotcmaes
1.function varargout = plotcmaes(varargin)
2.gui_Singleton = 1;
3.gui_State = struct('gui_Name', mfilename, ...
4. 'gui_Singleton', gui_Singleton, ...
5. 'gui_OpeningFcn',@plotsfso_OpeningFcn, ...
6. 'gui_OutputFcn', @plotsfso_OutputFcn, ...
7. 'gui_LayoutFcn', [], ...
8. 'gui_Callback', []);
9. if nargin && ischar(varargin{1})
10. gui_State.gui_Callback = str2func(varargin{1});
11. end
12. if nargout
13. [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
14. else
15. gui_mainfcn(gui_State, varargin{:});
16. end
说明:
程序第1行为主函数声明。plotcmaes为函数名,varargin为输入参数,varargout为输出参数。当创建GUI时,varargin为空。当触发GUI控件对象时,varargin为一个1*4的单元数组。第1个单元存放空间的回调函数名,第2~4单元存放该回调函数的输入参数,分别为:
hObject:当前回调函数对应的GUI对象句柄;
eventdata:附加参数;
handles:当前GUI所有数据的结构体。
程序第2行指定是否只能产生一个界面。
gui_Singleton = 1表示只能产生一个窗口实例;
gui_Singleton = 0表示可以产生多个窗口实例。
程序第3~8行为一个结构体。
gui_state是一个结构体,指定了figure的Opening函数和Output函数,开始时,gui_callback为空,此时创建GUI;如果输入参数个数>1,且第一个输入参数是字符串,第二个参数是句柄值,则将输入的第一个参数传递给gui_state.callback,此时执行回调函数、、、
----------------------------------------------------------------------------------------------------------------------------------------------------------
转载链接:http://www.360doc.com/content/13/0722/17/12541269_301772042.shtml
在matlab中,每一个对象都有一个数字来标识,叫做句柄.当每次创建一个对象时,matlab就为它建立一个唯一的句柄 ;句柄中包含有该对象的相关信息参数,可以在后续程序中进行操作,改变其中的参数,以便达到不同的效果 例如:
gcf 是返回当前被激活的窗口的句柄。
你可以认为它就指代当前窗口。 figure(gcf)打开这个窗口。
这两天在看句柄式图形方面的东西,以下是我在看书过程中整理的学习笔记,比较详细的介绍了句柄以及与其密切相关的各种图形对象和它们的属性。希望能对初学Matlab界面设计的朋友们有所帮助。
GUI学习笔记: 句柄式图形常用函数:
注已下的h是figure文件的文件名
(1)get(h)返回句柄值h所指定的图形对象的所有属性名称与相对应的属性值
(2)a = get(h)返回由句柄值h所指定的图形对象的属性结构数组,并且该数组的字段名称就是该对象的属性名称。
(3)a = get(0,'factory')返回所有能由用户设置的属性的默认定义值。
(4)a = get(0,'FactoryObjectTypePropertyName1','FactoryObjectTypePropertyName2',...)返回指定对象类型指定的属性值,输入参数FactoryObjectTypePropertyName为一个关键词,由字符Factory与图形对象类型(如Figure)还有属性名称(如Color)组成。 a = get(0,'factoryFigureColor')返回Figure对象的Color属性值。
(5)a = get(h,'DefaultObjectTypePropertyName1','DefaultObjectTypePropertyName1',...)返回句柄值为h的对象指定属性的默认值。如“DefaultFigureColor”。
(6)a = get(h,'default')列出h对象的所有属性的默认属性值
(7)a = set(h)返回句柄值h所指定的图形对象的所有属性名称对应的可设置属性值,a为结构数组,存储对象的属性名称,其字段值为相对应的属性值。属性值中用{}括起来的表示默认值。
(8)set(h,a)使用指定的属性值来设置由句柄值h所指定的对象属性,a为结构数组,其字段名称为对象的属性名称,字段值为相对应的属性值。
(9)a = set(0,'factory')返回那些用户可以设置默认值的所有对象的属性,同时显示可设置的属性值。
(10)a=set(0,'FactoryObjectTypePropertyName')返回所有对象中指定的属性名称FactoryObjectTypePropertyName的所有可能的属性值。
(11)a = set(h,'属性名','属性值')设置句柄值为h的对象的与属性名对应的属性值。
(12)set(h,'DefaultObjectTypePropertyName1','DefaultObjectTypePropertyName2',...)对句柄值为h的对象设置特定属性名称的属性默认值。
(13)H = findobj;返回Root对象与其所有子对象的句柄值
(14)H = findobj(h);返回h变量的句柄值
(15)H = findobj(’属性名称‘,’属性值‘);依据对象的属性名称和属性值找出匹配的对象句柄值。
(16)H = findobj(ObjectHandles,’属性名称‘,’属性值‘);根据限定的对象列表找出与对象的属性名称和属性值匹配的对象句柄值
(17)gcf返回当前Figure对象的句柄值
gca返回当前axes对象的句柄值
gco返回当前鼠标单击的句柄值,该对象可以是除root对象外的任意图形对象,并且Matlab会把当前图形对象的句柄值存放在Figure的CurrentObject属性中
Figure对象的属性篇
(1).^是矩阵每个元素的幂乘,^是数的幂乘。
(2)set(handle)列出句柄值为handle的对象的所有属性
get(handle)除列出上述属性外,还列出可以设置的属性
reset(handle)将所有属性改为默认值
delete(handle)删除句柄值为handle的图形对象
(3)利用set(handle,‘属性名称’)获得句柄值为handle的对象的属性名称下所有可设置的属性值 set(gcf,'units):得到[ inches | centimeters | normalized | points | {pixels} | characters ],其中,大括号中是默认值
(4)clf reset;将窗口关闭,并重新设置其属性为默认值。
(5)Closerequestfcn,有效值为字符串或函数句柄(前加@) 当关闭绘图窗口或离开Matlab时,就会定义Closerequestfcn定义的函数
(6)createfcn,当Matlab建立一个对象时(如为figure对象,即打开一个绘图窗口),就会触发createfcn所定义的callback程序。如set(0,'defaultfigurecreatefcn','set(gcbo,''integerhandle'',''off'')');即设置了根对象的默认值,使每次建立figure对象时,都会指定一个非整数的句柄值。(在用户未指定句柄值时)
(7)将当前窗口中在键盘上按下的按键名显示出来。 set(gcf,'keypressfcn','get(gcf,''currentcharacter'')')
(8)color有效值为colorspec colorspec表: RGB 简称 [110] y_yellow [101] m_magenta [011] c_cyan [100] r_red [010] g_green [001] b_blue [111] w_white [000] k_black
(9)linspace(a,b,c):a初始b结束c线性分段次数linspace(a,b)则默认100次
(10)CurrentObject:有效值为图形对象句柄值:返回绘图窗口内当前被鼠标选取的对象的句柄值 (11)currentPoint:有效值[x-坐标,Y-坐标]返回绘图窗口中最后单击鼠标的位置,用get(gcf,'currentpoint')就会返回当前在窗口中单击鼠标的位置
(12)DeleteFcn:有效值:字符串或函数句柄,删除对象(这里为figure)时会触发Deletefcn所定义的Callback程序。
(13)Dockcontrols:有效值为on/off,默认值on,控制窗口的嵌入效果是否可用。
(14)Hittest:有效值on/off,决定能否用鼠标选取对象为当前对象。
(15)Integerhandle:有效值on/off,决定Figure对象句柄值的类型为整数或浮点小数。
(16)Interruptible:有效值on/off,执行过程中需要中断程序而优先执行其他程序时要设该属性为on。即Interrupptible属性是用以控制当Callback执行时是否能被其他事件(如此时鼠标按下其他控制对象)而中断,on是会中断,off时会执行完当前Callback,再去执行其他Callback。
(17)Keypressfcn:有效值为字串或函数句柄。当用户在figure窗口中按下键盘的任意键时,就会执行Keypressfcn所定义的Callback程序。 figure('keypressfcn','fprintf(''当前按下键盘上的%c键\n'',get(gcf,''currentcharacter''))')在这个figure窗口中按下键盘上的按键时就会立即返回对应的字符,依据这个效果就可以决定当字符键被按下时所要执行的操作。 当这个属性指定的值是一个函数句柄时,Matlab就会将这个函数视为一个结构,包含下列字段——character(以当前键盘上按下的按键显示的字符来当作结果),modifier(包含一个或多个识别键盘上按下按键字符名称的细胞数组(如Ctrl,Alt,Shift等),key(显示被按下的键)。
(18)WindowButtonDownFcn:有效值为字符串或函数句柄 当鼠标在绘图窗口内按下鼠标任意键时,将触发WindowButtonDownFcn所定义的Callback以产生相对应的操作。
(19)WindowButtonMotionFcn:有效值为字符串或函数句柄 当鼠标在绘图窗口内按住鼠标任意键移动,将触发WindowButtonMotionFcn所定义的Callback以产生相对应的操作。
(20)WindowButtonUpFcn:有效值为字符串或函数句柄 当鼠标在绘图窗口内释放鼠标任意键时,将触发WindowButtonUpFcn所定义的Callback以产生相对应的操作。
(21)CurrentAxes有效值为当前坐标轴的句柄值,返回当前的坐标轴句柄值。假设某坐标轴句柄值为a_h,可以使用axes(a_h)或set(gcf,'currentaxes',a_h)这两种方式,制定句柄值为a_h的坐标轴为当前坐标轴。
(22)CurrentCharacter:有效值为任意字符,返回用户在绘图窗口中最后输入的一个字符,即刚在键盘上按下的字符键将存储到Currentcharacter中,一般于Keyppressfcn合用。
(23)Currentobject有效值为图形对象的句柄值,返回绘图窗口内当前被鼠标选取的对象的句柄值。
(24)有效值为两元素的向量,[X坐标,Y坐标] 返回绘图窗口中最后单击鼠标的位置,与Windowbuttonmotionfcn,Windowbuttonupfcn合用。使用get(gcf,'currentpoint')就会返回当前在窗口中单击鼠标的位置。
Axes对象的属性
(1)title('new','color','r');给坐标轴命名为new,红色 title({'this title','has 2 '});命名为两行的标题
(2)Units:有效值为pixels/normalized/inches/centimeters/points/characters 决定各种位置属性的度量单位,相对于窗口左下角为基准。当设置为Pixels时,以像素为单位;当设置为normalized时,以坐标为单位,屏幕的左下角为[0,0],右上角为[1.0,1.0]。
(3)grid on:在图像中显示网格。
(4)children:控制axes对象的子对象,即image\light\line\patch\rectangle\surface和text等对象,可通过get(gca,'children')来返回当前坐标轴的子对象构成的句柄值向量。
(5)字体属性: Fontangle字体角度(正常normal或斜体italic/oblique) Fontname字体名称 fontsize字体大小(单位由Fontunits决定) fontunits字体单位(points/normalized/inches/centimeters/pixels) fontweight字体粗细(normal/bold/light/demi) gridlinestyle决定坐标轴网格线的样式,‘-’为实线‘- -’为虚线‘:’为点线‘-.’为点虚线 plot(1:10);grid on;set(gca,'gridlinestyle','-.');将当前坐标轴显示的网格线为点-虚线
(6)linewidth 定义X,Y和Z轴的轴线宽度(以点单位定义)
(7)NextPlot:有效值为add|replace|replacechildren,默认为replace add表示使用当前的坐标轴,把新的图形对象加到此坐标轴中是一般保留的做法,replace表示重新设置坐标轴的所有属性(Position除外),也就是在绘图前会删除当前坐标轴和它的子对象。replacechildren表示移除当前坐标轴中所有子对象,但不重新设置坐标轴的所有属性
(8)Outerposition决定坐标轴外边界的位置。由位置向量[left,bottom,width,height]组成,其中left,bottom表示相对于绘图窗口左下角的位置,width,height表示区域尺寸,默认为[0 0 1 1]
(9)Position由位置向量[left,bottom,width,height]组成,决定坐标轴位置
(10)Tag定义本坐标轴的卷展栏,因为每一个对象都有自己唯一的识别码即tag,以方便findobj函数查找坐标轴句柄值。
(11)visible决定坐标轴是否可见
(12)set(gca,'xgrid','on')绘制X轴垂直网格线 set(gca,'gridlinestyle',':','linewidth',3)设置网格线线条类型和宽度 set(gca,'box','on')将图轴方框绘制出来
(13)set(gca,'xscale','linear');将X轴刻度设为线性 set(gca,'yscale','log');将Y轴刻度设为对数
(14)disp()显示一个数组,但不显示其数组名称 disp(' Corn Oats Hay') disp(rand(5,3)) which results in Corn Oats Hay 0.2113 0.8474 0.2749 0.0820 0.4524 0.8807 0.7599 0.8075 0.6538 0.0087 0.4832 0.4899 0.8096 0.6135 0.7741 Pause:pause, by itself, causes M-files to stop and wait for you to press any key before continuing. 实例:plot(1:10);set(gca,'yscale','log'); disp('请按下Enter键'); pause set(gca,'Yscale','linear');本例是说按下Enter键将Y轴刻度由对数改为线性。
(15),,,
(16)Xtick,Ytick,Ztick:控制X,Y,Z轴坐标刻度记号的位置,即控制坐标轴上刻度记号的位置以及每隔多少值会到下一个刻度记号的位置,同时还需要配合Xticklabel、Yticklabel、Zticklabel属性来调整。详细见例程。 以下设置方式相同: set(gca,'Xticklabel',{'1';'10';'100'}) set(gca,'Xticklabel','1|10|100') set(gca,'Xticklabel',[1;10;100]) set(gca,'Xticklabel',['1 ';'10 ';'100'])
(17)Findobj:查找 Line对象 当用户建立一个线对象时,就会触发Createfcn所定义的Callback产生相对应的操作;同样,若删除一个线对象时,就会触发DeleteFcn所定义的Callback产生相对应的操作。
以下程序建立一个线对象,并设置DeleteFcn为一个问题对话框,当删除该线对象时,就会显示其问题对话框来询问用户。
(1) clipping:有效值为on/off,默认值为on 设置坐标轴土筐是否可以剪辑,如果设为off,则绘制线对象时可超出坐标轴的图框。
(2)Linewidth:有效值为纯量(与向量相对,只有大小而无方向),点为单位。
(3)Marker:有效值为字符,决定Line对象的记号类型,有+,o,*,.,x,s,d,等
(4)Markersize:有效值为纯量,单位为点,Marker的大小。
(5)UIcontextmenu:有效值为uicontextmenu对象的句柄值,定义与线对象相关联的uicontextmenu菜单,因此当用户将该线对象的属性UicontextMenu设置为相关联的uicontextmenu对象的Tag名称时,uicontextmenu就可以在该线对象上单击鼠标右键来显示uicontextmenu菜单。
(6)Tag:有效值为字符串,定义改线对象的卷展栏(即标记)
(7)Type:有效值为字符串(只读),此处为’line‘字符串。
(8)Xdata,Ydata,Zdata:有效值为坐标数组,指定产生线条的数据点,若为2D环境则Xdata、Ydata需要有相同数目的数据,而Zdata为空矩阵;3D环境则Xdata,Ydata,Zdata三者都需要有相同数目的数据。 例:x=0:5,y=x+10;line('xdata',x,'ydata',y); Patch对象 patch函数不想其他高级区域建立函数(fill和area),只是简单地将patch对象添加到当前坐标轴中而已。 使用:patch(X,Y,C) 在当前的坐标轴中添加二维填充的patch对象,X和Y用以定义patch对象顶点的位置,若X,Y为矩阵,则Matlab按每一行的元素来产生多个多边形。 例:x = [0 0;0 1;1 1]; y = [1 1;2 2;2 1]; z = [1 1;1 1;1 1];(x(1,1),y(1,1),z(1,1)为第一个面的第一个顶点,x(2,1),y(2,1),z(2,1)为第一个面的第二个顶点,以此类推) tcolor(1,1,1:3) = [1 1 1]; tcolor(1,2,1:3) = [.7 .7 .7]; patch(x,y,z,tcolor);(tcolor是一个1*2*3的三维矩阵) Surface对象 surface可以建立一个surface对象,surface是由矩阵数据所在的列索引值为X坐标,而行索引值为Y坐标,并且矩阵的每个元素值为Z坐标。 image对象 image(C)将矩阵C当作一个图像来显示,C的每一个元素定义一个图像中矩阵线段的颜色。 image(x,y,C)其中x与y为2元素的向量,分别指定X轴与Y轴卷展轴的范围。C为图像矩阵。 text对象 (1)text(x坐标,y坐标,'string')在图形中指定位置(x,y)显示字符串string。 (2)Editing有效值为on/off,off时,用户在执行GUI操作时无法直接在该Text对象上进行编辑,改为on后,可以进行编辑。 (3)HorizontalAlign 有效值为left/center/right决定Text对象中字符水平方向的对齐方式。 (4)Interpreter有效值为tex/none,决定Text对象中是否可用Tex字符注释,当设置为Tex时,表示允许用户能够在String属性下输入Tex字符。以下为在窗口的 [.5 .5]点位置处建立一个text对象并且字体大小以16点来表示的一个方程式。(显示的是一个二重积分) text('interpreter','latex','string','
----------------------------------------------------------------------------------------------------------------------------------------------------
http://wenku.baidu.com/link?url=lpYs_HUPNXqg3AEY9EbdlKC4zchbKfms-0_IQFUaAFEXyn0zC34MC_Ldti8gkQg9U-1RjgCB5H7z98cktjlm7EIqJya55snPgKs92KxbXGS
1.给设计的GUI的显示名称:
*_main=figure(„name‟,„a demo of gui design‟,„menubar‟,„none‟,…
'numbertitle','off','position',[100 100 300 100]);
2.layout视图下的工具有
layout edit 视图编辑器
Alignment tool 对齐工具
Property Inspector:对象属性观察器
Object Browser:对象浏览器
Menu Editor:菜单编辑器
3.控件名称
1.静态文本(Static Text)
2.编辑框(Edit Text)控件
3.列表框(Listbox)控件
4.滚动条(Slider)控件
5.按钮(Push Button)控件
6.开关按钮(Toggle Button)控件
7.单选按钮(Radio Button)控件
8.按钮组(Button Group)控件
9.检查框(Check Box)控件
10.列表框(Listbox)控件
11.弹出式菜单(Popup Menu)控件
12.坐标轴(Axes)控件
13.面板(Panel)控件
4.控件属性
一、控件风格和外观
(1)BackgroundColor:设置控件背景颜色,使用[R G B]或颜色定义。
(2)CData:在控件上显示的真彩色图像,使用矩阵表示。
(3)ForegroundColor:文本颜色。
(4)String属性:控件上的文本,以及列表框和弹出菜单的选项。
(5)Visible:控件是否可见。
二、对象的常规信息
(1)Enable属性: 表示此控件的使能状态,设置为on”,表示可选,为“off”时则表示不可选。
(2)Style:控件对象类型。
(3)Tag:控件表示(用户定义)。
(4)TooltipString属性:提示信息显示。当鼠标指针位于此控件上时,显示提示信息。
(5)UserData:用户指定数据。
(6)Position:控件对象的尺寸和位置。
(7)Units:设置控件的位置及大小的单位
(8)有关字体的属性,如 FontAngle, FontName等。
三、控件回调函数的执行
(1)BusyAction:处理回调函数的中断。有两种选项:即Cancel:取消中断事件,queue:排队(默认设置)。
(2)ButtonDownFcn属性:按钮按下时的处理函数。
(3)CallBack属性:是连接程序界面整个程序系统的实质性功能的纽带。该属性值应该为一个可以直接求值的字符串,在该对象被选中和改变时,系统将自动地对字符串进行求值。
(4)CreateFcn:在对象产生过程中执行的回调函数。
(5)DeleteFcn:删除对象过程中执行的回调函数。
(6)Interruptible属性:指定当前的回调函数在执行时是否允许中断,去执行其他的函数。
四、控件当前状态信息
(1)ListboxTop:在列表框中显示的最顶层的字符串的索引。
(2)Max:最大值。
(3)Min:最小值。
(4)Value:控件的当前值。
(5).当点击callback时,GUIDE会自动生成相应的函数体、函数名和名称一般是:控件、Tag、类型名
相应的参数有:hObject:事件发生的源控件
evendata:事件数据结构
handles:传入的对象句柄
CreateFcn 是在控件对象创建的时候发生(一般为初始化样式,颜色,初始值等)
DeleteFcn 是在空间对象被清除的时候发生
ButtonDownFcn和KeyPressFcn分别为鼠标点击和按键事件
CallBack为一般回调函数,因不同的控件而已异。例如按钮被按下时发生,下拉框改变值时发生
sliderbar 拖动时发生等等。
句柄图形之间的层次关系
可以创建 图形句柄的常见函数
1.figure函数:创建一个新的图形对象【fig】;
2.newplot函数:做好开始画新图形对象的准备;
3.axes函数:创建坐标轴图形对象;
4.line函数:画线;
5.patch函数:填充多边形;
6.surface函数:绘制三维曲面;
7.image函数:显示图片对象;
8.uicontrol函数:生成用户控制图形对象;
9.uimenu函数:生成图形窗口的菜单中层次菜单与下一级子菜单;
uigetfile 选择文件对话框
uiputfile 保存文件对话框
uisetcolor 设置颜色对话框
fontsetcolor 设置字体对话框
msgbox 消息框
warndlg 警告框
helpdlg 消息框
!!不过如果要让父窗口不可用,你需要使用uiwait来定焦于用户对话框。 例如:
===>h=helpdlg('Please press me!','Attention'); uiwait(h);
gcf函数:获得当前图形窗口(figure)的句柄
gca函数:获得当前坐标轴的句柄
gco函数:获得当前对象的句柄
gcbo函数:获得当前正在执行调用的对象的句柄
gcbf函数:获取包括正在执行调用的对象的图形句柄
delete函数:删除句柄所对应的图形对象
findobj函数:查找具有某种属性的图形对象
1.利用主函数 的 handles 数据结构传值
例如在某一个图像窗口句柄 中有一个对象 handles(可以定义自己的数据结构)
那么在一个子Callback函数中,可以通过handles传递数据:
function sliderbar1_Callback(hObject,eventdata,handles) %% eg1
v1=get(hObject,'value');
obj=handles.Text1 %直接定位 Tag 为 Text1的控件
set(obj,'value',v1); %% eg2
handles.MyStruct.P1=v1; % 更改handles中的数据
guidata(hObject,handles); %更新 handles !!重要 end
2.利用控件的 UserData 来传值
每一个控件一般都有一个属于自己的自定义域,userData,你可以定义这样一个域用来保存自己的数据,例如在定义 timer 的 TimerFcn中
1=timer('TimerFcn',{@Timer1Fcn},'ErrorFcn',@Timer1ErrorFcn},'Period',1.0,'ExecutionMode','fixedrate');
t1.Userfata=handles.MyStruct;
这里 Timer1Fcn的调用看似没有传入任何参数,实际上此函数的定义一定要有至少两个参数
function Timer1Fcn(obj,eventata)
obj.UserData=XXXXX;%可以这样共享数据 end
当然Timer定义的时候允许这样传递一个参数,当然这样也可以进行传值.
t1=timer('TimerFcn',{@Timer1Fcn,handles},'ErrorFcn',{@Timer1ErroFcnr,handles},'Period',1.0,'ExecutionMode','fixedrate').