本设计主要是制作一个时钟软件,包括一个时钟表和一个日历。程序自动运行时,显示系统当前日期和时间,日期和时间可以由用户自行更改。
本软件由一个主程序myclcok及两个子函数rili 和ck组成。主程序myclcok主要用于建立主窗口的菜单及相关的功能编辑,rili函数用于建立日历界面,ck函数用于建立时钟界面。
主程序如下:
function myclock
global aa ti hs hm hh;
aa = 1;
hs = 0;hm = 0;hh = 0;
hfig= figure( 'NumberTitle', 'off', 'position',[624 118 600 350],...
'name', '日历','MenuBar', 'none', 'color',[0.8 0.7 0.8]);
editdate= [ 's = clock;',...
'p1={"年", "月","日"};',...
'A= inputdlg(p1,"日期:",1);'...
's(1) = str2num(A{1});',...
's(2) = str2num(A{2});',...
's(3) = str2num(A{3});',...
'rili(s);'];
u1 = uimenu(hfig, 'label','&设置日期','callback', editdate);
u2 = uimenu(hfig, 'label','&恢复当前日期','callback','ti = clock;rili(ti);');
ab= ['global aa ti hs hm hh;',...
'*aa=0;',...
'p2 ={"时","分","秒"};',...
'B = inputdIg(p2,"日期:",1);',...
'ti(4) = str2num(B{1});',...
'ti(5) = str2num(B{2});',...
'ti(6) = str2num(B({3});',...
'delete(hs);delete( hm);delete(hh);',...
'aa = 1;',...
'ck(ti);'];
u3 = uimenu(hfig, 'label', '&设置时间','callback',ab);
ab1=['global aa ti hs hm hh;',...
'aa=0;',...
'delete( hs);delete(hm);delete(hh);'...
'ti = clock;',...
'aa= 1;',...
'ck(ti);'];
u4 = uimenu(hfig,'label','&恢复当前时间','callback', ab1);
u5 = uimenu(hfig, 'label', '&退出', 'callback', 'close(gcf)');
u6 = uicontrol(hfig, 'style', 'text', 'string', 'GUI示例',...
'Units', 'normalized', 'position',[0.85 0.01 0.15 0.05],...
'back',[0.8 0.7 0.8]);
ti= ?;rili(ti);ck(ti);
end
子函数
function f = ck(ti)
global aa hs hm hh
set(gca, 'position',[0 0 0.5 0.9])
A = linspace(0,6.3,1000);
x1 = 8*cos(A);%极坐标画圆
y1 = 8*sin(A);
x2 = 7*cos(A);
y2 = 7*sin(A);
plot(x1,y1, 'b','linewidth',1.4)
hold on
plot(x2,y2, 'b','linewidth',3.5)
fill(0.4*cos(A),0.4*sin(A), 'r');
axis off
axis([-10 10 -10 10])
axis equal
for k= 1:12
xk = 9*cos(- 2* pi/12*k+ pi/2);
yk = 9*sin(-2* pi/12*k+ pi/2);
plot([xk/9*8 xk/9*7],[yk/9*8 yk/9*7], 'color',[0.8 0.1 0.5])
h = text(xk-0.5, yk, num2str(k), 'fontsize',13, 'color',[0.9 0.3 0.8]);
end
%计算时针位置
th= - (ti(4) + ti(5)/60 + ti(6)/3600)/12*2*pi+pi/2;
xh3 =4.0 * cos(th);
yh3 =4.0 * sin(th);
xh2 = xh3/2 +0.5* cos(th- pi/2);
yh2 = yh3/2 +0.5* sin(th- pi/2);
xh4 = xh3/2- 0.5* cos(th- pi/2);
yh4 = yh3/2- 0.5* sin(th- pi/2);
hh = fill([0 xh2 xh3 xh4 0],[0 yh2 yh3 yh4 0],[0.6 0.5 0.3]);
set(hh, 'EraseMode', 'Xor');
%计算分针位置
tm = - (ti(5) + ti(6)/60)/60*2*pi+pi/2;
xm3 =6.0* cos(tm);
ym3 =6.0* sin(tm);
xm2 = xm3/2+ 0.5 *cos(tm- pi/2);
ym2 = ym3/2+ 0.5* sin(tm- pi/2);
xm4 = xm3/2- 0.5* cos(tm- pi/2);
ym4 = ym3/2- 0.5* sin(tm- pi/2);
hm = fill([0 xm2 xm3 xm4 0],[0 ym2 ym3 ym4 0],[0.6 0.5 0.3]);
set(hm, 'EraseMode', 'Xor');
%计算秒针位置
ts = - (ti(6))/60*2*pi+ pi/2;
hs = line([0 7 * cos(ts)],[0 7*sin(ts)], 'color',[0.6 0.5 0.3], 'linewidth',3);
set( hs, 'EraseMode', 'Xor');
set(gcf, 'doublebuffer', 'on');
while 1
if aa == 0
aaa = 1;
break;
end
%计算时针位置
th = -(ti(4) + ti(5)/60+ ti(6)/3600)/12*2*pi +pi/2;
xh3 = 4.0*cos(th);
yh3 = 4.0* sin(th);
xh2 = xh3/2+0.5* cos(th- pi/2);
yh2 = yh3/2+0.5* sin(th- pi/2);
xh4= xh3/2-0.5*cos(th- pi/2);
yh4= yh3/2-0.5* sin(th- pi/2);
set(hh,'XData',[0 xh2 xh3 xh4 0],'YData',[0 yh2 yh3 yh4 0]);
plot(0,0,'* ')
%计算分针位置
tm = -(ti(5) + ti(6)/60)/60*2*pi+ pi/2;
xm3 = 6.0* cos(tm);
ym3 = 6.0* sin(tm);
xm2 = xm3/2+0.5* cos(tm- pi/2);
ym2 = ym3/2 +0.5* sin(tm- pi/2);
xm4 = xm3/2- 0.5* cos(tm- pi/2);
ym4 = ym3/2-0.5 * sin(tm- pi/2);
set(hm, 'XData',[0 xm2 xm3 xm4 0],'YData',[0 ym2 ym3 ym4 0]);
%计算秒针位置
ts = -(ti(6))/60*2*pi+ pi/2;
set(hs, 'XData',[0 7*cos(ts)], 'YData',[0 7*sin(ts)]);
drawnow;
pause(0.05) ;
%时间更新
ti(6) = ti(6) + 0.15;
if ti(6) > 60
ti(6) =0;
ti(5) = ti(5) +1;
end
if ti(5)> 60
ti(5)=0;
ti(4)= ti(4) + 1;
end
if ti(4)> 12
ti(4) =0;
end
end
end
function f = rili(ti)
global h3
a = calendar(ti(1), ti(2));
for i=1:6
for j=1:7
if a(i,j) == 0
h(i*7+j) = uicontrol(gcf, 'Style', 'text', 'Units', 'normalized',...
'position',[0.45+0.06* j 0.65-0.08* i 0.06 0.08], 'fontsize', 13,...
'fontweight', 'bold', 'back',[0.6 0.8 0.1]);
else
h(i*7+j)= uicontrol(gcf, 'Style', 'text', 'string',a(i,j), 'Units', 'normalized',...
'position',[0.45+0.06*j 0.65-0.08*i 0.06 0.08],'fontsize',13,...
'fontweight', 'bold', 'back',[0.6 0.8 0.1]);
end
if a(i,j)== ti(3)
set(h(i*7+j),'back',[0.5 0.2 0.5]);
end
end
end
h2 = uicontrol(gcf, 'Style', 'text', 'string','日 一 二 三 四 五 六',...
'Units', 'normalized', 'position',[0.51 0.65 0.42 0.1], 'fontsize',16,...
'fontweight', 'bold', 'back',[0.2 0.8 0.2]);
for m= 1:3
h3(m) = uicontrol(gcf, 'Style', 'text', 'string', num2str(ti(m)), 'Units', 'normalized',...
'position',[0.39+0.13*m 0.78 0.09 0.08],'back',[0.9 0.8 0.8],'fontsize', 13, 'fontweight', 'bold');
end
uicontrol(gcf, 'Style', 'text', 'string','年','Units', 'normalized',...
'position',[0.61 0.78 0.04 0.08], 'back',[0.9 0.8 0.8], 'fontsize',13, 'fontweight', 'bold');
uicontrol(gcf, 'Style', 'text', 'string','月','Units', 'normalized',...
'position',[0.73 0.78 0.05 0.08], 'back',[0.9 0.8 0.8],'fontsize',13, 'fontweight', 'bold');
uicontrol(gcf, 'Style', 'text', 'string','日','Units', 'normalized',...
'position',[0.86 0.78 0.04 0.08],'back',[0.9 0.8 0.8], 'fontsize', 13, 'fontweight', 'bold');
end
结果如下:
设置日期
程序可以运行,不过,我在上面的代码上留下了一个bug,欢迎大家一起讨论,也可以私信我哈,哈哈哈。