您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 第10 章图形用户界面设计
第10章图形用户界面设计图形用户界面(GrapllicaluserInterfaces,CUI)设计中,用户通过一定的方法(如鼠标或键盘等)选择或激活这些图形对象,使计算机产生某种动作或变化,比如实现计算、绘图等功能,一般都是通过调用函数来实现的。用户只和前台界面下的组件发生交互,而所有运算、绘图等内部操作都封装在内部,终端用户不需要去追究这些复杂过程的代码,同时可以使用对话框技术进行交互的数据传递。在设计一个图形用户界面时,完成界面的外观设计后,主要考虑的是界面函数如何通过回调来实现,以及采用什么样的方法比较方便快捷。本章主要讲述事件处理和回调函数,GUIDE和M文件编程等GUI高级设计的相关知识。10.1事件处理nimenu和uicontrof均有CallBack属性,这个属隆是菜单和控制框的应用核心;所有句柄图形对象都具有ButtonDo铂IFcn属性;另外,图形有KeyPressFcn和ResizeFcn属性以及windowB咖nUPFcn和W耐owButto蒯otiollFcn属性。与这些属性相关的值是回调字符串,即MATLAB字符串,当属性激活时便传给eval。以爪)函数利用鼠标箭头的位置和鼠标按钮的状态来控制MATLAB行动。指针的位置确定事件涉及到哪些回调以及当事件发生时它们被激励的顺序。下面讨论指针、对象位置和鼠标按钮动作之间的交互,以及MA】LAB如何响应变化或事件,例如按下按钮、松开按钮或指针的移动等。(l)按钮单击按钮单击可以定义为当鼠标指针存同一对象卜时,按下并随后松开鼠标按钮。如果鼠标指针在tricontrof或ulmenu项上,按钮单击触发对象Callback属性字符串的执行。按钮按下使控制框作好准备,并常常在视觉上改变ulcontrol或ulm即u,松开按钮则触发回调。(2)按下按钮当鼠标指针位于一个图形窗口内,按下鼠标按钮,根据指针位置和对句柄图形对象靠近程度将会发生不同的动作。如果一个对象被选择,它就变成了当前的对象,并上升到堆积顺序的最高端。如果没有对象被选择,图形本身就是当前对象,则图形的C?ntPofnt属性和selection顶犯属性都被更新,然后激活适当的回调。表101列出了指针位置与按钮按下所激发的回调。指针位置在u而enu或uicon的1项上面在句柄图形上或接近控制框在图形内,但不接近任何对象表1O-1指针位置与按钮按下所激发的回调指针位置所激发的属性在uimenu或uicontrol项上面准备释放事件在句柄图形上或接近控制框图形的WindowButtonDownFcn属性,然后是对象的ButtonDownFcn属性在图形内,但不接近任何对象图形的WindowButtonDownFcn属性,然后是图形的ButtonDownFcn属性丁所激发的属性准备释放事件图形的钻ndowButtonD。帅「cn属性,然后是对象的ButtonD0wOFcn属住磷注意:按钮按下事件总是在所选对象的ButtonDownFcn回调之前引起图形的WindowButtonDo训正cn回调,除非指针是在uicontrol或ulmemi对象上如果指针靠近控制框,则在图形的W山doWB叫田IDownFcn回调完毕后,引起控制框的B创tonDowlllcn回调而不是Callback属性回调。(3)松开按钮当松开鼠标按钮时,图形的c?ntPo诚属性更新。如果没有定义Windo认rButtonUPFcn回调,则松开鼠标按钮时属性Currell田oint不更新。(4)指针的移动当指针在图形内移动时,图形的CurrentPoint属性被更新,引起图形的WindowB叫011-MotionFcn回调。如果没有定义图形的WindowButtollMoti。叮cn回调,则指针移动时属性CuI'I'entPoint不更新。10.2回调函数MA】L八B中,对句柄图形对象还可以设置一些事件响应函数,它们可以在对象创建或对象删除等事件发生时执行,从而实现特定事件触发下需要的某些功能。这些事件响应函数称为句柄图形对象的回调函数。回调函数也是句柄图形对象的属性,其取值是字符串类型。当回调函数对应的事件发生时,MAILAB通过eval()函数执行回调函数的取值字符串,因此回调函数取值可以支持所有MATLAB合法命令语句、M文件名或函数句柄。所有的图形对象都有表102所示的二个回调函数。表10-2所有句柄图形对象的回调函数回调函数意义ButtonDownFcn鼠标左键在对象上单击时执行的回调函数CreateFcn对象创建时执行的回调函数DeleteFcn对象删除时执行的回调函数图形窗口对象支持更多的回调函数,见表10一3。‘目阱赚困叨困¥身堆草扮‘口恩班图困釜影翌拐蛋攀田丫叨里粤竺图梁。501。其寥‘申赫舌毒香u。必。nb犯书o1。随瞬‘田釜朋业落拜口缪扭图J沼。501。(.u。』sonb刊。solJ.,J浦》。sY嶙口恩命粤晕目满’日翼斑图叨本篡困蒸隆助摹田釜加‘专斗(.b孤韶ol幼作胡县堆等只v飞脚人‘翔率肇困釜寺一隆助纂口恩班图系咨罄熟’b孙书o1。串影舌著影耸害晋沓新印洪旧s影回可畜黔‘塔困哄回u。少sonb翔书ol。叨专仁口恩斑国照茱呼基命粤斗翻又歌b韶。501。=刀5下面是创建了GUI界面后的mygui.m除去注释后的部分代码。functionvaragout=mygui(varargin)Gui_Singleton=1;Gui_State=struct(`gui_Name`,mfilename,…`Gui_Singleton`,gui_Singleton,…`Gui_openingfcn`,@mygui_openingfcn,…`Gui_outputfcn`,@mygui_openingfcn,…`Gui_layoutfcn`,[],…`Gui_Callback`,[]);ifnargin&&ischar(varagin{1})Gui_State.gui_Callback=str2func(varagin{1});endifnargout[varagout{1:nargout}]=gui_mainfcn(gui_State,varargin{:});elseGui_mainfcn(gui_State,varargin{:});endFunctionmygui_openingfcn(hobject,eventdata,handles,varargin)…Functionvarargout=mygui_openingfcn(hobject,eventdata,handles)varargout{1}=handles.output;Functionsurf_pushbutton_Callback(hobject,eventdata,handles)Surf(handles.current_data);Functionmesh_pushbutton_Callback(hobject,eventdata,handles)Mesh(handles.current_data);Functioncontour_pushbutton_Callback(hobject,eventdata,handles)Contour(handles.current_data);Functionpopup_Callback(hobject,eventdata,handles)…Functionpopup_createfcn(hobject,eventdata,handles)…Functionsurf_menu_Callback(hobject,eventdata,handles)Surf(handles.current_data);Functionmesh_menu_Callback(hobject,eventdata,handles)Mesh_pushbutton_Callback(handles.current_data);Functioncontour_menu_Callback(hobject,eventdata,handles)Contour(handles.current_data);Functionclosef_menu_Callback(hobject,eventdata,handles)Close(gcf);Functionbox_menu_Callback(hobject,eventdata,handles)…Functiongrid_menu_Callback(hobject,eventdata,handles)…Functioncontext_menu_Callback(hobject,eventdata,handles)Functionclose_Callback(hobject,eventdata,handles)Functionchose_menu_Callback(hobject,eventdata,handles)军畜新茸书甲嶙(.u。』卿b。妞。5010.冬间哪那丫姚口导专粤晕量。令髯洲柳升堆业好叶1洲‘弯理日恩班图判圃生胶鄂黯竖贾_’审影舌奉蔷者黔‘凑困映回u妞自pl祖叨弯摆口昌班园琪味叨签鲜J。封衅阵哄基令等润。田缈竺SU佗军诺彩篇书甲嵘(.uJ护ploa.恤编)1北知n宕U=q丫姚口里专粤毋‘娜。乱卫身孚磷困麒回叨畜称日恩斑国娜工曹卿。fl4笨璨圃麒回。由劫舌毒军碍碘黯珊困麒回聆箕[I一01险1‘叨可县孚瞬将卜队l卜卜卜仁草香u0乎s部b粗书oI。身甘‘申嫌困映回叨弯摊口恩斑国哪业男£一01笙晕‘土胶黝聆黯二逊鹦嘿黯黯器黑默~票豁惠需黯二二画亚镖霖瓢霖霖[例10—2]递归函数调用实例。使用switchcase语句实现切换编程回调结构,解:在M文件编辑器输入以下代码,并保存为guihd.m。functionguihd(arg)ifnargin==0arg=`Initialize`;endswitchargcase`Initialize`hf=figure(`Position`,[200200600400],…`Name`,`GUI_hd`,…`NumberTitle`,`off`);ha=axes(`Position`,[0.40.10.50.7],…`Box`,`on`);hbSin=uicontrol(hf,…`Style`,`pushbutton`,…`Position`,[50,140,100,30],…`String`,`plotsin(x)`,…`CallBack`,…[`x=0:0.1:4*pi;`…`plot(x,sin(x));`…`axis([04*pi-11]);`…`Xlabel(``x``);`…`ylabel(``y=sin(x)``);`…]);hbCos=uicontrol(hf,…`Style`,`pushbutton`,…`Position`,[500,100,100,30],…`String`,`plotcos(x)`,…`CallBack`,…[`x=0:0.1:4*pi;`…`plot(x,cos(x));`…`axis([04*pi-11]);`…`Xlabel(``x``);`…`ylabel(``y=sin(x)``);`…]);hbClose=uicontrol(hf,…`Style`,`pushbutton`,…`Position`,[50,60,100,30],…`String`,`Exit`,…`CallBack`,`close`);case`plotsin(x)`%…case`plotcos(x)`%…case`Exit`%…Otherwiseerrordlgend[例10—3]GUIMfunctionguihd(arg)ifnargin==0arg=`Initialize`;endswitchargcase`Initialize`hf=figure(`Position`,[200200600400],…`Name`,`GUI_hd`,…`Num
本文标题:第10 章图形用户界面设计
链接地址:https://www.777doc.com/doc-6465675 .html