Matlab交互式程序设计教程及举例.docx
Matlab交互式程序设计教程及举例 Matlab交互式程序设计教程及举例 一、创建GUI(Graphics User Interface)新文件和编辑已经存在的GUI文件 1、在matlab吩咐窗口中键入guide,弹出如下的对话框: 这是一个双页面对话框,分别用于创建新文件和打开已存在的GUI文件,鼠标点击相应的标题即可切换。 2、图中可见“创建新的GUI”有四种模版选项,不管其它几个,点选第一项,按“OK按钮可打开如图所示的GUI编辑器 其中左边是控件工具栏,用户可依据自己的程序将所须要的控件用鼠标拖至右侧的编辑区域进行布局。(用户可将鼠标悬停在各个控件图表上查看各个对象的名称)菜单栏下边是工具条,其中常用的有“”(保存当前GUI文件和相应的m文件)、“ ”(编写相应协调运行的m文件、“”(编辑当前控件的相应属性)、“”(创建和修改用户自己的程序菜单)、“”(保存当前文件并运行改程序)。右下方主要区域是程序的界面布局窗口(灰色网格区域是布局区域,用户可依据程序须要用鼠标拖动该区域的右下角调整该区域的大小)。 3、此时可以按下“”图标保存该文件(自然此时程序没有任何功能,只有一个主框架),弹出文件保存对话框,在文件名处输入一个文件名(英文字母开头),如“my1”等,扩展名自动设置为“.fig”。系统除了保存当前的界面文件外,还自动生成一个与该界面一起协调运行的“my1.m”文件,并在m文件编辑窗口中打开它。 4、阅读一下该文件,可以看到该文件中目前自动创建了3个函数: function varargout = my1(varargin) function my1_OpeningFcn(hObject, eventdata, handles, varargin) function varargout = my1_OutputFcn(hObject, eventdata, handles) 这些函数声明和参数在后续的程序设计中不要做任何修改,切记! 对我们目前的应用来说第一个函数和第三个函数的程序体也不要做任何修改。 依据自己的程序涉及须要只需修改其次个函数的程序体部分。(详细的修改方式可以通过我的例子程序加以体会。) 留意其次个函数程序体的最终一条语句 guidata(hObject, handles); 该语句在后续的程序设计中将会频繁运用,现在请先记住它。 5、庆贺你!你现在已经有了一个名为“my1.m”和“my1.fig”的可以运行的文件了! 现在可以在matlab吩咐窗口中键入“my1”运行改程序,自然,除了显示一个标题为“my1”的空白窗口外,你还不能进行任何交互式限制操作(自然除了关闭该窗口外),因为你还没有写任何限制程序和添加任何控件。 二、增加控件及编写相应的执行程序 1、现在可以编辑运行窗口的标题栏即将“my1”修改为自己希望的标题,本例中我改为“参数a,b,n对r=acos(nt+b)的影响”。 在GUI设计窗口中点击“ ”工具条图标,弹出如下的“属性编辑框” 该窗口对于后续设计中的每个控件都可以打开(通过点击“”工具条图标),它共有2列,左列是当前对象的用户可以修改的属性名(按首字母依次排列),右列是每个属性的可以编辑的属性值,现在在左列找到“name”一项,将右侧的自动生成的“my1”改为“参数a,b,n对r=acos(nt+b)的影响”。关闭此窗口,点击“”以保存当前修改并运行程序。OK!窗口的标题栏已经变成了“参数a,b,n对r=acos(nt+b)的影响”。 2、现在起先程序的布局及限制设计,先从最简洁的一个限制按钮起先。 拖动GUI设计窗口左侧的“Push Button”控件至右侧设计区域中的自己希望的位置,放开鼠标,然后可以点选并拖动该控件的右下角变更该控件的大小,则界面中的第一个控件就绪。 目前可以点击“”以保存当前修改并运行程序。发生了什么事情?运行窗口的响应位置处有了这个交互式限制按钮!点击这个按钮,除了按钮自动界面上有个形象的动态响应外,不会有任何响应,因为目前我们还没有编写任何限制程序。 3、现在我们起先编写该限制程序。 点击“”工具栏图标,打开m文件编辑器,阅读相应的文件,会发觉文件末尾多了一个函数头: function pushbutton1_Callback(hObject, eventdata, handles) 这是系统自动生成的相应按钮控件的回调函数,系统自动将其命名为pushbutton1,其中pushbutton代表该控件的类别是“Push Button”,后面的阿拉伯数字代表这是用户在界面设计中所创建的第几个(该控件名称用户可以进行修改,详细修改方法见下一条说明)。现在用户可以在该函数头下边填写相应的自己所希望的限制程序。 目前我们只希望用户点击按钮时进行一个简洁的操作:结束当前程序并关闭该窗口。 这只需如下的一条语句即可:(将之写在该函数头的下面) close; 保存修改后的m文件,回到GUI设计窗口,再次点击“”运行程序,然后在运行后的窗口中点击该按钮。哈哈!如我所愿,程序平安退出了!So Easy! 4、下面我们可以调整该按钮的界面显示和将自动生成的“pushbutton1”名称改为自己简单记住的特性化名字。 在GUI设计窗口中点击此按钮,然后点击工具条上的“”工具条图标,弹出相应的“属性编辑框”已调整它的名称和运行时的界面属性(任选)。本例中我的调整如下: (1)找到“tag”属性,将其后的“pushbutton1”改为“jieshu”;(此时假如保存修改,然后进入相应的m文件编辑窗口,可以惊喜地看到其中的最终一个函数也进行了相应的修改:(将函数头中的“pushbutton1”变成了“jieshu”) function jieshu_Callback(hObject, eventdata, handles) % hObject handle to jieshu (see GCBO) % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'Value') returns position of slider % get(hObject,'Min') and get(hObject,'Max') to determine range of slider % - Executes during object creation, after setting all properties.function slider1_CreateFcn(hObject, eventdata, handles) % hObject handle to slider1 (see GCBO) % eventdata reservedhandles not created until after all CreateFcns called % Hint: slider controls usually have a light gray background, change % 'usewhitebg' to 0 to use default.See ISPC and COMPUTER.usewhitebg = 1; if usewhitebg set(hObject,'BackgroundColor',.9 .9 .9); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'); end % - Executes on slider movement.function slider2_Callback(hObject, eventdata, handles) % hObject handle to slider2 (see GCBO) % eventdata reservedto be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: slider controls usually have a light gray background, change % 'usewhitebg' to 0 to use default.See ISPC and COMPUTER.usewhitebg = 1; if usewhitebg set(hObject,'BackgroundColor',.9 .9 .9); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'); end 其中的两个_CreateFcn我们后续不需任何操作,所以也不须要任何修改,现在先记住我们须要对于两个_Callback函数进行程序的填写操作,以响应当程序执行时当用户拖动滚动条时应当引起何种响应,详细的响应程序也在后续填写,现在先在GUI界面中修改其属性值。 选中“Slider1”,打开相应的属性编辑器,找到其中的“Max”一栏,将后面的内容改为“8”(本例我的“a”值最大值为8),找到其中的“Min”一栏,将后面的内容改为“1”(本例我的“a”值最小值为1),找到“Value”一栏,点击后面的图标,在弹出的对话框中将“0.0”改为“5”,以指定在程序进行运行时将该滚动条的值设置为5。此时可以运行程序,视察第一个滚动条中的滑块位置应当在中间偏右的位置,这说明上述设定已经胜利。 “Slider2”我在这里先不做调整,系统自动默认最小值为0,最大值为1,当前值为0,逻辑上本例的“b”值应当在0与2之间,作为示例,我在后续的程序书写中将获得的该滚动条上的当前值乘以2来进行相应的调整。 作为示例,我对于本程序中参数n用一个“Edit Text”进行程序运行中的输入限制,所以在界面上再产生一个“Edit Text”,系统自动将其“Tag”设置为“edit1”,我对此不作修改,只是将其“FontSize”属性调整为“16”,将String属性改为“1”。此时检查m文件,可以视察到系统又自动创建了2个函数: function edit1_Callback(hObject, eventdata, handles) function edit1_CreateFcn(hObject, eventdata, handles) 同样其中的edit1_CreateFcn我们也不要进行任何改动,目前先记住日后在edit1_Callback中编写程序以响应用户在程序运行时响应的输入即可。 到此,本示例程序的限制对象和2个绘图区域已经完全建立完毕,目前我支配的界面如图所示。 8、下面再进行一些程序界面的协助工作,用“Static Text”控件对界面增加一些说明,以增加界面的友好性。 在第一个图形窗口上方的空隙中放置一个“Static Text”,将“String”改为“参数a,b,n对r=acos(nt+b)的影响”,按自己的意愿设置好位置,颜色,字体大小,字体名称等属性值,详细设置具体大家可以通过属性编辑器窗口查看。 在两个滚动条和编辑框的左侧依次放置3个“Static Text”,分别用于说明后续的3个控件分别用于限制哪个参数,为此,将它们的“String”属性分别设置为“a”、“b”、“n”,大小和颜色等外观形象进行适当的调整。 在第一个滚动条下的左右两端各放置一个“Static Text”,分别用于说明该滚动条的最大值和最小值,为此将它们的“String”属性分别设置为“1”、“8”;在其次个滚动条下的左右两端各放置一个“Static Text”,分别用于说明该滚动条的最大值和最小值,为此将它们的“String”属性分别设置为“0”、“2”。 最终,在两个滚动条下方中部分别放置一个“Static Text”对象,分别用于实时显示对应的滚动条在程序运行时被用户拉动时当前的详细数值,所以其“String”属性值将来在程序中即时获得,因此在目前设计阶段不进行调整,但为了避开混淆,将二者的“Tag”属性分别修改为“texta”和“textb”以便于进行程序限制,详细实现方式参见后续程序的编写。这样设计完成时得到的界面如下图。 三、完整程序的编写。 目前本例所希望的界面布局已经全部完成(除菜单外,此功能后续介绍),现在起先程序的编写工作,写详细的程序前,必需来了解matlab的各function(函数)间的数据传输机制。我们先来考察一下已经完成的m文件,在目前系统自动生成的全部function中,除第一个(相当于C语言中的main函数)外,其它的全部函数的输入参数中都有一个名为handles的变量,这是matlab为GUI程序开发者供应的一个数据结构,用于各个函数之间的数据传输,handles是结构名,程序中的每个各function间的数据都必需以handles.*的形式存在,才能实现各协调工作的各函数之间的数据传输,目前当我们完成设计后,我们已经有了一批形如handles.*的变量,如在添加了第一个显示为“结 束”的按钮并将其“Tag”属性值设置为“jieshu”后系统已经自动地为程序开发者创建了名为handles.jieshu的变量,假如我们在程序中希望访问这个按钮对象,我们就可通过这个handles.jieshu变量找到它,详细的访问程序编写后续写程序时不难学会。接着我们创建“Tag”属性分别为“help”和“jump”其次个、第三个按钮时,系统立刻为我们也创建了相应的两个变量handles.help和handles.jump。接着我们建立两个图形窗口时,系统也依次建立了handles.axe1和handles.axes2两个变量用于程序中访问这两个图形窗口,在设置好两个滚动条后,系统也马上建立了handles.slider1和handles.slider2两个变量,然后再建立滚动条下面的编辑框时也建立了handles.edit1变量。现在信任你明白“Tag”属性值的作用了吧?该属性值是什么,系统就在其前加上handles.而产生可以访问该控件的一个变量,所以界面设计阶段假如自己想修改“Tag”属性值,必需保证和其它的不能相同,且符合matlab变量的命名规则必需英文字母开头,由字母数字和下划线组成。接着我们在界面上布置的每个“Static Text”(静态文本)都依次产生一个前缀为handels.的与相应的“Tag”属性一样的变量,本例程序中我们所设置的那些静态文本变量除最终2个外(即分别位于两个滚动条下方中间的文本框)都不须要进行限制,所以不用理睬它们,只需记住最终两个变量名分别是handles.texta和handles.textb,(它们的“Tag”属性在设计阶段我们分别已经改为了texta 和textb。 除了上述的在界面设计阶段所自动建立的前缀为handles.的变量外,假如在每个函数中还须要创建新的变量,并希望这些变量值能为其它function共享,那么在定义新变量时肯定也要建立形如handles.*的变量,如本例程序中我们要用到的handles.a,handles.b, handles.hh,handles.linewidth等。 明白了数据变量命名机制后,我们现在起先完善我们本例的程序编写。 1、填写系统已经生成的my1_OpeningFcn函数 在m文件中找到函数: function my1_OpeningFcn(hObject, eventdata, handles, varargin) 该函数名称“_”前的名字与创建GUI时保存的文件名相同,“_”后的“OpeningFcn”由系统自动生成,是固定不变的,开发者也不行进行修改,该函数用于执行用户所希望的程序运行时的matlab语句。本例中我希望获得在设计阶段中两个滚动条中设置好的当前值作为函数r=acos(nt+b)中的a,b,n的值在左边大图像窗口中绘制该函数的图像,并作为花絮在其次个图像窗口中显示名为“dance_29.gif”的图像文件(该文件存放在当前书目下)。 目前的该函数文件系统已经自动生成了两条语句 % Choose default command line output for my1 handles.output = hObject; % Update handles structure guidata(hObject, handles); 不要修改它们,在两行语句之间插入自己的语句。本例中我所键入的语句和简洁功能说明如下: handles.linewidth=2; %定义画图的线宽 handles.color='b' %定义画图的颜色 handles.a=get(handles.slider1,'value'); %获得第一个滚动条当前值,并将其赋给变量handles.a %留意此句的语法,get(界面中的控件名称,所希望获得的属性名 %还记得吗?我们在设计阶段该控件的value已经设置为5 %所以此句执行后handles.a=5 handles.b=2*pi*get(handles.slider2,'value'); %原理与语法上句相同,稍有差异的是我们在设计阶段此控件的最小值和最大值 %分别设置为0和1,即用户在拉动滚动条时此值介于0和1之间 %而我们希望该函数中b值的改变在0和2*pi之间,所以对获得的滚动条的值 %乘以2*pi以达到我们的要求,不过在设计阶段该值为0,所以此句执行后 % handles.b=0 handles.n=str2double(get(handles.edit1,'string'); %原理和前句相同,获得handles.edit1的字符串内容,设计阶段设置为5 %但其数据类型为字符串,所以用str2double函数转化为浮点数赋值给handles.n handles.t=linspace(0,2*pi,1000); %对极坐标函数r=acos(nt+b)中的自变量t进行采点,0和2*pi之间等间距采 %1000个点(呵呵,数目显得比较多,辛苦计算机了) r=handles.a*cos(handles.b+handles.n*handles.t); % 对函数r=acos(nt+b)由获得的常数a,b,n计算对应t的1000个点处的函数值 %留意此时的变量r我没有加前缀handles.,因为此变量仅仅在该函数内部运用 %不须要其它函数共享,所以我们可以不把它放在handles结构中 x,y=pol2cart(handles.t,r); %原来可以干脆用polar函数画该函数的图像,但试验一中的试验大家也看到了会 %出现极坐标网格线,我希望不要它们,所以用pol2cart将这组极坐标数据转化为直角 %坐标,后面用plot函数在直角坐标系下画出等效的图像 %同样变量x,y仅仅用于本函数,所以也不须要加上handles.前缀 axes(handles.axes1); %用axes函数通知系统执行后续画图操作在名为handles.axes1的图形窗口内 %(即在设计时建立的左边较大的图形窗口内画图) handles.hh=plot(x,y,'linewidth',handles.linewidth,'color',handles.color); %用plot函数画由变量handles.linewidth指定线宽的图像,目前其值为2 %留意该操作返回一个图像指针值,将其值赋给变量handles.hh,用于其它函数操作 axis(-8.1 8.1 -8.1 8.1); %调整显示窗口坐标范围 axes(handles.axes2); %用axes函数通知系统执行后续画图操作在名为handles.axes2的图形窗口内 %(即在设计时建立的右边较大的图形窗口内画图) handles.m1,handles.map1=imread('dance_29.gif',1:10); %用imread函数读取图像文件dance_29.gif中的数据放入handles.m1(4维矩阵) %彩色图像的颜色索引表放入handles.map1变量中 %相应的语法和逻辑较为困难,假如大家有爱好,可查阅matlab帮助系统中的 %image proceing toolbox(图像处理工具箱)中的内容 %为与后面的语句相结合,大家形式上这样理解:图像文件dance_29.gif作为一个 %动态图像文件,里面包含了10张静态文件(当连续播放时可产生动画效果) %现在数据经上条语句放在了4维矩阵(试着想象一下该矩阵的组成)handles.m1中 %其中三维子阵handles.m1(:,:,:,1)放置第一张图片信息,三维子阵 %handles.m1(:,:,:,10)中依次防止了10幅其中的静态图片文件 imshow(handles.m1(:,:,:,1),handles.map1); %用imshow函数将上述的第一幅图像显示在当前的图形窗口内 axes(handles.axes1); %由于本程序运行的后续大部分操作都在第一个图形窗口内,所以执行该语句通知系统 %此后再出现的绘图吩咐都放在第一个图形窗口内,即handles.axes1中。 保存文件,此时运行程序,结果如下图所示。 左边图形窗口中显示的是a=5,b=0,n=1时极坐标函数r=acos(nt+b)的图像,右边图形窗口中是脑白金老太婆跳舞时的一个瞬间定格画面。 现在不难留意程序运行窗口中的一点令人不舒适的地方:两个滚动条下方的中心位置处还没有满意我们的要求显示当前滚动条所处位置之值。那么我们接着回到m文件的这个函数中,在刚刚完成的语句后接着实现该功能: set(handles.texta,'string',num2str(handles.a); %逻辑上该函数(set)的功能与前述GUI设计中对每个对象填写属性值的功能一样 %唯一的差异是在程序进行中用语句实现,其语法为: %set(所要设置的对象变量名,属性名,属性值) %本语句是将handles.texta这个对象的'string'设置为变量handles.a的值 %细微环节方面需留意handles.a是数值类型,须要用num2str转化为字符串 set(handles.textb,'string',num2str(handles.b); %与前一条语句功能一样,只是所修改的对象和属性值满意我们的要求。 此时再次运行程序,界面如下,实现了我们的显示目地 下面介绍一下该函数内系统自动生成的语句 guidata(hObject, handles); 的语法功能。 为了让程序内的各函数共享handles数据结构中的每个变量的最新数据,在每个函数中,假如用户修改或新定义了至少一个handles.*变量,那么切记在该函数的最终一条语句中肯定要写上该语句,以通知其它全部函数:各位函数筒子们,我在工作中修改了共享数据,日后工作中请访问新的数据,以免数据运用旧数据而发生错误!所以在日后其它函数中别忘了加上该语句。 现在我们拖拉运行程序的滚动条或点击“跳起来”按钮,我们会发觉没有所希望的响应,这是正常的,因为我们还没有编写相应的程序语句,下面我们起先逐个编写各个对象发生交互性操作时所希望的程序相应。 2、填写function slider1_Callback(hObject, eventdata, handles)函数体 找到m文件中的function slider1_Callback(hObject, eventdata, handles) 书写下列语句: handles.a=get(handles.slider1,'value'); %获得新的滚动条位置值,赋给handles.a set(handles.texta,'string',num2str(handles.a) %在滚动条下方显示新的相应数值 r=handles.a*cos(handles.b+handles.n*handles.t); %用新的a,和已知的b,n和向量t计算新的r x,y=pol2cart(handles.t,r); %转换为直角坐标 handles.hh=plot(x,y,'linewidth',handles.linewidth,'color',handles.color); axis(-8.1 8.1 -8.1 8.1);%调整显示范围 guidata(hObject, handles);%通知其它函数handles结构发生了改变 如何?这些语句都不生疏吧?所以进行相应的调整时只须要简洁的复制粘贴操作。 现在重新运行程序,拖动第一个滚动条,发生了什么改变?很兴奋吧? 3、填写function slider2_Callback(hObject, eventdata, handles)函数体 找到m文件中的function slider2_Callback(hObject, eventdata, handles) 书写下列语句: handles.b=2*pi*get(handles.slider2,'value'); %获得新的滚动条位置值,赋给handles.b,留意要乘以2*pi的set(handles.textb,'string',num2str(handles.b) %在滚动条下方显示新的相应数值 r=handles.a*cos(handles.b+handles.n*handles.t); %用新的b,和已知的a,n和向量t计算新的r x,y=pol2cart(handles.t,r); %转换为直角坐标 handles.hh=plot(x,y,'linewidth',handles.linewidth,'color',handles.color); axis(-8.1 8.1 -8.1 8.1);%调整显示范围 guidata(hObject, handles);%通知其它函数handles结构发生了改变 4、完成function edit1_Callback(hObject, eventdata, handles)函数体 找到m文件中的function edit1_Callback(hObject, eventdata, handles) 书写下列语句: handles.n=str2double(get(handles.edit1,'string'); r=handles.a*cos(handles.b+handles.n*handles.t); x,y=pol2cart(handles.t,r); handles.hh=plot(x,y,'linewidth',handles.linewidth,'color',handles.color); axis(-8.1 8.1 -8.1 8.1); guidata(hObject, handles); 这些语句的语法和逻辑功能我们都熟识了,就不添加注释了。 保存程序,再次运行程序,特殊是修改数据编辑窗口中的n值,视察运行结果。 下面我们完成小花絮在右侧的图像窗口中让老太婆跳舞。 5、完成function jump_Callback(hObject, eventdata, handles)程序体 找到函数function jump_Callback(hObject, eventdata, handles) 书写下列语句 axes(handles.axes2); %下面的绘图操作在其次个图形窗口中进行 for nn=0:49 n=rem(nn,10)+1; %找到循环变量被10除后的余数,将余数加1,赋给n imshow(handles.m1(:,:,:,n),handles.map1); %在图形窗口内显示程序运行时四围图片矩阵的第n个三维矩阵数据 pause(.05); %暂停0.05秒 end axes(handles.axes1);%循环结束后通知系统日后绘图操作在第一个图形窗口内 留意到此函数中我们没有修改handles数据结构之值,所以不须要用 guidata(hObject, handles); 通知其它函数。 介绍一个编程好用小技巧,随着GUI界面中控件的增加,m文件的function个数也越来越多,为了快速找到自己希望的函数,技巧如下: 在m文件编辑器菜单栏“”中的图标“”,点击它,会出现一个下拉菜单,里面列出了本m文件中全部的函数,点击自己希望的函数名,则编辑窗口中光标会自动跳转到此函数头部分。如何?很人性化吧? 三、为系统限制添加菜单限制 除了用我们已经看到的“按钮”等控件增加程序的交互性手段外,也可以象我们常见的许多程序一样,通过窗口顶部区域的菜单进行程序的交互式限制。本例中我们建立两个简洁的菜单,其功能是第一个用于当前图像的颜色和图形线宽的限制,其次个用于打开此文档。 1、建立两个主菜单 回到GUI界面设计环境,在工具条上点击“标,打开如下图所示的菜单编辑器。 ”(创建和修改用户自己的程序菜单)图 我们可以用它们编辑两类菜单:“Menu Bar”和“Context Menu”(上下文菜单),本文档只介绍前者,大家假如有性趣其次类菜单,可以查阅matlab的帮助系统。 连续点击两次上方的工具条中的第一个图标,下面的窗口中增加了两项,如图所示。 系统自动将其显示内容和变量名“Tag”(这个不生疏吧?)分别命名为“Untitiled 1”和“Untitiled 2”,现在点选其中的一个,如“Untitiled 1”,编辑器右边会出现该菜单的显示和限制属性编辑器如左图,编辑其属性如右图 点选其次个菜单项“Untitled 2”,分别设置两个属性如下图。 点击“OK”按钮。现在保存并运行程序,可以看到运行窗口上方出现了两个菜单条,这时再查阅一下m文件,我们会发觉系统又自动生成了两个函数头 function m1_Callback(hObject, eventdata, handles) function m2_Callback(hObject, eventdata, handles) 其命名逻辑是我们刚才在设计时将两个菜单对象的的“Tag”属性分别修改为了m1和m2。 现在在function m2_Callback(hObject, eventdata, handles)下书写如下语句 Winopen('Matlab交互式程序设计教程及举例.doc'); 保存文件,再次运行,假如当前书目下有该文件,则windows系统接受指令,打开该文件。 2、建立第一个主菜单下分别用于限制颜色和线宽的两个子菜单 回到GUI编辑环境,点击“”图标,再次打开菜单编辑器,选择第一个菜单项。 然后连续点击左上方的其次个图标,建立该菜单的两个子菜单项。分别重复1中的操作,在右方编辑窗修改它们的“Label”和“Tag”两个属性如下图所示。 对第一个子菜单项同样分别建立三个子菜单项,“Label”属性依次改为“1”、“2”、“3”, “Tag”属性依次改为“m111”、“m112”、“m113”(大家自己可以随意取特性化的名字,我命名的原则是m代表“菜单”,“m113”是第1个主菜单下的第1个子菜单下的第3个菜单项,这样日后在m文件下写程序时不至于混乱);对其次个子菜单项同样分别建立三个子菜单项,“Label”属性依次改为“红色”、“绿色”、“蓝色”,“Tag”属性依次改为“m121”、“m122”、“m123”。留意用鼠标点击其中的名为“2”和“蓝色”的两个菜单项的第5个属性前的框,出现“”,用于在程序运行时给用户指示当前的画图操作是用线宽为“2”的“蓝色”绘制曲线,选择后如图 。修改完后菜单编辑器显示如下图。 点击“OK”按钮,结束菜单编辑。保存程序并运行之,在程序运行窗口中阅读视察菜单和子菜单的改变。查看m文件,发觉系统又自动生成了8个函数头,后续我们编程限制须要的几个函数分别是: function m111_Callback(hObject, eventdata, handles) function m112_Callback(hObject, eventdata, handles) function m113_Callback(hObject, eventdata, handles) function m121_Callback(hObject, eventdata, handles) function m122_Callback(hObject, eventdata, handles) function m123_Callback(hObject, eventdata, handles) 其中前3个是用户选择“线宽”的3个菜单项的响应函数,后3个是用户选择“颜色”的3个菜单项的响应函数。 3、限制“线宽”的函数编辑 在m文件中找到函数function m111_Callback(hObject, eventdata, handles) 在其后书写下列语句 handles.linewidth=1; set(handles.hh,'linewidth',handles.linewidth); %变更名为handles.hh的图形的线宽为1 set(handles.m111,'checked','on'); %将该菜单项点选上“”以指示当前画图线宽为1 set(handles.m112,'checked','off'); set(handles.m113,'checked','off'); %另两项菜单项假如之前有“”,将其去掉 guidata(hObject, handles); %通知系统其它函数handles数据结构发生了改变 在m文件中找到函数function m112_Callback(hObject, eventdata,