一、程序
1.主程序:main.m
% 函数功能介绍:
% 将 main 中的原有数据(文本框内的数据),发送到 set_rgb_value 中,然后在 set_rgb_value 中设定 rgb
% 的值后,返回 main 中,完成 rgb 值的设定。
function varargout = main(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @main_OpeningFcn, ...
'gui_OutputFcn', @main_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
function main_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
% 预加载初始数据
load('rgb_data.mat')
set(handles.edit1,'string',num2str(rgb))
% Update handles structure
guidata(hObject, handles);
function varargout = main_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
function edit1_Callback(hObject, eventdata, handles)
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
rgb1 = str2num(get(handles.edit1,'string'));
% main 程序中的数据传入 set_rgb_value 程序;经设定之后,再传回 main 程序
rgb = set_rgb_value(rgb1);
set(handles.edit1,'string',num2str(rgb))
save('rgb_data.mat','rgb')
2.子程序:set_rgb_value.m
function varargout = set_rgb_value(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @set_rgb_value_OpeningFcn, ...
'gui_OutputFcn', @set_rgb_value_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
function set_rgb_value_OpeningFcn(hObject, eventdata, handles, varargin)
% rgb_pre 代表初始传入数据;rgb 代表经修改之后的数据
global rgb_pre rgb
rgb_pre = varargin{1};
set(handles.slider1,'Value',rgb_pre(1))
set(handles.slider2,'Value',rgb_pre(2))
set(handles.slider3,'Value',rgb_pre(3))
set(handles.edit1,'string',rgb_pre(1))
set(handles.edit2,'string',rgb_pre(2))
set(handles.edit3,'string',rgb_pre(3))
rgb = varargin{1};
handles.output = rgb_pre;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes set_rgb_value wait for user response (see UIRESUME)
uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = set_rgb_value_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
% 当数据从 set_rgb_value 中输出到 main 中后,将窗口关闭
delete(handles.figure1);
function slider1_Callback(hObject, eventdata, handles)
global rgb
rgb(1) = get(hObject,'Value');
set(handles.edit1,'string',rgb(1))
function slider2_Callback(hObject, eventdata, handles)
global rgb
rgb(2) = get(hObject,'Value');
set(handles.edit2,'string',rgb(2))
function slider3_Callback(hObject, eventdata, handles)
global rgb
rgb(3) = get(hObject,'Value');
set(handles.edit3,'string',rgb(3))
function pushbutton1_Callback(hObject, eventdata, handles)
global rgb
handles.output = rgb;
guidata(hObject, handles);
uiresume(handles.figure1)
function pushbutton2_Callback(hObject, eventdata, handles)
global rgb_pre
handles.output = rgb_pre;
guidata(hObject, handles);
uiresume(handles.figure1)
function figure1_CloseRequestFcn(hObject, eventdata, handles)
% 关闭窗口与 cancel 按键功能一样,因此代码相同
global rgb_pre
handles.output = rgb_pre; % 将数据发送到 handles.output 中。程序在 OpeningFcn 使用 uiwait,使程序等待,当遇到 uiresume 时程序继续运行,执行 OutputFcn ,将 set_rgb_value 中修改之后的值通过 handles.output 输出
guidata(hObject, handles); % 当 handles 结构体中的数据发生改变时,必须使用 guidata 更新 handles 结构体
uiresume(handles.figure1)
function edit1_Callback(hObject, eventdata, handles)
global rgb
rgb(1) = str2double(get(hObject,'string'));
set(handles.slider1,'Value',rgb(1))
function edit2_Callback(hObject, eventdata, handles)
global rgb
rgb(2) = str2double(get(hObject,'string'));
set(handles.slider2,'Value',rgb(2))
function edit3_Callback(hObject, eventdata, handles)
global rgb
rgb(3) = str2double(get(hObject,'string'));
set(handles.slider3,'Value',rgb(3))
二、注解:
该博文中的使用uiwait(使程序在使用该语句的地方断开,程序等待,但是程序依然可以响应事件)和uiresume(继续执行被uiwait中断的程序)完成两个gui的数据传递。为什么uiwait要放在OpeningFcn中以及delete(handles.figure1)放在OutputFcn中?
可以参考matlab-gui的运行流程与matlab的数据传递方式(后有该文链接)。这里简单说一下:
1.如果不使用uiwait,在main.m中调用set_rgb_value.m,这样会直接执行OpeningFcn,再执行OutputFcn,在还没有对空间进行操作时,数据已经发送回main.m中;
2.程序在执行OpeningFcn时,已经完成了gui的创建,因此uiwait放在OpeningFcn中不会出错;
3.delete(handles.figure1)放在OutputFcn中,而CloseRequest_Fcn中没有使用,这时因为我们要求在,传递完数据之后,set_rgb_value窗口关闭,而在关闭前,我们需要使用handles.output 对varargout{1}赋值完成数据的传递,这时如果在CloseRequest_Fcn中删除窗口,则handles结构体在执行OutputFcn不可以获得,造成程序出错(当然通过这里的分析,也可以不使用handles.output,使用全局变量避开这个问题,这时也可以在CloseRequest_Fcn中删除)。
三、百度云链接:
链接:http://pan.baidu.com/s/1dFuZCZ3 密码:vep6