QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1147|回复: 1
打印 上一主题 下一主题

GUI新手之教你读懂GUI的M文件——非常经典

[复制链接]
字体大小: 正常 放大

2620

主题

162

听众

1万

积分

升级  0%

  • TA的每日心情
    开心
    2015-3-12 15:35
  • 签到天数: 207 天

    [LV.7]常住居民III

    社区QQ达人 发帖功臣 新人进步奖 优秀斑竹奖 金点子奖 原创写作奖 最具活力勋章 助人为乐奖 风雨历程奖

    群组第六届国赛赛前冲刺培

    群组国赛讨论

    群组2014美赛讨论

    群组2014研究生数学建模竞

    群组数学中国试看培训视频

    跳转到指定楼层
    1#
    发表于 2015-1-5 11:08 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
      GUIDE生成的GUI的M文件控制了你编制的GUI界面的所有属性和行为,或者说外观和对用户操作的响应。比如说按下一个按钮或者选择了一个菜单项之类。M文件包括了运行你整个界面程序所需要的全部代码,包括所有GUI组件的CALLBACKS函数。其实这些callbacks函数算是M文件里的子程序,callback里面就填写你所期望程序做的动作,比如画一个图或者算一个算式。
    -------------------------------------------------------
    插入,关于什么是子程序    懂的人跳过^_^
    function [avg, med] = newstats(u) % Primary function
    % NEWSTATS Find mean and median with internal functions.
    n = length(u);
    avg = mean(u, n);
    med = median(u, n);
    function a = mean(v, n)            % Subfunction
    % Calculate average.
    a = sum(v)/n;
    function m = median(v, n)          % Subfunction
    % Calculate median.
    w = sort(v);
    if rem(n, 2) == 1
       m = w((n+1) / 2);
    else
       m = (w(n/2) + w(n/2+1)) / 2;
    end
       以上就是一个大的程序function nestats,它下面另外包含了两个小的function mean和median,这样在大程序的里面就可以以如上的方式调用它们了。子程序的好处在于如果你总是要重复用到一组计算方式的时候,那你就把这组重复计算方式类似以上的方法编写成一个子程序,避免大量重复代码。在M文件里面,会看到最外层,也就是最上面那一一行
    function varargout = setfire(varargin)   
    (setfire是我m文件存的名字)就是那个大程序框,它下面有很多小function 比如什么什么creatFcn或者什么callback之类。看上去那个复杂,其实就跟上面这个一样的道理。只不过是M文件的类似avg = mean(u, n);med = median(u, n);这两句话系统隐藏(就当它是隐藏好了)起来了,它会在你点击鼠标(或者响应操作)时候自动去调用执行一次callback函数。所以你只用管把代码写入响应的函数名下就行了。至于系统为什么会自动调用,我们不用管,我们只用知道,我点击鼠标,我拖动滑竿时,系统会执行哪里的代码。就够了。
    ----------------------------------------------------插入结束-----------------------------------------------
    一 M文件的数据管理模式-----------------------------------------------------------------
    Sharing Data with the Handles Structure
    用handles这个东西共享数据
        在你运行你的GUI的时候,M文件会自动生成一个叫做handles的东西(准确的说它属于handles 类型的结构体,且取的名字也叫做handles),不用管那么复杂,只用知道你可以从它这里找到GUI的所有数据,比如说控件的信息,菜单信息,axes信息。想象handles就是一个缸了,它里面装载了所有的信息,而且这个缸在各个控件的callback之间传来传去,理所当然那每个控件的callback都可以放入一些想放入的数据,也可以从里面取出任何想要的数据包括别的控件的信息(比如滑竿的当前值,edit text的当前值)和别的控件放进去的数据。
        所以,用handles可以达到的目的有两个:
    --------------
        a,各个控件的callback的信息交换
    ------
       (current_data是随便设置的变量名)
       handles.current_data = X; 在某控件下的callback写入这一句,就表示你把这个数据放缸里了
       guidata(hObject,handles);接着别忘了保存~!
        然后在你需要的地方把它从缸里捞出来
         X1 = handles.current_data;
    -------------
        b,读取GUI控件的信息,自然也可以设置GUI控件的信息(比如说背景色随着按钮点击而变换之类,或者你想让按钮A点一下,字符B跳一下,也行。)
    ------
         all_choices是随便取的变量名,my_menu是你那个菜单项的TAG名字
         all_choices = get(handles.my_menu, 'String');
         current_choice = all_choices{get(handles.my_menu, 'Value')};
    这样current_choice就得到了用户界面操作中,目录或者菜单的选择结果。
    所以,要什么信息,直接用handles.你的对象 就行了。
    存什么信息也直接handles.你的对象  就行了。
    如果是自己的数据,就.变量名;如果是控件信息,就用get set
    二、M-File里的各个函数代表什么意思


        在设计面板设计排列好自己需要的各种按钮或者编辑框之后,下一步任务便是添加自己的响应代码。
        Opening function  添加在它名下的代码,在GUI开始运行但是还不可见的时候执行。这里的代码一般都是做一些初始化工作的。


        Output function  如果有需要,可以向命令行输出数据。(这个函数我没用过,不多说了^_^)
        Callbacks   每一次点击按钮或者向输入框输入数据或者拖动滑竿,这些控件名下的callback就会执行一次。
    ---------------
        函数的输入参数
        M-File名下的全部function都会有这两个输入参数
        hObject  它代表的是当前的这个控件(也就是你点哪一个按钮或者拖的哪一个滑竿)
        handles  它代表的是现在这整一个GUI界面


        对这两个变量进行修改后
        guidata(hObject, handles);   进行保存,否则修改无效;


    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

    2620

    主题

    162

    听众

    1万

    积分

    升级  0%

  • TA的每日心情
    开心
    2015-3-12 15:35
  • 签到天数: 207 天

    [LV.7]常住居民III

    社区QQ达人 发帖功臣 新人进步奖 优秀斑竹奖 金点子奖 原创写作奖 最具活力勋章 助人为乐奖 风雨历程奖

    群组第六届国赛赛前冲刺培

    群组国赛讨论

    群组2014美赛讨论

    群组2014研究生数学建模竞

    群组数学中国试看培训视频

    三、Opnning Function     这个函数名下的代码 在界面可见之前执行。其实你也可以在这个函数名下用handles.什么tag 来获得组件的信息。因为在Opnning函数之前,所有的组件就已经生成了,只不过openning函数是把这些组件‘打开’,让它们显示出来。所以你可以在这个函数下面,添加代码,对界面做一些初始化工作。比如,计算一些数据,显示一幅图或者别的什么工作。     function my_gui_OpeningFcn(hObject, eventdata, handles, varargin)      另外两个输入参数eventdata是matlab的保留参数,为以后开发准备的,我们不用管它。varargin 它里面保存了,传进来的命令行。     varargin怎么理解呢? -------------         my_gui('Position', [71.8 44.9 74.8 19.7])   %GUI也是函数,它只不过是有个界面的函数。它的调用,同样是 函数名(输入参数)。     这里就表示GUI在打开时,位置这个属性被设置成了右边那个值。也就是在这个位置打开GUI。Position是你GUI界面的一个属性。(要想知道各个控件有什么属性,在它上面双击就看到了。)所以同样,也可以用这种方式输入其他的初始化命令。      my_gui('路人甲','年十八')     但如果你输入别的,左边那个根本就不是界面的属性名称。这是输入的参数就保存在varargin里面。也就是 vararging{1}='路人甲' vararging{2}='年十八'。     这样也可以达到向调用的GUI传入数据的目的。
    四、Output Function   Output function --------------------     有输入自然就有输出,顾名思义,这个函数就是用来输出的。 function varargout = my_gui_OutputFcn(hObject, eventdata, handles) % Get default command line output from handles structure   varargout{1} = handles.output;       这个函数不是我们自己编写的,也不是我们负责调用。我们只用知道要传出去的数据,其实是放在vararout这个变量里面的。但是我们在别的控件的callback是叫不到vararout这个变量的,因为你去看这些callback的输入参数里并没有vararout这个变量给它用。所以我们只能间接修改handles.output这个变量。(当然在后面别忘了添加guidata(hObject, handles);保存修改)       因为默认的output函数里面varargout{1}=handles.output,也就是修改了vararout。 (所以知道了原理,output只是一个名字而已,你也可以用任意别的名字,或者添加更多的输出变量,只要在outputFcn下面添加 varargout{2}=handles.第二个变量名 。。。。类似)       guidata(hObject, handles)之后不要立即delete窗口命令,因为这时候outputfcn没有再执行一次,也就是你刚刚修改的output并没有更新到varargin里面去。      所以要么单独设计一个关闭按钮;要么跟uiwait(handles.figure1);uiresume合用。  五、Callbacks 回调函数     当你对组件做点击或者别的动作,则自动调用相应的callback。callback的名字取决于你的控件的tag和控件类型以及响应类型。

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-5-23 03:32 , Processed in 0.408959 second(s), 56 queries .

    回顶部