简而言之,就是gui在没有创建完所有的控件之前,不能用handles
如果在创建时,非要定义当前的控件一些属性,应该用hObject,比如,创建时定义一个表格的初始值,就用set(hObject,'Data',[1 2 3]
handles= []
是因为,handles在一些函数没有创建的时候是不会建立的,MATLAB自带的注释如下:
function listbox1_CreateFcn(hObject, eventdata, handles)
% hObject handle to listbox1 (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
用过matlab做GUI的人可能者有或者曾经有过这样的疑惑,handles到底是一个什么鬼东西,我又该怎么去操控它。其实handles很简单,只是matlab里的帮助好像把它说的很麻烦罢了。
为了说明问题,我们不访拿户籍管理做一个类比吧,我们知道,我们每个人都有一个名字和一个身份证号,我们可以同名,但我们的身份证号是唯一的。小米做的matlab可能就是借用的这种思想(毕竟都是管理嘛,只不过一个管的是人,一个管的是控件而已)。
matlab里的每个控件都一个编号,就好像我们的身分证号一样,而且它们在整个程序执行期间都是唯一的。它们是在程序打开时由matlab自动分派,并且这个号在程序执行期间是不可改的。程序关闭后这些编号会被自动撤销(其实就是变量嘛,程序一关变量自然就over了),在下次程序启动时会被重新分派,所以你不要指望这次把这个号记住,下次通过这个号再找出对应的控件。但是记住每个控件的号肯定是一个让人头大的事,所以maltab就又给每个控件一个名字Tag,通过Tag我们很容易记住控件的标识。但是名字名字有一个缺点,就是重名的问题,你叫张三,人家也能叫张三,不过好在都是我们给控件命名的,可以避免这一个问题。除了容易记住这一优点外,Tag还有一个优点就是关闭程序后在下次执行时它还是一样的(Tag可以被人为更改,只要你没有改的话它就是不变的),所以下次启动时我们可以通过Tag来找到我们想要的控件。
我们可以看到handles的结构是“Tag:标号”,比如一个控件按钮的Tag是test,标号是100,那么在程序中就有这样一种对应关系test就对应着100,也就是名为test的变量中存着100,而100对应着这个按钮。我们可以更改handles.test的值:
handles.test=99;
guidata(gcf,handles)
但是改过之后你再也不能通过test来找到那个按钮控件了,如果你不幸没有记住那个标号的话,那么你就与那个按钮控件失去联系了。
另外,matlab中获取handles的方法有两种,第一个是通过handles=guidata(gcf)来获得,第二种是通过handles=guihandles来获得,那么这两个有什么区别呢?经过测试发现通过uimenu创建一个新的控件,
h=uimenu(hparent,'Tag','mymenu');
此时用handles=guidata(gcf)所得到的handles中不会有handles.mymenu的(matlab帮助上说了),但是用handles=guihandles得到的却会有handles.mymenu.只有加上下面两句话:
handles.mymenu=h;
guidata(gcf,handles);
才会通过handles=guidata(gcf)得到handles.mymenu;
还应该注意到guidata得到的handles与guihandles得到的handls是不一样的,不能用guihandles得到的handles来覆盖handles.