matlabGUI学习笔记6

uicontrol 函数基础已经看完,下面看figure函数,创建图窗窗口。

figure

创建图窗窗口

语法:

figure 以默认属性值创建一个新的图窗窗口。生成的图窗为当前图窗。
figure(name,value) 使用一个或多个名称-值 对组参数 修改图窗的属性。例如,figure(‘Color’,‘white’) 将背景色设置为白色。
f = figure( ___) 返回 Figure 对象。可使用 f 在创建图窗后查询或修改其属性。

figure(f) 将 f 指定的图窗作为当前图窗,并将其显示在其他所有图窗的上面。
figure(n) 查找 Number 属性等于 n 的图窗,并将其作为当前图窗。如果不存在具有该属性值的图窗,MATLAB将创建一个新图窗并将其 Number 属性设置为 n。

输入参数:

1,f-目标图窗
figure对象

2,n-目标图窗编号
整数标量

3,名称-值 对组参数:

‘Number’ - 数值
整数 | []

此属性为只读,图窗的编号,以整数或空数组形式返回。

‘Name’ - 名称
‘’ (默认) | 字符向量 | 字符串标量

‘Color’ - 背景色
RGB 三元组 | ‘r’ | ‘g’ | ‘b’ | …

背景色,指定为 RGB 三元组或下表中列出的颜色选项之一。如果指定 ‘none’,背景色将在屏幕上显示为黑色,但如果您打印图窗,则会将图窗窗口视为透明而打印背景。

‘Position’ - 可绘制区域的位置和大小
[left bottom width height]

可绘制区域的位置和大小,指定为 [left bottom width height] 形式的向量。此区域不包括图窗边框、标题栏、菜单栏和工具栏。

‘Units’ - 测量单位
‘pixels’ (默认) | ‘normalized’ | ‘inches’ | ‘centimeters’ | ‘points’ | ‘characters’

如果您在 Position 属性之前指定 Units,则 MATLAB 会使用您指定的单位来设置 Position。
如果您在 Position 属性之后指定 Units 属性,则 MATLAB 会使用默认的 Units 来设置 position。然后,MATLAB 将 Position 值转换为以您指定的单位表示的等价值。

详细信息

当前图窗是图形命令(如 axes 和 colormap)的目标。通常情况下,它是最后创建的或最后用鼠标点击的图窗。gcf 命令返回当前图窗。

figure属性

窗口外观
不重要

位置

Position - 可绘制区域的位置和大小
[left bottom width height]

Units - 测量单位
‘pixels’ (默认) | ‘normalized’ | ‘inches’ | ‘centimeters’ | ‘points’ | ‘characters’

InnerPosition - 可绘制区域的位置和大小
[left bottom width height]

OuterPosition - 外部边界的位置和大小
[left bottom width height]

Resize - 可调整大小
‘on’ (默认) | ‘off’

绘图

Colormap - 图窗坐标区内容的颜色图
parula (默认) | 由 RGB 三元组组成的 m×3 数组

Alphamap - Axes 内容的透明度映射
由从 0 到 1 的 64 个值组成的数组 (默认) | 由从 0 到 1 的有限 alpha 值组成的数组

NextPlot - 有关如何添加下一绘图的指令
‘add’ (默认) | ‘new’ | ‘replace’ | ‘replacechildren’

。。。这些在添加新图窗时用到,我目前还用不到这么多功能,就略过,详情查看matlab文档figure属性

回调属性

ButtonDownFcn - 按钮按下回调
‘’ (默认) | 函数句柄 | 元胞数组 | 字符向量

只要用户点击图窗中的空白区域,就会执行此回调。

CreateFcn - 组件创建函数
‘’ (默认) | 函数句柄 | 元胞数组 | 字符向量

此属性指定要在 MATLAB 创建组件时执行的回调函数。
MATLAB 将在执行 CreateFcn 回调之前初始化所有的组件属性值。如果不指定 CreateFcn 属性,则 MATLAB 执行默认的创建函数。可在您的 CreateFcn 代码中使用 gcbo 函数获取要创建的组件对象。

DeleteFcn - 组件删除函数
‘’ (默认) | 函数句柄 | 元胞数组 | 字符向量

DeleteFcn 属性指定要在 MATLAB 删除组件时(例如,当用户关闭窗口时)执行的回调函数。MATLAB 会在销毁组件对象的属性之前执行 DeleteFcn 回调。

还有键盘回调,窗口回调等,请自行查看,同样的还有回调执行控件和父级/子级概念。

标识符

标识符,要在茫茫控件海洋中找到你可就靠它了。

Name - 名称
‘’ (默认) | 字符向量 | 字符串标量

Number - 数值
整数 | []

只读,
图窗的编号,以整数或空数组形式返回。您可以使用该值表示图窗。例如,figure(2) 使 Number 属性值为 2的图窗成为当前图窗。

NumberTitle - 使用带编号的标题
‘on’ (默认) | ‘off’

IntegerHandle - 使用整数句柄
‘on’ (默认) | ‘off’

FileName - 文件名
字符向量 | 字符串标量

Type - Figure 对象的类型
‘figure’
只读

Tag - Figure 标识符
’ ’ (默认) | 字符向量

UserData - 用户数据
[] (默认) | 数组

很重要的标识符已加粗

关于图形对象,matlab专门仔细介绍了图形对象的查找,复制,删除操作,如何实现呢?

对图形对象进行操作的函数,自己help文档吧
这一部分是之前我说看过的matlabGUI设计手册中的句柄部分介绍的,终究还是要看的啊,借助书来看其知识结构会更加清晰,推荐MatlabGUI设计手册,系统翻阅一下那一章就好了,用到再仔细看怎么用。

给出书上的截图喽

结构感觉清晰多了
最开始我看的uicontrol就是UI控件吧,然后今天看了figure对象,也就是图形窗口,还有面板与按钮组,菜单,表格等没看,不过应该和uicontrol(UI控件)大同小异吧,基础属性都差不多,那也就没必要像UI控件一样一行一行看了,需要用到再仔细查阅,现在的知识已经可以做很多事了,所以当下最重要的就是图形对象的查询,复制删除操作了,不过这个先放在一边,因为此刻我有更感兴趣的事:不同图形对象也好,不同控件也罢,他们之间究竟如何传递数据呢?global固然可以,但有没有其他方法,如果我要做一个计算,调用了比如说之前的那个计算器,计算结果难道就放在string中吗???显然不合理,那么这样一个对象是如何让用户更方便地使用这个“子程序”(我也不确定能不能说成子程序)呢?

所以我决定仔细看一下回调间的数据是如何传递的。

matlab文档中给出了4种方法,下面一起看一看:

在 UserData 或其他对象属性中存储数据

UI 组件在其属性中包含了有用的信息。例如,可以通过查询滑块的 Value 属性来查找滑块的当前位置。此外,所有组件都有 UserData 属性,其中可存储任意 MATLAB 变量。所有回调函数只要能够访问组件,就能访问存储在 UserData 属性中的值。(抱歉收回刚才的话,还真可以放在string中)。注意一下,我采用的是编程实现GUI,所以guide中如何实现我是不会看的,要想看这部分在matlab文档中搜索在 GUIDE App 中共享 UserData

在以编程方式创建的 App 中共享 UserData

使用圆点表示法 component.propertyname 以编程方式获取或设置属性值。
如果您的代码没有组件的直接访问权限,请使用 findobj 函数来搜索该组件。如果搜索成功,findobj 将会返回该组件作为输出。然后您就可以访问该组件的属性。

直接使用matlab给的实例:

function my_slider()
hfig = figure();
slider = uicontrol('Parent', hfig,'Style','slider',...
         'Units','normalized',...
         'Position',[0.3 0.5 0.4 0.1],...
         'Tag','slider1',...
         'UserData',struct('val',0,'diffMax',1),...
         'Callback',@slider_callback);
     
button = uicontrol('Parent', hfig,'Style','pushbutton',...
         'Units','normalized',...
         'Position',[0.4 0.3 0.2 0.1],...
         'String','Display Difference',...
         'Callback',@button_callback);
end
function slider_callback(hObject,eventdata)
	sval = hObject.Value;
	diffMax = hObject.Max - sval;
	data = struct('val',sval,'diffMax',diffMax);
	hObject.UserData = data;
	% For R2014a and earlier: 
	% sval = get(hObject,'Value');  
	% maxval = get(hObject,'Max');  
	% diffMax = maxval - sval;      
	% data = struct('val',sval,'diffMax',diffMax);   
	% set(hObject,'UserData',data);   

end
function button_callback(hObject,eventdata)
	h = findobj('Tag','slider1');
	data = h.UserData;
	% For R2014a and earlier: 
	% data = get(h,'UserData'); 
	display([data.val data.diffMax]);
end

示例图好像挺简单的,之前只用guide时太懒了。。。啥都不仔细看,鼓捣一个星期还是那么垃圾。。。

将数据存储为应用程序数据

要存储应用程序数据,请调用 setappdata 函数:
setappdata(obj,name,value);
第一个输入 obj 是用于存储数据的组件对象。
第二个输入 name 是描述值的友好名称。
第三个输入 value 是需要存储的值。

要检索应用程序数据,请使用 getappdata 函数:
data = getappdata(obj,name);
组件 obj 必须是包含数据的组件对象。
第二个输入 name 必须与用于存储数据的名称相匹配。
UserData 属性仅保存一个变量,而使用 setappdata 可以存储多个变量。

在以编程方式创建的 App 中共享应用程序数据

function my_slider()
hfig = figure();
setappdata(hfig,'slidervalue',0);
setappdata(hfig,'difference',1);

slider = uicontrol('Parent', hfig,'Style','slider',...
         'Units','normalized',...
         'Position',[0.3 0.5 0.4 0.1],...
         'Tag','slider1',...
         'Callback',@slider_callback);
     
button = uicontrol('Parent', hfig,'Style','pushbutton',...
         'Units','normalized',...
         'Position',[0.4 0.3 0.2 0.1],...
         'String','Display Values',...
         'Callback',@button_callback);
end

function slider_callback(hObject,eventdata)
	diffMax = hObject.Max - hObject.Value;
	setappdata(hObject.Parent,'slidervalue',hObject.Value);
	setappdata(hObject.Parent,'difference',diffMax);
	% For R2014a and earlier: 
	% maxval = get(hObject,'Max');  
	% currval = get(hObject,'Value');  
	% diffMax = maxval - currval;   
	% parentfig = get(hObject,'Parent');  
	% setappdata(parentfig,'slidervalue',currval); 
	% setappdata(parentfig,'difference',diffMax); 
end

function button_callback(hObject,eventdata)
	currentval = getappdata(hObject.Parent,'slidervalue');
	diffval = getappdata(hObject.Parent,'difference');
	% For R2014a and earlier:
	% parentfig = get(hObject,'Parent');
	% currentval = getappdata(parentfig,'slidervalue');
	% diffval = getappdata(parentfig,'difference');

	display([currentval diffval]);
end

同样的工作,不同的实现方式。不过userdata只能存储一个变量,而这个你爱设几个设几个喽,各有千秋吧。

创建嵌套的回调函数(编程式 App)

您可以在编程式 App 的主函数内嵌套回调函数。这样做时,嵌套的回调函数将会与主函数共享工作区。因此,嵌套的函数可以访问在主函数中定义的所有 UI 组件和变量。以下示例代码使用嵌套的函数共享关于滑块位置的数据。

function my_slider()
	hfig = figure();
	data = struct('val',0,'diffMax',1);
	slider = uicontrol('Parent', hfig,'Style','slider',...
         'Units','normalized',...
         'Position',[0.3 0.5 0.4 0.1],...
         'Tag','slider1',...
         'Callback',@slider_callback);
     
	button = uicontrol('Parent', hfig,'Style','pushbutton',...
         'Units','normalized',...
         'Position',[0.4 0.3 0.2 0.1],...
         'String','Display Difference',...
         'Callback',@button_callback);

	function slider_callback(hObject,eventdata)
		sval = hObject.Value;
		diffMax = hObject.Max - sval;
		% For R2014a and earlier:
		% sval = get(hObject,'Value');
		% maxval = get(hObject,'Max');
		% diffMax = maxval - sval;

		data.val = sval;
		data.diffMax = diffMax;
	end

	function button_callback(hObject,eventdata)
		display([data.val data.diffMax]);
	end
end

emmm,共享工作区,之前计算器好像用这种方式也可以,而且可以设定一下简单的判断规则了。但大型程序可以这样吗?好像不行,在小模块中可以这样做,太多还是其他方法比较好。

在编程式 App 中使用 guidata

要在编程式 App 中使用 guidata,可在主函数中存储一些初始值数据。然后,可以在任意回调函数中检索和修改该数据。

function my_slider()
hfig = figure();
guidata(hfig,struct('val',0,'diffMax',1));
slider = uicontrol('Parent', hfig,'Style','slider',...
         'Units','normalized',...
         'Position',[0.3 0.5 0.4 0.1],...
         'Tag','slider1',...
         'Callback',@slider_callback);
     
button = uicontrol('Parent', hfig,'Style','pushbutton',...
         'Units','normalized',...
         'Position',[0.4 0.3 0.2 0.1],...
         'String','Display Values',...
         'Callback',@button_callback);
end

function slider_callback(hObject,eventdata)
	data = guidata(hObject);
	data.val = hObject.Value;
	data.diffMax = hObject.Max - data.val;
	% For R2014a and earlier:
	% data.val = get(hObject,'Value');
	% maxval = get(hObject,'Max');
	% data.diffMax = maxval - data.val;

	guidata(hObject,data);
end

function button_callback(hObject,eventdata)
	data = guidata(hObject);
	display([data.val data.diffMax]);
end

这里的任意?是否能在不同App间调用呢?应该是可以的,因为文档中接下来给出的实例有提到,想要了解的更清楚,看文档去吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值