精华内容
下载资源
问答
  • 【Matlab】图形用户界面设计

    万次阅读 多人点赞 2018-08-06 14:02:30
    专题八 MATLAB图形用户界面设计 一 图形窗口与坐标轴 1. 图形对象的句柄 1.1 句柄的概念 在MATLAB中,每一个具体的图形都是由若干个不同的图形对象组成的。 在MATLAB中,用句柄来标识对象,通过句柄来访问相应...

     专题八    MATLAB图形用户界面设计

    一    图形窗口与坐标轴

    1. 图形对象的句柄

    1.1 句柄的概念

    在MATLAB中,每一个具体的图形都是由若干个不同的图形对象组成的。

    在MATLAB中,用句柄来标识对象,通过句柄来访问相应对象的属性。

    1.2 访问图形对象

    访问图形对象是指获取或设置图形对象的属性。不同图形对象所具有的属性不同,但访问的方法是一样的。一般使用点运算符来访问对象属性。如下:

    对象句柄 . 属性名

    例1。

    得到结果图为:

    可以通过修改图形对象的属性来改变上图,如下:

    1.3 获取特定图形对象句柄的函数

    • gcf:获取当前图形窗口的句柄。
    • gca:获取当前坐标轴的句柄。
    • gco:获取最近被选中的图形对象的句柄。
    • findobj:按照指定的属性来获取图形对象的句柄。

    2. 图形对象的属性

    2.1 图形对象的常用公共属性

    • Children属性:该对象的所有子对象的句柄组成的一个向量。
    • Parent属性:该对象的父对象的句柄。
    • Type属性:对象的类型,这是一个只读属性。
    • Tag属性:用于给对象定义一个标识符。

    例2:分别在两个子图中绘制曲线和曲面。然后设置子图1的背景色为黄色,曲线线条的颜色为红色,设置子图2的背景色为青色。

    subplot(1,2,1);
    h1 = fplot(@(t)t.*sin(t), @(t)t.*cos(t), [0, 6*pi]); % h1是曲线的句柄
    axis equal;
    subplot(1,2,2);
    [x, y, z] = peaks(20);
    h2 = mesh(x, y, z); % h2是曲面的句柄
    h10 = h1.Parent; % h10是曲线父对象的句柄,即坐标轴的句柄
    h10.Color = 'y'; % 设置坐标轴的颜色为黄色
    h1.Color = 'r'; % 设置曲线的颜色为红色
    h2.Parent.Color = 'cyan'; % 设置坐标轴的颜色为青色

    2.2 图形对象的常用动态属性

    • KeyPressFcn属性:定义按下键盘按键事件的响应。
    • CreateFcn属性:定义创建图形对象时做出的响应。
    • DeleteFcn属性:定义取消图形对象时做出的响应。
    • WindowButtonDownFcn或ButtonDownFcn属性:定义单击鼠标左键事件的响应。

    3. 图形窗口的操作

    3.1 建立图形窗口对象

    MATLAB通过figure函数来创建窗口对象,其调用格式为:

    • 句柄变量=figure(属性1, 属性值1, 属性2, 属性值2, ...),其中,属性用于设置图形窗口的特征。
    • 句柄变量=figure,按MATLAB默认的属性值建立图形窗口。
    • figure(窗口句柄),设定该句柄对应的窗口为当前窗口。

    3.2 图形窗口属性

    • MenuBar属性:控制图形窗口是否具有菜单条,其取值为'none'或'figure'。
    • Name属性:指定图形窗口的标题。
    • NumberTitle属性:决定着在图形窗口的标题中是否以“Figure n:”为标题前缀。取值为'on'或者'off'。
    • Color属性:设定图形窗口背景的颜色。
    • 其他属性查看帮助文档。

    例3:建立一个图形窗口。该图形窗口没有菜单条,标题名称为“图形窗口示例”。图形窗口对象起始于屏幕左下角(1,1)处,宽度和高度分别是300像素点和200像素点。背景颜色为青色。当用户从键盘按下任意一个键时,然后在窗口中单击鼠标左键,在鼠标指针所在的位置将显示“Hello World!”。

    hf = figure; % 建立一个图形窗口
    hf.Color = 'cyan'; % 设置背景颜色为青色
    hf.Position = [1, 1, 300, 200]; 
    hf.Name = '图形窗口示例';
    hf.NumberTitle = 'on'; % 以Figure n:为图形窗口的标题前缀 
    hf.MenuBar = 'none'; % 图形窗口无菜单条
    hf.ButtonDownFcn = 'gtext(''Hello World!'')';

    4. 坐标轴对象的操作

    4.1 建立坐标轴对象

    使用axes函数,其调用格式是:

    • 句柄变量=axes(属性1,属性值1,属性2,属性值2,…),其中,属性用于设置坐标轴的外观和行为。
    • 句柄变量=axes,按MATLAB默认的属性值在当前图形窗口创建坐标轴。
    • axes(坐标轴句柄),设定该句柄代表的坐标轴为当前坐标轴。

    4.2 坐标轴对象的属性

    • Position属性:定义坐标轴在图形窗口中的位置和大小。
    • Units属性:定义坐标轴使用的度量单位,默认值是'normalized'。
    • Box属性:决定坐标轴是否带有边框,可取值是'on'或'off',默认值为'off'。
    • GridLineStyle属性:用于定义网格线的类型,可取值是':','-','-.','--','none',默认值是':'。
    • Title属性:用于对坐标轴标题对象进行操作,取值是通过title函数建立的标题对象的句柄。
    • XLabel, YLabel, ZLabel属性:取值分别是通过xlabel, ylabel, zlabel函数建立的标签对象的句柄。
    • XLim, YLim, ZLim属性:分别定义各坐标轴的下限和上限,取值是2元向量[Lmin, Lmax],默认值是[0,1]。
    • XScale, YScale, ZScale属性:定义各坐标轴的刻度类型。可取值是'linear','log'。
    • View属性:定义视点。取值是2元向量[az, el],az定义视点的方位角,el定义视点的仰角。坐标轴默认视点的方位角是0°,仰角是90°。
    • ColorOrder属性:用于设置多条曲线的颜色顺序,是一个n×3矩阵,矩阵的每一行用RGB三元组表示一种颜色,默认n为7(即有7种颜色)。

    例4:利用坐标轴对象实现图形窗口的分割。

    close all; clear; clc; 
    hal = axes('Position', [0.1, 0.1, 0.7, 0.7]); 
    contour(peaks(20));
    hal.Title = title('等高线');
    hal.YLabel = ylabel('南北向');
    hal.XLabel = xlabel('东西向');
    hal = axes('Position', [0.65, 0.7, 0.28, 0.28]); 
    surf(peaks(20));
    ha2.View = [-30, 45]; 

    例5:定义包含4种颜色的ColorOrder属性,绘制6条曲线。

    close all; clear; clc; 
    x = [0, 0]; 
    y = [0, 1]; 
    ha = axes; % 按MATLAB默认的属性值在当前图形窗口创建坐标轴。
    ha.ColorOrder = [0,0,0; 1,0,0; 0,1,0; 0,0,1]; % 定义4种颜色
    hold on; 
    plot(x,y, x+0.5,y, x+1,y, x+1.5,y, x+2,y, x+2.5,y); % 绘制6条曲线
    ha.XLim = [-0.2, 3];
    ha.YLim = [-0.2, 1.2];


    二    曲线与曲面对象

    曲线和曲面是MATLAB中常见的图形对象。本部分介绍如何在坐标轴中建立曲线对象和曲面对象,以及如何修改这些对象的属性来调整它们的特征。

    2.1 建立曲线对象

    line函数的调用格式为:句柄变量=line(x, y, z, 属性1, 属性值1, 属性2, 属性值2, ...),其中,x, y, z是等长的向量或同型的矩阵,存储数据点的坐标。

    2.2 曲线对象的常用属性

    • Color属性:定义曲线的颜色,默认值为[0,0,0]。
    • LineStyle属性:定义线型,默认值为‘-’。
    • LineWidth属性:定义线宽,默认值为0.5磅。
    • Marker属性:定义数据点标记符号,默认值为‘none’。
    • MarkerSize属性:定义数据点标记符号的大小,默认值为6磅。
    • XData、YData、ZData属性:设置3个坐标轴的数据源。

    例6:利用曲线对象绘制奥运五环图案。

    close all; clear; clc; 
    t = -0.1 : 0.1 : 2*pi; % 取-0.1开始是为了让各个圆环首尾闭合
    x = cos(t); 
    y = sin(t); 
    line(x, y, 'Color', 'b');
    line(x+1.2, y-1, 'Color', 'y');
    line(x+2.4, y, 'Color', 'k'); % k表示黑色
    line(x+3.6, y-1, 'Color', 'g');
    line(x+4.8, y, 'Color', 'r');
    ha = gca; % 获取当前坐标轴的句柄
    for n = 1 : size(ha.Children) % ha.Children表示坐标轴对象的所有子对象句柄组成的向量
        ha.Children(n).LineWidth = 5; % 逐个设置曲线的线宽
    end
    ha.XLim = [-2, 7]; 
    ha.YLim = [-4, 3]; 
    axis equal; 

    2.3 建立曲面对象

    建立曲面对象使用surface函数,其调用格式为:句柄变量=surface(x, y, z, c, 属性1, 属性值1, 属性2, 属性值2, ...),其中,x, y, z是等长的向量或者同型的矩阵,存储数据点的坐标,与mesh、surf函数含义相同。c用于指定在不同高度下的曲面颜色。 

    surf函数每调用一次,就会刷新坐标轴,清空原有图形,再绘制新的图形。而surface函数生成的曲面则在已有图形上叠加显示。利用surface函数建立的曲面对象,默认视点在图形正上方,即方位角为0°,仰角为90°。

    2.4 与曲面对象有关的属性

    曲面对象除了有与曲线对象相同的属性以外,还有其他一些常用的属性,如:

    • FaceColor属性:定义曲面网格片的颜色。可取值为:
    ‘flat’ 每一个网格片用单一颜色填充。
    'interp' 用渐变方式填充网格片
    'none' 网格片无颜色
    'texturemap' 用Cdata属性定义的颜色填充网格片
    RGB向量或代表颜色的字符 -
    • EdgeColor属性:定义曲面网格线的颜色。

    例7:利用曲面对象绘制立体圆环,圆环方程为:

    \left\{\begin{matrix}x=(8+3cosv)cosu & \\ y=(8+3cosv)sinu, & \\ z=3sinv & \end{matrix}\right.,其中u∈[0, 2π],v∈[0, 2π]

    close all; clear; clc; 
    r = linspace(0, 2*pi, 60); 
    [u,v] = meshgrid(r); 
    x = (8+3*cos(v)).*cos(u);
    y = (8+3*cos(v)).*sin(u);
    z = 3*sin(v);
    axes('View', [-37.5, 30]); % 建立坐标轴对象
    hs = surface(x, y, z); % 建立曲面对象
    axis equal; 
    hs.EdgeColor = 'none'; % 网格线无颜色
    hs.FaceColor = 'interp'; % 设置曲面网格片的颜色

    2.5 光照处理

    2.5.1 创建光源对象

    light函数的调用格式为:对象句柄=linght(属性1,属性值1,属性2,属性值2,...),其中,属性指定光源的特性。

    2.5.2 光源对象的属性

    • Color属性:设置光的颜色,值是RGB三元数组或者代表颜色的字符,默认为白色。
    • Style属性:设置光源类型,其取值为‘infinite’(默认值)或'local',分别表示无穷远光和近光。
    • Position属性:指定光源位置,值是一个3元向量。

    2.5.3 设置光照模式

    利用lighting命令可以设置光照模式,lighting命令格式为:lighting 选项,其中,选项可取值为:

    • flat(默认值):使得入射光均匀洒落在图形对象的每个面上。
    • gouraud:先对顶点颜色插补,再对顶点勾画的面上颜色进行插补。
    • phong:对顶点处的法线插值,再计算各个像素的反光。
    • none:关闭所有光源。

    例8:绘制光照处理后的圆环面并观察不同光照模式下的效果。

    close all; clear; clc; 
    r = linspace(0, 2*pi, 60); 
    [u, v] = meshgrid(r); 
    x = (8+3*cos(v)).*cos(u); 
    y = (8+3*cos(v)).*sin(u);
    z = 3*sin(v);
    axes('Position', [0.05, 0.675, 1.0, 0.3], 'View', [-37.5, 30]);
    hs1 = surface(x, y, z);
    axis equal; 
    hs1.EdgeColor = 'none'; 
    hs1.FaceColor = 'interp'; 
    axes('Position', [0.05, 0.35, 1.0, 0.3], 'View', [-37.5, 30]);
    hs2 = surface(x, y, z);
    axis equal; 
    hs2.EdgeColor = 'none'; 
    hs2.FaceColor = 'interp'; 
    light('Position', [0, 0, 8]); 
    lighting flat; 
    axes('Position', [0.05, 0.025, 1.0, 0.3], 'View', [-37.5, 30]);
    hs3 = surface(x, y, z);
    axis equal; 
    hs3.EdgeColor = 'none'; 
    hs3.FaceColor = 'interp'; 
    light('Position', [0, 0, 8]); 
    lighting phong; 

    2.6 图形对象的反射特性

    • SpecularStrength属性:控制对象表面镜面反射的强度,属性值取0-1之间的数,默认值为0.9。
    • DiffuseStrength属性:控制对象表面漫反射的强度,属性值取0-1之间的数,默认值为0.6。
    • AmbientStrength属性:确定环境光的强度,属性值取0-1之间的数,默认值为0.3。
    • SpecularExponent属性:控制镜面反射指数,值大于等于1,大多设置在5-20之间,默认值为10。
    • BackFaceLinghting属性:控制对象内表面和外表面的差别,取值为‘unlit’,‘lit’,‘reverselit’,默认值为‘reverselit’。

    三   图形用户界面设计方法 

    1. 图形用户界面

    图形用户界面(Graphical User Interface, GUI):用户与计算机进行信息交流的窗口。

    设计图形用户界面的方法:

    • 调用建立用户界面控件的函数
    • 使用MATLAB提供的GUIDE工具进行可视化设计

    2. 控件对象及其操作

    2.1 常用控件

    • 输入和输出类控件:编辑框、静态文本、列表框、滑动条等。
    • 实施确认、选择操作类控件:按钮、双位按钮、单选按钮、复选框等。

    2.2 建立控件对象

    uicontrol函数用于建立控件对象,其调用格式为:句柄变量=uicontrol(图形窗口句柄, 属性1, 属性值1, 属性2, 属性值2, ...),其中,属性及其取值决定了控件的特征。若省略图形窗口句柄,默认在当前图形窗口建立控件对象。

    2.3 控件对象的基本控制属性

    控件对象除了具有图形对象的公共属性外,还具有一些特殊的控制属性,如:

    • Style属性:定义控件对象的类型。例如'pushbutton'表示按钮对象,'edit'表示编辑框,等等。
    • String属性:定义控件对象的说明文字。
    • Tag属性:标识控件对象。
    • Enable属性:控制控件对象是否可用。
    • Position属性:定义控件对象在父对象上的位置和大小,其取值形式为[x, y, w, h]。
    • Callback属性:其属性值是描述命令的字符串或函数句柄,当选中控件时,系统将自动执行字符串描述的命令或调用句柄所代表的的函数,实施相关操作。

    例9:在图形窗口中建立三个按钮对象,当单击按钮时分别绘制正弦曲线、显示或隐藏坐标轴的网格、清除坐标轴的图形。

    close all; clear; clc; 
    ha = axes('Units', 'pixels', 'Position', [40, 40, 360, 360]); 
    ptgrid = uicontrol('Style', 'pushbutton', ...
        'String', '网格', 'Position', [450, 150, 60, 30], 'Callback', 'grid'); 
    btncla = uicontrol('Style', 'pushbutton', ...
        'String', '清除', 'Position', [450, 100, 60, 30], 'Callback', 'cla');
    btnplot = uicontrol('Style', 'pushbutton', ...
        'String', '绘图', 'Position', [450, 200, 60, 30]);

    写完上述代码之后,可以生成如下效果:

    此时点击“绘图”按钮是不会绘制正弦曲线的。因为此时并未给“绘图”按钮写入回调函数。回调函数定义对象怎样处理信息并响应某事件。回调函数的定义格式为:

    function 函数名(source, eventdata)
    ...
    end

    其中,参数source是发生事件的源控件对象句柄,eventdata存储事件数据。例如,将上例的“绘图”按钮要实现的功能定义为回调函数plot_sin。将回调函数保存在当前文件夹下。

    function plot_sin(source, callbackdata)
    t = -pi : pi/20 : pi; 
    plot(t, sin(t));
    end

    设置“绘图”按钮的Callback属性值是plot_sin函数句柄。完整的代码如下:

    close all; clear; clc; 
    ha = axes('Units', 'pixels', 'Position', [40, 40, 360, 360]); 
    ptgrid = uicontrol('Style', 'pushbutton', ...
        'String', '网格', 'Position', [450, 150, 60, 30], 'Callback', 'grid'); 
    btncla = uicontrol('Style', 'pushbutton', ...
        'String', '清除', 'Position', [450, 100, 60, 30], 'Callback', 'cla');
    btnplot = uicontrol('Style', 'pushbutton', ...
        'String', '绘图', 'Position', [450, 200, 60, 30]);
    btnplot.Callback = @plot_sin;   
    
    %%%%%%%%%%%% btnplot的回调函数 %%%%%%%%%%%%%%%
    function plot_sin(source, callbackdata)
    t = -pi : pi/20 : pi; 
    plot(t, sin(t));
    end

    程序运行之后,上例中的3个按钮可以正常操作。

    3. 菜单对象及其操作

    3.1 建立菜单对象

    用户菜单一般包括一级菜单和二级菜单,每一级菜单又包括若干菜单项。MATLAB提供了uimenu函数用于创建、设置、修改菜单。

    • 建立一级菜单项的函数调用格式为:

    一级菜单项句柄 = uimenu(图形窗口句柄,属性1,属性值1,属性2,属性值2,…)

    • 建立子菜单项的函数调用格式为:

    子菜单项句柄=uimenu(上级菜单项句柄,属性1,属性值1,属性2,属性值2,…)

    3.2 菜单属性

    菜单对象除了具有Children、Parent、Tag等公共属性外,还具有其他一些特殊属性:

    • Label属性:定义菜单项的名字。
    • Accelerator属性:定义菜单项的快捷键。
    • Checked属性:指示菜单项是否已选中。
    • Enable属性:控制菜单项的可选择性。
    • Separator属性:在菜单项上方添加一条分隔线。

    例10:在例9的界面中添加“图形选项”菜单项,其中包括一个二级菜单项“线型”,其下又有3个子菜单项,分别为“实线”、“虚线”、“双划线”。

    close all; clear; clc; 
    ha = axes('Units', 'pixels', 'Position', [40, 40, 360, 360]); 
    ptgrid = uicontrol('Style', 'pushbutton', ...
        'String', '网格', 'Position', [450, 150, 60, 30], 'Callback', 'grid'); 
    btncla = uicontrol('Style', 'pushbutton', ...
        'String', '清除', 'Position', [450, 100, 60, 30], 'Callback', 'cla');
    btnplot = uicontrol('Style', 'pushbutton', ...
        'String', '绘图', 'Position', [450, 200, 60, 30]);
    btnplot.Callback = @plot_sin;   
    
    %%%%%%%%%%% 例10添加的代码 %%%%%%%%%%%%%%%%%%%
    hopt = uimenu(gcf, 'Label', '图形选项', 'Accelerator', 'L'); % hopt是一级菜单句柄
    % gcf获取当前图形窗口的句柄,Label定义菜单项的名字为“图形选项”,Accelerator定义菜单项的快捷键为L
    hLStyle = uimenu(hopt, 'Label', '线型', 'Tag', 'LStyle', 'Enable', 'off'); 
    % hLStyle是子菜单项句柄,Label定义子菜单项的名字为“线型”,Tag定义标签为LStyle,Enable控制菜单项的可选择性
    hL_Solid = uimenu(hLStyle, 'Label', '实线', ...
        'Tag', 'Solid', 'Callback', @MLine_Type);
    hL_Dotted = uimenu(hLStyle, 'Label', '虚线', ...
        'Tag', 'Dotted', 'Callback', @MLine_Type); 
    hL_Dashed = uimenu(hLStyle, 'Label', '双划线', ...
        'Tag', 'Dashed', 'Callback', @MLine_Type); 
    
    %%%%%%%%%%% 定义函数MLine_Type %%%%%%%%%%%%%%%
    function MLine_Type(source, callbackdata)
        hline = findobj('Type', 'line'); % findobj按照指定的属性来获取图形对象的句柄
        if strcmp(source.Tag, 'Solid') == 1  % strcmp函数作用:比较字符串是否相同
            hline.LineStyle = '-';
        elseif strcmp(source.Tag, 'Dotted') == 1
            hline.LineStyle = ':';
        elseif strcmp(source.Tag, 'Dashed') == 1
            hline.LineStyle = '--';
        end
    end
    
    %%%%%%%%%%%% btnplot的回调函数 %%%%%%%%%%%%%%%
    function plot_sin(source, callbackdata)
        t = -pi : pi/20 : pi; 
        plot(t, sin(t));
        h1 = findobj('Tag', 'LStyle'); 
        h1.Enable = 'on'; 
    end

    程序运行后,图形界面的菜单栏将多出“图形选项”菜单项,这是菜单项“线型”处于不可选取的状态。单击“绘图”按钮绘制正弦曲线后,菜单项“线型”变为可选取状态,这是可以改变线型。


    四    用户界面设计工具

    GUIDE: Graphical User Interface Development Environment(图形用户界面开发环境)

    4.1 图形用户界面设计窗口

    4.1.1 打开GUIDE有两种方法:

    • 在MATLAB命令行窗口输入guide命令。
    • 在MATLAB主窗口中选择“主页”选项卡,单击工具栏的“新建”命令按钮,再选择“应用程序(APP)”下的GUIDE命令。

    4.1.2 图形用户界面设计模板

    设计模板有4种,如下图:

    4.1.3 图形用户界面设计窗口

    图形用户界面设计窗口由菜单栏、工具栏、控件选项板、界面设计区、状态栏等部分组成。如下图:

    工具栏中几个按钮的作用:

    • 属性检查器:用于检查/修改对象属性的工具。
    • 菜单编辑器:添加自定义菜单,设置菜单项的属性。
    • 对象浏览器:用于查看图形对象和展示界面的组织架构。

    例11:建立一个图形用户界面,该界面包括1个坐标轴,3个静态文本,3个可编辑文本,2个按钮。还有1个按钮组,里面有两个单选按钮。

    在图形用户界面设计窗口中设计的效果图(自己瞎设计颜色的)如下:

    可在属性编辑器中修改控件对象的属性,修改之后,如下图:

    保存之后,会生成.fig文件,同时系统会自动生成一个同名的.m文件。该.m文件保存了图形窗口的初始化函数,以及各控件对象的回调函数。

    回调属性与回调函数:

    1. 回调属性

    • Callback属性:按钮类控件和菜单项的单击事件的默认回调属性。
    • CreateFcn属性:定义创建图形对象的响应。
    • DeleteFcn属性:定义取消图形对象的响应。
    • ButtonDownFcn属性:定义单击鼠标键按下的响应。
    • KeyPressFcn属性:定义键盘键按下的响应。
    • SelectionChangeFcn属性:定义改变选项的响应。

    2. 回调函数框架

    function 对象标识_Callback(hObject, eventdata, handles)
    

    其中,hObject为发生事件的源控件,eventdata为事件数据,handles保存图形界面中所有对象的句柄。

    例12:在例11的菜单栏添加1个一级菜单项“绘图选项”,而且这个菜单只有在画有曲线时才是可用的。其下有6项,前3项定义线型,后3项定义曲线颜色。

    function varargout = test(varargin)
    % TEST MATLAB code for test.fig
    %      TEST, by itself, creates a new TEST or raises the existing
    %      singleton*.
    %
    %      H = TEST returns the handle to a new TEST or the handle to
    %      the existing singleton*.
    %
    %      TEST('CALLBACK',hObject,eventData,handles,...) calls the local
    %      function named CALLBACK in TEST.M with the given input arguments.
    %
    %      TEST('Property','Value',...) creates a new TEST or raises the
    %      existing singleton*.  Starting from the left, property value pairs are
    %      applied to the GUI before test_OpeningFcn gets called.  An
    %      unrecognized property name or invalid value makes property application
    %      stop.  All inputs are passed to test_OpeningFcn via varargin.
    %
    %      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
    %      instance to run (singleton)".
    %
    % See also: GUIDE, GUIDATA, GUIHANDLES
    
    % Edit the above text to modify the response to help test
    
    % Last Modified by GUIDE v2.5 27-Jul-2018 10:34:37
    
    % Begin initialization code - DO NOT EDIT
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
                       'gui_Singleton',  gui_Singleton, ...
                       'gui_OpeningFcn', @test_OpeningFcn, ...
                       'gui_OutputFcn',  @test_OutputFcn, ...
                       'gui_LayoutFcn',  [] , ...
                       'gui_Callback',   []);
    if nargin && ischar(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
    
    
    % --- Executes just before test is made visible.
    function test_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 test (see VARARGIN)
    
    % Choose default command line output for test
    handles.output = hObject;
    
    % Update handles structure
    guidata(hObject, handles);
    
    % UIWAIT makes test wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
    
    
    % --- Outputs from this function are returned to the command line.
    function varargout = test_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;
    
    
    function editfz_Callback(hObject, eventdata, handles)
    % hObject    handle to editfz (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Hints: get(hObject,'String') returns contents of editfz as text
    %        str2double(get(hObject,'String')) returns contents of editfz as a double
    
    
    % --- Executes during object creation, after setting all properties.
    function editfz_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to editfz (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
    
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
    
    
    function editpl_Callback(hObject, eventdata, handles)
    % hObject    handle to editpl (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Hints: get(hObject,'String') returns contents of editpl as text
    %        str2double(get(hObject,'String')) returns contents of editpl as a double
    
    
    % --- Executes during object creation, after setting all properties.
    function editpl_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to editpl (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
    
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
    
    
    function editxj_Callback(hObject, eventdata, handles)
    % hObject    handle to editxj (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Hints: get(hObject,'String') returns contents of editxj as text
    %        str2double(get(hObject,'String')) returns contents of editxj as a double
    
    
    % --- Executes during object creation, after setting all properties.
    function editxj_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to editxj (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
    
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
    
    
    % --- Executes on button press in pushbutton1.
    function pushbutton1_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    A = str2double(handles.editfz.String); % 幅值
    f = str2double(handles.editpl.String)/50; % 频率
    theta = str2double(handles.editxj.String)/180*pi; % 相角
    x = linspace(0, 2*pi, 60); 
    if handles.OpSin.Value == 1
       y = A*sin(f*x+theta);
    else
       y = A*cos(f*x+theta);
    end
    plot(x, y); 
    handles.PStyle.Enable = 'on';
    
    
    % --- Executes on button press in pushbutton2.
    function pushbutton2_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton2 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    cla; 
    handles.PStyle.Enable = 'off'; 
    
    
    % --------------------------------------------------------------------
    function PStyle_Callback(hObject, eventdata, handles)
    % hObject    handle to PStyle (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    
    % --------------------------------------------------------------------
    function Solid_Callback(hObject, eventdata, handles)
    % hObject    handle to Solid (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    hline = findobj('Type', 'line'); 
    hline.LineStyle = '-'; 
    handles.Solid.Checked = 'on';
    handles.Dotted.Checked = 'off'; 
    handles.Dashed.Checked = 'off'; 
    
    
    % --------------------------------------------------------------------
    function Dotted_Callback(hObject, eventdata, handles)
    % hObject    handle to Dotted (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    hline = findobj('Type', 'line'); 
    hline.LineStyle = ':'; 
    handles.Solid.Checked = 'off';
    handles.Dotted.Checked = 'on'; 
    handles.Dashed.Checked = 'off'; 
    
    
    % --------------------------------------------------------------------
    function Dashed_Callback(hObject, eventdata, handles)
    % hObject    handle to Dashed (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    hline = findobj('Type', 'line'); 
    hline.LineStyle = '--'; 
    handles.Solid.Checked = 'off';
    handles.Dotted.Checked = 'off'; 
    handles.Dashed.Checked = 'on'; 
    
    
    % --------------------------------------------------------------------
    function r_Callback(hObject, eventdata, handles)
    % hObject    handle to r (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    hline = findobj('Type', 'line'); 
    hline.Color = 'r'; 
    handles.r.Checked = 'on'; 
    handles.g.Checked = 'off'; 
    handles.b.Checked = 'off'; 
    
    
    % --------------------------------------------------------------------
    function g_Callback(hObject, eventdata, handles)
    % hObject    handle to g (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    hline = findobj('Type', 'line'); 
    hline.Color = 'g'; 
    handles.r.Checked = 'off'; 
    handles.g.Checked = 'on'; 
    handles.b.Checked = 'off'; 
    
    
    % --------------------------------------------------------------------
    function b_Callback(hObject, eventdata, handles)
    % hObject    handle to b (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    hline = findobj('Type', 'line'); 
    hline.Color = 'b'; 
    handles.r.Checked = 'off'; 
    handles.g.Checked = 'off'; 
    handles.b.Checked = 'on'; 
    


    五    APP设计工具

    这里的APP是指具有图形用户界面的MATLAB程序。APP Designer是一个可视化的集成开发环境,提供了仪表、旋钮等组件,采用面向对象的设计方法。利用APP Designer可以快速开发出应用程序。

    5.1 打开APP Designer

    • 在MATLAB命令行窗口输入appdesigner命令。
    • 在MATLAB主窗口中选择“主页”选项卡,单击工具栏“新建”命令按钮,再选择“应用程序”下的“APP Designer”命令。

    5.2 APP Designer窗口

    APP Designer窗口由3个部分组成,分别是:快速访问工具栏、功能区、APP编辑器。

    5.3 APP编辑器

    • 设计视图:用于编辑用户界面。
    • 代码视图:用于编辑、调试、分析代码。

    例13:建立一个APP用户界面,该界面包括1个坐标轴,2个旋钮,2个按钮和1个按钮组。

    步骤1:打开APP设计器窗口,添加组件

    步骤2:利用属性面板设置组件对象的属性

    步骤3:定义回调函数。在定义回调函数之前,需要补充以下内容:

    APP程序采用面向对象设计模式,声明对象、定义函数、设置属性和共享数据都封装在一个类中,一个MATLAB文件就是一个类的定义。

    (1) 类的基本结构

    • properties段:属性的定义,主要包含属性声明代码。
    • methods段:方法的定义,由若干函数组成。回调函数只有一个参数app,为界面句柄,存储了界面中各个成员的数据。
    classdef 类名 < matlab.apps.AppBase
        properties (Access = public)
            ...
        end
    
        methods (Access = private)
            function 函数1(app)
                ...
            end
            function 函数2(app)
                ...
            end    
        end 
    end

    (2) 访问权限

    存取数据和调用函数称为访问对象成员。

    • public:可用于与App的其他类共享数据。
    • private:只允许在本类中访问。以下属性和函数的默认访问权限为private:属性的声明、界面的启动函数startupFcn、建立界面组件的函数createComponents、回调函数。

    步骤4:将APP程序打包,打包安装之后可以在MATLAB主窗口中APP主页下直接使用该APP程序。

    单击App Designer窗口的“设计器”选项卡工具栏中的“App打包”按钮,弹出“应用程序打包”对话框。

    回到例13中:实现界面的绘图功能。单击“绘图”按钮,以“倍频”旋钮的值和“相角”旋钮的值为三角函数的参数绘制曲线。单击“清空”按钮,清除坐标轴中的图形。

    classdef AppDomo < matlab.apps.AppBase
    
        % Properties that correspond to app components
        properties (Access = public)
            UIFigure     matlab.ui.Figure
            UIAxes       matlab.ui.control.UIAxes
            Label        matlab.ui.control.Label
            Knob         matlab.ui.control.Knob
            ButtonGroup  matlab.ui.container.ButtonGroup
            sinxButton   matlab.ui.control.ToggleButton
            cosxButton   matlab.ui.control.ToggleButton
            Button_2     matlab.ui.control.Button
            Button_3     matlab.ui.control.Button
            Knob_2Label  matlab.ui.control.Label
            Knob_2       matlab.ui.control.DiscreteKnob
        end
    
        methods (Access = private)
    
            % Button pushed function: Button_2
            function Button_2Pushed(app, event)
                f = str2double(app.Knob_2.Value); 
                theta = app.Knob.Value/180*pi; 
                x = linspace(0, 2*pi, 60); 
                if app.sinxButton.Value == 1
                   y = sin(f*x + theta);
                else
                   y = cos(f*x + theta);  
                end
                % plot函数的第1个参数必须是坐标轴对象句柄
                % plot函数默认的线宽是1,APP程序的线宽必须小于0.4
                plot(app.UIAxes, x, y, 'LineWidth', 0.2); 
            end
    
            % Button pushed function: Button_3
            function Button_3Pushed(app, event)
                cla(app.UIAxes); 
            end
        end
    
        % App initialization and construction
        methods (Access = private)
    
            % Create UIFigure and components
            function createComponents(app)
    
                % Create UIFigure
                app.UIFigure = uifigure;
                app.UIFigure.Position = [100 100 640 480];
                app.UIFigure.Name = 'UI Figure';
    
                % Create UIAxes
                app.UIAxes = uiaxes(app.UIFigure);
                title(app.UIAxes, '显示区')
                xlabel(app.UIAxes, 'X')
                ylabel(app.UIAxes, 'Y')
                app.UIAxes.Box = 'on';
                app.UIAxes.Position = [61 239 300 185];
    
                % Create Label
                app.Label = uilabel(app.UIFigure);
                app.Label.HorizontalAlignment = 'center';
                app.Label.Position = [454 265 29 15];
                app.Label.Text = '相角';
    
                % Create Knob
                app.Knob = uiknob(app.UIFigure, 'continuous');
                app.Knob.Limits = [0 360];
                app.Knob.Position = [438 314 60 60];
    
                % Create ButtonGroup
                app.ButtonGroup = uibuttongroup(app.UIFigure);
                app.ButtonGroup.Title = '图形函数';
                app.ButtonGroup.Position = [106 108 123 83];
    
                % Create sinxButton
                app.sinxButton = uitogglebutton(app.ButtonGroup);
                app.sinxButton.Text = 'sin(x)';
                app.sinxButton.Position = [11 30 100 22];
                app.sinxButton.Value = true;
    
                % Create cosxButton
                app.cosxButton = uitogglebutton(app.ButtonGroup);
                app.cosxButton.Text = 'cos(x)';
                app.cosxButton.Position = [11 9 100 22];
    
                % Create Button_2
                app.Button_2 = uibutton(app.UIFigure, 'push');
                app.Button_2.ButtonPushedFcn = createCallbackFcn(app, @Button_2Pushed, true);
                app.Button_2.Position = [271 169 100 22];
                app.Button_2.Text = '绘图';
    
                % Create Button_3
                app.Button_3 = uibutton(app.UIFigure, 'push');
                app.Button_3.ButtonPushedFcn = createCallbackFcn(app, @Button_3Pushed, true);
                app.Button_3.Position = [271 117 100 22];
                app.Button_3.Text = '清空';
    
                % Create Knob_2Label
                app.Knob_2Label = uilabel(app.UIFigure);
                app.Knob_2Label.HorizontalAlignment = 'center';
                app.Knob_2Label.Position = [456 117 29 15];
                app.Knob_2Label.Text = '倍频';
    
                % Create Knob_2
                app.Knob_2 = uiknob(app.UIFigure, 'discrete');
                app.Knob_2.Items = {'0', '1', '2', '3'};
                app.Knob_2.Position = [439 147 60 60];
                app.Knob_2.Value = '0';
            end
        end
    
        methods (Access = public)
    
            % Construct app
            function app = AppDomo
    
                % Create and configure components
                createComponents(app)
    
                % Register the app with App Designer
                registerApp(app, app.UIFigure)
    
                if nargout == 0
                    clear app
                end
            end
    
            % Code that executes before app deletion
            function delete(app)
    
                % Delete UIFigure when app is deleted
                delete(app.UIFigure)
            end
        end
    end


    六    图形用户界面应用举例

    本节介绍一个GUIDE设计实例。

    例14:利用GUIDE设计工具设计如图所示的用户界面。该界面可以显示表面图、网格图、等高线图。绘制图形的功能通过3个命令按钮来实现,绘制图形所需要的数据通过一个列表来选取。方位角和仰角在视点面板中设置,图形使用的色图通过下拉列表进行选择,着色方式通过单选按钮组进行选择。切换按钮用于隐藏或显示坐标轴网格。

    步骤1:打开图形用户界面设计窗口,添加有关图形对象,并保存图形用户界面。

    步骤2:利用属性检查器设置界面对象的属性。

    • String属性:用于指定控件上的文本以及列表框和弹出式菜单的选项。弹出式菜单的选项间使用Enter作为分隔符。
    • Tag属性:定义控件标识。
    • Value属性:设置控件的值。

    本例中按下图方式设置界面对象的属性:(图中静态文本1和静态文本2的String属性分别输入仰角和方位角)

    设置好之后如下图所示:

    步骤3:利用对齐对象工具,调整控件对象的相对位置。

    步骤4:编写代码,实现控件功能。

    (1) .m文件中回调函数的框架

    控件Tag_Call类型(hObject, eventdata, handles)

    其中,hObject是发生事件的源控件,eventdata是事件数据,handles是对象句柄集。

    (2) 跟图形窗口有关的3个函数:

    • _OpeningFcn函数:可以在这个函数内完成数据初始化设置、GUI界面的控制和调整等工作。
    • _OutputFcn函数:用于控制输出运行结果。
    • _Callback函数:用于控制窗口的默认事件,即单击窗口空白区域的触发行为。

    (3) 为图形窗口的打开事件编写响应代码。代码写在_OpeningFcn函数中。

    (4) 为3个绘图按钮编写响应代码。

    (5) 为切换按钮编写响应代码。

    (6) 为列表框编写响应代码。

    (7) 为色图弹出式菜单编写响应代码。

    (8) 为视点设置按钮编写响应代码。

    (9) 为着色方式按钮组ChooseShading的SelectionChanged事件编写响应代码。

    (10) 运行图形用户界面。

    完整效果如下,各功能可用:

    代码如下:

    function varargout = GUIDemo(varargin)
    % GUIDEMO MATLAB code for GUIDemo.fig
    %      GUIDEMO, by itself, creates a new GUIDEMO or raises the existing
    %      singleton*.
    %
    %      H = GUIDEMO returns the handle to a new GUIDEMO or the handle to
    %      the existing singleton*.
    %
    %      GUIDEMO('CALLBACK',hObject,eventData,handles,...) calls the local
    %      function named CALLBACK in GUIDEMO.M with the given input arguments.
    %
    %      GUIDEMO('Property','Value',...) creates a new GUIDEMO or raises the
    %      existing singleton*.  Starting from the left, property value pairs are
    %      applied to the GUI before GUIDemo_OpeningFcn gets called.  An
    %      unrecognized property name or invalid value makes property application
    %      stop.  All inputs are passed to GUIDemo_OpeningFcn via varargin.
    %
    %      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
    %      instance to run (singleton)".
    %
    % See also: GUIDE, GUIDATA, GUIHANDLES
    
    % Edit the above text to modify the response to help GUIDemo
    
    % Last Modified by GUIDE v2.5 06-Aug-2018 10:15:31
    
    % Begin initialization code - DO NOT EDIT
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
                       'gui_Singleton',  gui_Singleton, ...
                       'gui_OpeningFcn', @GUIDemo_OpeningFcn, ...
                       'gui_OutputFcn',  @GUIDemo_OutputFcn, ...
                       'gui_LayoutFcn',  [] , ...
                       'gui_Callback',   []);
    if nargin && ischar(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
    
    
    % --- Executes just before GUIDemo is made visible.
    function GUIDemo_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 GUIDemo (see VARARGIN)
    handles.peaks = peaks(34); 
    handles.membrane = membrane; 
    [x, y] = meshgrid(-8:0.3:8); 
    r = sqrt(x.^2+y.^2); 
    sinc = sin(r)./(r+eps);
    handles.sinc = sinc; 
    handles.current_data = handles.sinc; 
    colormap(spring); 
    grid on; 
    
    % Choose default command line output for GUIDemo
    handles.output = hObject;
    
    % Update handles structure
    guidata(hObject, handles);
    
    % UIWAIT makes GUIDemo wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
    
    
    % --- Outputs from this function are returned to the command line.
    function varargout = GUIDemo_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;
    
    
    % --- Executes on button press in Mesh.
    function Mesh_Callback(hObject, eventdata, handles)
    % hObject    handle to Mesh (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    mesh(handles.current_data); 
    handles.GridSwitch.String = '隐藏网格';
    handles.GridSwitch.Value = 1;
    
    
    % --- Executes on button press in Surf.
    function Surf_Callback(hObject, eventdata, handles)
    % hObject    handle to Surf (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    surf(handles.current_data); 
    handles.GridSwitch.String = '隐藏网格';
    handles.GridSwitch.Value = 1;
    
    
    % --- Executes on button press in Contour3.
    function Contour3_Callback(hObject, eventdata, handles)
    % hObject    handle to Contour3 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    contour3(handles.current_data);
    handles.GridSwitch.String = '隐藏网格';
    handles.GridSwitch.Value = 1;
    
    
    % --- Executes on selection change in ChooseFun.
    function ChooseFun_Callback(hObject, eventdata, handles)
    % hObject    handle to ChooseFun (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    str = hObject.String;
    val = hObject.Value; 
    switch strtrim(str{val}) % strtrim函数用于去除字符串的首尾空格
        case 'Peaks' 
            handles.current_data = handles.peaks; 
        case 'Membrane'
            handles.current_data = handles.membrane;
        case 'Sinc'
            handles.current_data = handles.sinc;
    end
    guidata(hObject, handles); % guidata函数用于保存和更新数据
    
    % Hints: contents = cellstr(get(hObject,'String')) returns ChooseFun contents as cell array
    %        contents{get(hObject,'Value')} returns selected item from ChooseFun
    
    
    % --- Executes during object creation, after setting all properties.
    function ChooseFun_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to ChooseFun (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
    
    % Hint: listbox controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
    
    
    % --- Executes on selection change in ChooseCMap.
    function ChooseCMap_Callback(hObject, eventdata, handles)
    % hObject    handle to ChooseCMap (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    str = hObject.String; 
    cm = hObject.Value; 
    colormap(eval(str{cm})); 
    
    % Hints: contents = cellstr(get(hObject,'String')) returns ChooseCMap contents as cell array
    %        contents{get(hObject,'Value')} returns selected item from ChooseCMap
    
    
    % --- Executes during object creation, after setting all properties.
    function ChooseCMap_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to ChooseCMap (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
    
    % Hint: popupmenu controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
    
    
    % --- Executes on button press in GridSwitch.
    function GridSwitch_Callback(hObject, eventdata, handles)
    % hObject    handle to GridSwitch (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    if hObject.Value == 1
       grid on; 
       hObject.String = '隐藏网格';
    else
       grid off; 
       hObject.String = '显示网格';
    end
    
    % Hint: get(hObject,'Value') returns toggle state of GridSwitch
    
    function edit_el_Callback(hObject, eventdata, handles)
    % hObject    handle to edit_el (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Hints: get(hObject,'String') returns contents of edit_el as text
    %        str2double(get(hObject,'String')) returns contents of edit_el as a double
    
    
    % --- Executes during object creation, after setting all properties.
    function edit_el_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit_el (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
    
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
    
    
    function edit_az_Callback(hObject, eventdata, handles)
    % hObject    handle to edit_az (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Hints: get(hObject,'String') returns contents of edit_az as text
    %        str2double(get(hObject,'String')) returns contents of edit_az as a double
    
    
    % --- Executes during object creation, after setting all properties.
    function edit_az_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit_az (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
    
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
    
    
    % --- Executes on button press in ConfigView.
    function ConfigView_Callback(hObject, eventdata, handles)
    % hObject    handle to ConfigView (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    el = str2double(handles.edit_el.String);
    az = str2double(handles.edit_az.String);
    view(az, el); 
    
    % Hint: get(hObject,'Value') returns toggle state of ConfigView
    
    
    % --- Executes on button press in clear.
    function clear_Callback(hObject, eventdata, handles)
    % hObject    handle to clear (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    axes(handles.axes1); 
    cla reset; 
    grid on; 
    handles.GridSwitch.String = '隐藏网格';
    handles.GridSwitch.Value = 1;
     
    % --- Executes when selected object is changed in ChooseShading.
    function ChooseShading_SelectionChangedFcn(hObject, eventdata, handles)
    % hObject    handle to the selected object in ChooseShading 
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    switch eventdata.NewValue.Tag   % 按钮组中的控件标签
        case 'flat'
            shading flat; 
        case 'interp'
            shading interp;
        case 'faceted'
            shading faceted;
    end
    

     

    展开全文
  • 操作系统用户界面——用户界面

    千次阅读 2019-08-26 13:35:59
    用户界面的概念 定义:OS提供给用户控制计算机的机制,又称用户接口 分类: 操作界面 系统调用(system call,系统功能调用,程序界面) 典型的操作界面 图形界面 命令界面 批处理命令/程序 操作界面 图形...

    用户界面的概念

    定义:OS提供给用户控制计算机的机制,又称用户接口

    分类:

    • 操作界面
    • 系统调用(system call,系统功能调用,程序界面)

     

    典型的操作界面

    • 图形界面
    • 命令界面
    • 批处理命令/程序

    操作界面

    • 图形用户界面(GUI)

                      窗口,图标,菜单,按钮,鼠标(消息,事件)

    • 键盘命令(COMMAND)

                       在控制台环境下接收键盘输入的命令

                        类型:普通命令、批处理程序、shell

    批处理

    • 普通命令的集合,批执行,由command解释执行
    • 支持变量替换、条件、转移、循环、注释等简单语法
    • *.BAT(windows后缀)

     

    shell

    shell是操作系统与用户交互的界面

    表现为通过控制台执行用户命令的方式

    shell本身不执行命令,仅仅是组织和管理命令

     

    Bash为现在主流的shell

    Bash功能

    • 命令行编辑功能
    • 命令和文件名补全功能
    • 命令历史功能
    • 命令别名功能
    • 提供作业控制功能
    • 管道与重定向
    • 具有将命令序列定义为功能键的功能
    • shell脚本编程

     

    shell脚本编程

    脚本(Script)通过类似程序的方式执行具有一定逻辑顺序的命令序列完成较复杂的功能和人机交互。

    • 脚本程序保护在文本文件中
    • 脚本程序是shell命令语句的集合
    • shell脚本程序由shell环境解释执行
    • 执行shell脚本文件需要具有可执行属性:Chmod+x MyScript.sh

    运行方法

    1、直接运行(用缺省版本的shell运行脚本程序)

    2、使用特定版本的shell执行脚本

    3、在脚本文件首行指定shell

    展开全文
  • NSIS教程(3): 现代用户界面(Modern UI)

    万次阅读 2018-01-18 14:19:39
    NSIS的现代用户界面(Modern UI)只是相对于传统(丑陋)的界面而言的“现代”而已。它定义在MUI2.nsh(注:nsh文件类似C++中的头文件,可以被其他模块包含引用)中,如果要使用MUI2界面,则需要包含该文件: !...

    推荐:NSIS-UI-Plugin 开源NSIS UI插件框架,支持任意第三方界面库,默认提供使用Qt作为界面库的安装包示例。

    NSIS的现代用户界面(Modern UI)只是相对于传统(丑陋)的界面而言的“现代”而已。它定义在MUI2.nsh(注:nsh文件类似C++中的头文件,可以被其他模块包含引用)中,如果要使用MUI2界面,则需要包含该文件:

    !include "MUI2.nsh"
    

    MUI2界面和传统界面不同之处在于,传统界面使用的Page(或PageEx)语法来标识显示哪些页面,如:

    PageEx license
        LicenseData "license.rtf"       #可以是txt或rtf文件格式
    PageExEnd
    

    而MUI2使用的是MUI2.nsh中定义的一系列宏来标识显示哪些页面,如:

    !insertmacro MUI_PAGE_LICENSE "license.rtf"
    

    NSIS教程(2): 传统用户界面(Classic UI)类似,这里提供制作网易云音乐的现代用户界面的安装包示例,脚本代码中已经包含了详细的注释。

    高仿网易云音乐安装包脚本

    # ====================== 自定义宏 ==============================
    !define PRODUCT_NAME           "网易云音乐"
    !define EXE_NAME               "cloudmusic.exe"
    !define PRODUCT_VERSION        "1.0.0.1"
    !define PRODUCT_PUBLISHER      "NetEase"
    !define PRODUCT_LEGAL          "NetEase 1999-2014"
    !define TEMP_DIR               ""
    
    
    # ===================== 外部插件以及宏 =============================
    !include "MUI2.nsh"
    
    
    # ===================== 安装包版本 =============================
    VIProductVersion                    "${PRODUCT_VERSION}"
    VIAddVersionKey "ProductVersion"    "${PRODUCT_VERSION}"
    VIAddVersionKey "ProductName"       "${PRODUCT_NAME}"
    VIAddVersionKey "CompanyName"       "${PRODUCT_PUBLISHER}"
    VIAddVersionKey "FileVersion"       "${PRODUCT_VERSION}"
    VIAddVersionKey "InternalName"      "${EXE_NAME}"
    VIAddVersionKey "FileDescription"   "${PRODUCT_NAME}"
    VIAddVersionKey "LegalCopyright"    "${PRODUCT_LEGAL}"
    
    # ==================== NSIS属性 ================================
    # ZLIB(默认) BZIP2 LZMA 
    SetCompressor lzma
    
    ; 安装包名字.
    Name "${PRODUCT_NAME}"
    
    # 安装程序文件名.
    OutFile "网易云音乐安装0.exe"
    
    # 默认安装位置.
    InstallDir "$PROGRAMFILES\Netease\CloudMusic"
    
    
    # 设置是否显示安装详细信息。
    ShowInstDetails hide
    
    # 设置是否显示卸载详细信息
    ShowUnInstDetails   hide
    
    # 针对Vista和win7 的UAC进行权限请求.
    # RequestExecutionLevel none|user|highest|admin
    RequestExecutionLevel admin
    
    
    # ==================== MUI属性 ==================================
    # 安装和卸载程序图标
    !define MUI_ICON              "image\logo.ico"
    !define MUI_UNICON            "image\un_logo.ico"
    
    
    # 如果未使用MUI,则可直接使用.onGUIInit
    !define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit
    
    
    # 安装程序欢迎页面
    !insertmacro MUI_PAGE_WELCOME
    
    # 安装程序软件授权申明页面
    !insertmacro MUI_PAGE_LICENSE "license.rtf"
    
    
    # 安装程序显示安装目录选择页面
    !insertmacro MUI_PAGE_DIRECTORY
    
    # 安装程序显示安装组件选择页面
    !insertmacro MUI_PAGE_COMPONENTS
    
    # 安装程序显示进度页面
    !insertmacro MUI_PAGE_INSTFILES
    
    # 安装程序显示安装结束页面
    !insertmacro MUI_PAGE_FINISH
    
    
    # 卸载程序显示进度
    !insertmacro MUI_UNPAGE_INSTFILES
    
    # 卸载程序显示安装结束
    !insertmacro MUI_UNPAGE_FINISH
    
    # 指定语言,必须在最后指定
    !insertmacro MUI_LANGUAGE "SimpChinese"
    
    
    # ========================= 安装步骤 ===============================
    
    # 区段1
    # 区段名以一个 ! 开头,那么该区段的显示名称将以粗体字显示.
    Section "!Files" "des_files"
    
      ; 设置文件的输出路径
      SetOutPath $INSTDIR
      
      ; 放置文件
      File /r "app\*.*"
      
    SectionEnd
    
    
    # 区段2
    Section "Shortcut" "des_shortcut"
      SetShellVarContext all
      CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
      CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\${EXE_NAME}"
      CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\卸载${PRODUCT_NAME}.lnk" "$INSTDIR\uninst.exe"
      SetShellVarContext current
    SectionEnd
    
    
    # 区段3
    # 区段名为空、遗漏或者以一个 "-" 开头,那么它将是一个隐藏的区段,用户也不能选择禁止它.
    Section "-Necessary"
    
    	# 生成卸载程序
    	WriteUninstaller "$INSTDIR\uninst.exe"
    	
    	# 添加卸载信息到控制面板
    	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "DisplayName" "${PRODUCT_NAME}"
    	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "UninstallString" "$INSTDIR\uninst.exe"
    	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "DisplayIcon" "$INSTDIR\${EXE_NAME}"
    	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "Publisher" "$INSTDIR\${PRODUCT_PUBLISHER}"
    SectionEnd
    
    
    # 卸载区段
    Section "Uninstall"
    
      ; 删除快捷方式
      SetShellVarContext all
      Delete "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk"
      Delete "$SMPROGRAMS\${PRODUCT_NAME}\卸载${PRODUCT_NAME}.lnk"
      RMDir "$SMPROGRAMS\${PRODUCT_NAME}\"
      Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
      SetShellVarContext current
      
      SetOutPath "$INSTDIR"
    
      ; 删除安装的文件
      Delete "$INSTDIR\*.*"
    
      SetOutPath "$DESKTOP"
    
      RMDir /r "$INSTDIR"
      RMDir "$INSTDIR"
      
      SetAutoClose true
    SectionEnd
    
    
    # 区段描述
    !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
      !insertmacro MUI_DESCRIPTION_TEXT ${des_files}     "主程序文件"
      !insertmacro MUI_DESCRIPTION_TEXT ${des_shortcut}  "创建开始菜单和桌面快捷方式"
    !insertmacro MUI_FUNCTION_DESCRIPTION_END
    
    # ============================== 回调函数 ====================================
    
    # 函数名以“.”开头的一般作为回调函数保留.
    # 函数名以“un.”开头的函数将会被创建在卸载程序里,因此,普通安装区段和函数不能调用卸载函数,而卸载区段和卸载函数也不能调用普通函数。
    
    Function .onInit
    FunctionEnd
    
    Function onGUIInit
    
    FunctionEnd
    
    
    # 安装成功以后.
    Function .onInstSuccess
    
    FunctionEnd
    
    
    # 卸载操作开始前.
    Function un.onInit
        MessageBox MB_ICONQUESTION|MB_YESNO "你确实要完全删除网易云音乐,及其所有组件吗?" /SD IDYES IDYES +2 IDNO +1
        Abort
    FunctionEnd
    
    # 卸载成功以后.
    Function un.onUninstSuccess
        MessageBox MB_ICONINFORMATION|MB_OK "${PRODUCT_NAME} 已成功地从你的计算机移除" /SD IDOK
    FunctionEnd
    

    运行效果

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    完整示例下载地址:http://download.csdn.net/download/china_jeffery/10212034

    参考手册:

    《NSIS用户手册 中文版》
    另外,关于Modern UI的详细教程见《NSIS图文教程集锦 - 轻狂志》的“Modern UI 教程”节。

    推荐:NSIS-UI-Plugin 开源NSIS UI插件框架,支持任意第三方界面库,默认提供使用Qt作为界面库的安装包示例。

    展开全文
  • NSIS教程(2): 传统用户界面(Classic UI)

    万次阅读 2018-01-18 13:48:05
    本文以一个完整的、传统界面的网易云音乐安装包的脚本为示例,来介绍NSIS传统用户界面的开发流程。 NSIS脚本 # 单行注释用井号"#"或分号";",跨行注释用可以用C/C++中注释语法。 # 使用!define定义一些常量(如...

    推荐:NSIS-UI-Plugin 开源NSIS UI插件框架,支持任意第三方界面库,默认提供使用Qt作为界面库的安装包示例。

    NSIS教程:
    《NSIS用户手册 中文版》
    《NSIS图文教程集锦 - 轻狂志》

    本文以一个完整的、传统界面的网易云音乐安装包的脚本为示例,来介绍NSIS传统用户界面的开发流程。

    NSIS脚本

    # 单行注释用井号"#"或分号";",跨行注释用可以用C/C++中注释语法。
    # 使用!define定义一些常量(如安装包的版本号等)
    # 对常量或变量的引用可以使用如${PRODUCT_NAME}格式,也可以使用如$PRODUCT_NAME格式
    
    !define PRODUCT_NAME           "网易云音乐"
    !define EXE_NAME               "cloudmusic.exe"
    !define PRODUCT_VERSION        "1.0.0.1"
    !define PRODUCT_PUBLISHER      "NetEase"
    !define PRODUCT_LEGAL          "NetEase 1999-2014"
    !define TEMP_DIR               ""
    
    /*
    NSIS内置了一些常用的变量,如
    $INSTDIR 表示用户定义的解压路径;
    $DESKTOP 表示Windows桌面目录;
    等等。
    
    
    也可以用 Var 命令来声明自己的变量($VARNAME)。 NSIS的变量都是全局的并且可以在任何区段或函数中使用。
    另外堆栈可以用来作为临时存储。 使用 Push 和 Pop 命令来访问堆栈。Push把一个值添加到堆栈,Pop移除一个值并且设置该变量。 
    且NSIS内置了20个已注册的变量 (如 $0~$9 和 $R0~$R9)。 这些变量不需要声明就可以使用。
    */
    
    # 定义安装包可执行文件的版本信息
    VIProductVersion                    "${PRODUCT_VERSION}"
    VIAddVersionKey "ProductVersion"    "${PRODUCT_VERSION}"
    VIAddVersionKey "ProductName"       "${PRODUCT_NAME}"
    VIAddVersionKey "CompanyName"       "${PRODUCT_PUBLISHER}"
    VIAddVersionKey "FileVersion"       "${PRODUCT_VERSION}"
    VIAddVersionKey "InternalName"      "${EXE_NAME}"
    VIAddVersionKey "FileDescription"   "${PRODUCT_NAME}"
    VIAddVersionKey "LegalCopyright"    "${PRODUCT_LEGAL}"
    
    # ==================== NSIS属性 ================================
    # 设置安装包的压缩方案,有ZLIB(默认)、BZIP2、LZMA 
    SetCompressor lzma
    
    ; 设置安装包名字,显示在安装包标题栏等位置
    Name "$PRODUCT_NAME"
    
    # 安装包可执行程序文件名
    OutFile "网易云音乐安装-Basic UI.exe"
    
    # 安装包默认安装位置,也就是安装路径的默认值
    InstallDir "$PROGRAMFILES\Netease\CloudMusic"
    
    
    # 设置是否显示安装详细信息
    ShowInstDetails hide
    
    # 设置是否显示卸载详细信息
    ShowUnInstDetails   hide
    
    # 针对Vista和win7 的UAC进行权限请求.
    # RequestExecutionLevel none|user|highest|admin
    RequestExecutionLevel admin
    
    
    # 安装和卸载程序的图标
    Icon             "image\logo.ico"
    UninstallIcon    "image\un_logo.ico"
    
    
    /*
    向导页面是NSIS安装程序中最重要的界面元素,在nsis脚本中可以使用NSIS内置页面或者定制界面,
    通过脚本可以指定页面的顺序、显示样子和行为。 PageEx指令用来定义安装程序中的页面,也可以使用Page指令,但PageEx提供更多选项;UninstPage用来定义卸载页面。
    页面显示的顺序和它在nsis脚本中定义的次序一致。
    
    安装页面有:license|components|directory|instfiles|
    卸载页面有:uninstConfirm
    
    每个页面有不同元素和属性。
    也可以使用Page custom来自定义页面,这个后面的文章有讲到。
    */
    
    PageEx license
        LicenseData "license.rtf"       #可以是txt或rtf文件格式
    PageExEnd
    
    
    /* 
    在一个普通的安装包里用户需要安装许多东西。例如在NSIS安装包里你可以选择安装源码、附加插件、脚本样例或其他。
    里面的每个组件都有它自己的代码块,当用户选择了安装该组件,那么安装程序就会执行对应的代码。
    在脚本里,这些代码称为区段,见下面的Section。每个可见的区段都可以作为一个组件给用户选择是否安装。你可以只使用一个区段来构建安装包,但是如果你想要使用组件页来让用户选择可选的组件,那你就需要使用多个区段。 
    */
    PageEx components
        Caption "组件选择"
        ComponentText "选择安装组件:" "主程序" "快捷方式"
    PageExEnd
    
    PageEx directory
        Caption "安装目录"
        DirText "请选择安装目录:"
    PageExEnd
    
    PageEx instfiles
    PageExEnd
    
    
    # 区段1
    # 区段名以一个!开头,那么该区段的显示名称将以粗体字显示.
    Section "!Files" "des_files"
    
      ; 设置下面指定的文件在安装时默认的解压路径
      SetOutPath $INSTDIR
      
      ; 指明哪些文件需要被压缩进入安装包,"app\*.*"是相对于nsis脚本文件的相对路径
      File /r "app\*.*"
      
    SectionEnd
    
    
    # 区段2
    # 该区段专门用来创建一些快捷方式
    #
    Section "Shortcut" "des_shortcut"
      SetShellVarContext all
      CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
      CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\${EXE_NAME}"
      CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\卸载${PRODUCT_NAME}.lnk" "$INSTDIR\uninst.exe"
      SetShellVarContext current
    SectionEnd
    
    
    # 区段3
    # 区段名为空、遗漏或者以一个 "-" 开头,那么它将是一个隐藏的区段,用户也不能选择禁止它.
    #
    Section "-Necessary"
    
    	# 生成卸载程序
    	WriteUninstaller "$INSTDIR\uninst.exe"
    	
    	# 添加卸载信息到控制面板
    	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "DisplayName" "${PRODUCT_NAME}"
    	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "UninstallString" "$INSTDIR\uninst.exe"
    
    	/*
    	在NSIS脚本里每一行都作为一个命令处理,如果这一行太长的话你可以使用“\”来分隔,编译器会自动地把下一行接到上一行来作为完整的一行,而不是看作新的行。
    	*/
    	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "DisplayIcon" "$INSTDIR\${EXE_NAME}"
    	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "Publisher" "$INSTDIR\${PRODUCT_PUBLISHER}"
    SectionEnd
    
    
    # 卸载区段,如果一个区段名为“Uninstall”或以“un.”为前缀,那么它就是一个卸载程序区段。 
    #
    Section "Uninstall"
    
      ; 删除快捷方式,SetShellVarContext 设置操作是针对当前用户还是所有用户
      SetShellVarContext all
      Delete "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk"
      Delete "$SMPROGRAMS\${PRODUCT_NAME}\卸载${PRODUCT_NAME}.lnk"
      RMDir "$SMPROGRAMS\${PRODUCT_NAME}\"
      Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
      SetShellVarContext current
      
      SetOutPath "$INSTDIR"
    
      ; 删除安装的文件
      Delete "$INSTDIR\*.*"
    
      SetOutPath "$DESKTOP"
    
      RMDir /r "$INSTDIR"
      RMDir "$INSTDIR"
      
      SetAutoClose true
    SectionEnd
    
    
    # ============================== 回调函数 ====================================
    
    # 函数名以“.”开头的一般作为回调函数保留.
    # 函数名以“un.”开头的函数将会被创建在卸载程序里,因此,普通安装区段和函数不能调用卸载函数,而卸载区段和卸载函数也不能调用普通函数。
    
    Function .onInit
    FunctionEnd
    
    Function .onGUIInit
    
    FunctionEnd
    
    
    # 安装成功以后.
    Function .onInstSuccess
    
    FunctionEnd
    
    
    # 卸载操作开始前.
    Function un.onInit
        MessageBox MB_ICONQUESTION|MB_YESNO "你确实要完全删除网易云音乐,及其所有组件吗?" /SD IDYES IDYES +2 IDNO +1
        Abort
    FunctionEnd
    
    # 卸载成功以后.
    Function un.onUninstSuccess
        MessageBox MB_ICONINFORMATION|MB_OK "${PRODUCT_NAME} 已成功地从你的计算机移除" /SD IDOK
    FunctionEnd
    
    

    运行效果

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    完整的示例(包含图标、license.rtf等文件)下载地址:
    http://download.csdn.net/download/china_jeffery/10211945

    展开全文
  • 用户界面设计

    千次阅读 2018-09-17 17:29:00
    用户界面是适应人的需要而建立的,因此,首先要弄清将要使用这个界面的用户类型。 ●用户特性分析的目的是要详细了解所有的用户的技能和经验,一遍能够预测用户对不同界面设计会做出什么反应,这样在更改界面时,...
  • 1.用户界面原理和界面库编程模型

    千次阅读 2018-07-26 20:51:01
    从最早的图形用户界面操作系统Apply Lisa,到空前的windows 1.0,再到最新的Windows、苹果、Linux操作系统,图形用户界面已经是个人电脑不可缺少的部分。图形用户界面的发展是建立在成熟的图形学基础上的,本系列...
  • 简述图形用户界面

    千次阅读 2019-04-14 18:11:35
    图形用户界面设计是程序设计的重要组成部分,界面设计的功能性、简洁性、方便性、友好性是衡量一个应用程序实现人机交互能力的重要指标。Java语言提供了丰富的组件来完成界面设计,并通过事件机制实现功能处理。 一...
  • java图形用户界面基础

    万次阅读 多人点赞 2016-11-26 21:27:52
    Swing和AWT介绍java的时候,将图形用户界面相关类捆绑在一起,放在一个称为抽象窗口工具箱(Abstract Window Toolkit,AWT)的库中。AWT适合开发简单的图形用户界面,但并不适合开发复杂的GUI项目。除此之外,AWT更容易...
  • 操作系统用户界面

    千次阅读 2017-03-19 20:43:56
    1、用户界面负责用户与操作系统之间的交互。即用户通过用户界面向计算机系统提交服务需求,计算机通过用户界面向用户提供所需的服务。2、一般来说,计算机系统的用户有两类:一类是使用和管理计算机应用程序的用户,...
  • Python中用户界面设计(GUI)

    千次阅读 多人点赞 2020-06-27 22:07:47
    图形用户界面是一种人与计算机通信的界面显示格式,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,已选择命令调用文件过执行其它一些日常任务与通过键盘输入文本或字符命令来完成例行任务的字符界面相比,...
  • Centos7命令行安装图形用户界面

    万次阅读 多人点赞 2018-03-03 22:17:34
    安装完成Centos7后,重启后发现是命令行界面,于是就想改成图形用户界面。安装了图形用户界面的话:1. 查看系统里是否已经安装了图形用户界面。使用ctrl+alt+fx,x为1234,都试试,看看是否能切换为图形用户界面。我...
  • Android用户界面设计

    万次阅读 2017-01-10 11:20:20
    Android用户界面设计 用户界面设计是Android应用开发的一项重要内容。在进行开发的过程中,我们需要了解UI元素如何呈现给用户,也就是如何控制UI界面。andorid提供了4种控制UI的方法。 一、控制UI布局 使用xml布局...
  • 好的用户界面-界面设计的一些技巧

    千次阅读 2017-12-13 14:59:15
    好的用户界面-界面设计的一些技巧
  • 一个网站好不好,首先要有好的用户界面设计,才能吸引得住用户,就像看美女一个意思。白话不扯了,看下面干货。1 尽量使用单列而不是多列布局单列布局能够让对全局有更好的掌控。同...
  • Java 图形用户界面编程

    千次阅读 多人点赞 2019-03-27 14:03:29
    要进行Java的图形用户界面编程就需要学习Java的API,即Application Programming Interface——应用程序编程接口,是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又...
  • GO-图形用户界面

    千次阅读 2018-09-17 08:29:56
    图形用户界面1:初识Walk Go与GUI——GO语言的图形界面Walk GO没有原生的界面库,所以不能直接用来写GUI界面。但最近互联网上已经涌现出不少成熟、好用的第三方界面库。使用它们,就同样可以写出同C#、C++的界面。...
  • 用户界面设计要素

    千次阅读 2016-12-25 18:36:12
    用户界面(UI)设计当中,预测用户可能会有哪些操作,并确保界面有易于访问、理解和使用的元素,从而方便执行这些操作是我们要考虑的重点之一。 在用户已经熟悉以某种方式操作的界面元素的情况下,应使其布局中保持...
  • 用户选项和设置用户界面

    千次阅读 2015-05-23 20:13:35
    Android提供了一套现成的Activity和Fragment类,使得创建这类用户界面非常容易:preferenceActivity和preferenceFragment。 首先在XML资源目录下创建XML文件,并在开头使用PreferenceScreen语法。该XML的结构很简单...
  • 美团App用户界面分析

    千次阅读 2018-11-13 16:13:00
    关于美团 美团网成立于2010年,合并前是...美团 App 用户界面分析 测试版本 V5.3 测试机型 iPhone6 (64GB) 测试时间 Jun,2015 导航界面分析 用户启动美团 App 后,进入后看见的便是美团 App 的首页(...
  • Java_图形用户界面(AWT)

    千次阅读 2019-02-02 09:21:20
    AWT(抽象窗口工具包)是JAVA提供的建立图形用户界面GUI的开发包,可用于JAVA的Applet和Application中 —————————————— 组件,容器,布局管理器 JAVA.awt包 JAVA.awt包提供了设计GUI使用的类和接口 ...
  • MongoDb web 用户界面

    千次阅读 2016-01-28 00:14:06
    MongoDB 提供了简单的 HTTP 用户界面。 如果你想启用该功能,需要在启动的时候指定参数 --rest 。 $ ./mongod --dbpath=/data/db --rest MongoDB 的 Web 界面访问端口比服务的端口多1000。 如果你的MongoDB...
  • Jupyter Notebook服务器启动后,会启动Jupyter Notebook的用户界面(网站)。 Jupyter Notebook的用户界面分为两个部分: 仪表盘(Dashboard):即Jupyter Notebook服务器启动后打开的默认WEB界面,可以理解为...
  • Python实现简易图形用户界面计算器

    千次阅读 2020-02-16 19:47:36
    基于tkinter的简易图形用户界面计算器的设计和实现,帮着读者深入了解图形界面的应用程序的开发流程
  • 友好用户界面--界面设计技巧

    万次阅读 热门讨论 2014-02-18 14:50:53
     原英文页面《A good User Interface》,原中文译文页面《好的用户界面-界面设计的一些技巧》  一个友好的用户界面具有较高转化效率,并且简单易用。换句话说,无论是企业方面还是其他人都能很好的使用它。这里...
  • Ubuntu18.04在图形用户界面下移动文件到本地目录时是不会发生错误的, 但是当移动文件到位于本机计算机的目录下时会发生错误提示:权限不够。 解决方法:在终端下打开一个具有管理员权限的文件管理器进行文件...
  • 作者:郭孝星 微博:郭孝星的新浪微博 ...Github:https://github.com/AllenWells用户界面架构如下所示:窗口结构ViewRootImpl:虚拟根View,用来控制窗口渲染,以及与WindowManagerService和SurfaceFlinger通信
  • 【python】图形用户界面简单了解

    千次阅读 2018-06-17 22:04:09
    【python】图形用户界面简单了解 背景说明 语言:python 博主操作系统:windows10 图形用户界面(Graphical User Interface)博主的理解是:就是那些带有按钮,文本,输入框的窗口的编程。 对于处理图形用户界面...
  • 几款流行的SQLite图形用户界面工具

    万次阅读 2019-01-09 10:54:24
    您是否在寻找一个用于管理SQLite数据库的图形用户界面(GUI)工具?下面是一些流行的SQLite GUI工具列表。 SQLite Database Browser SQLite Database browser 是一个免费、开源的SQLite 数据库的轻量级 GUI 客户端...
  • Mac编程之用户界面

    千次阅读 2015-11-15 22:14:23
    Xcode提供两种方式来保存用户界面: .xib文件 .storyboard文件 一个.xib文件通常包含一个单独的窗口(window)或者用户界面上的一个视图(view)。.storyboard文件包含一个或多个视图或者segues,这里的视图代表一个窗口...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 204,465
精华内容 81,786
关键字:

用户界面