mlapp程序需要生成一个年单位的日历界面,采用uilabel进行显示每月日
可以根据给定的布局控件的长和宽自定义排布(每个日历控件长570,高度295)

%% 生成日历显示控件
function drawCustomCalendar( app , startDate, endDate ) % startDate: 开始日期,格式为 'yyyy-mm-dd' % endDate: 结束日期,格式为 'yyyy-mm-dd' startDate = datetime('2024-01-03'); app.CalendarPanel.YearList = year(startDate):year(endDate); % 获取年列表 [ app.CalendarPanel.MonthList ] = getMonthList( app, startDate , endDate ); % 根据开始时间和截止时间获取年月列表 delete(app.GridLayout6.Children); % 清空既有控件 % 若是一年则采用uipanel,若是多年则采用uitab if isscalar(app.CalendarPanel.YearList )==1 % 仅一年 % 设置窗口布局 % 标准区域大小为长570,高度295 if app.Panel_DrawCalendar.Position(3) >570 app.GridLayout6.ColumnWidth = arrayfun(@(x)570,1: ... floor(app.Panel_DrawCalendar.Position(3)/570),'UniformOutput',false); else;app.GridLayout6.ColumnWidth = {570}; end app.GridLayout6.RowHeight = arrayfun(@(x)295,1:ceil(length( ... app.CalendarPanel.MonthList)/length(app.GridLayout6.ColumnWidth)),'UniformOutput',false); iijj = 1; % 先横后竖的排布 for nn = 1 : length( app.GridLayout6.RowHeight ) for mm = 1 : length( app.GridLayout6.ColumnWidth ) PanelObject = uipanel(app.GridLayout5,'BorderType','none','TitlePosition','centertop',... 'FontWeight','bold','FontSize',16,'BorderColor',[1.00,0.00,0.00],'BorderWidth',4,... 'BackgroundColor',[0.07,0.62,1.00],'Title',app.CalendarPanel.MonthList(iijj)); PanelObject.Layout.Row = mm; PanelObject.Layout.Column = nn; iijj= iijj + 1; end end else % 多年设置 set(app.GridLayout6,'RowHeight',{'1x'},'ColumnWidth',{'1x'}) app.CalendarPanel.Object.TabGroup_Calendar = uitabgroup(app.GridLayout6,... 'Tag','按年设置显示日历','TabLocation','left'); app.CalendarPanel.Object.TabGroup_Calendar.Layout.Row = 1; app.CalendarPanel.Object.TabGroup_Calendar.Layout.Column = 1; for iijj = 1 : length( app.CalendarPanel.YearList) % 生成uitab Tab_Calendar = []; Tab_Calendar = uitab(app.CalendarPanel.Object.TabGroup_Calendar,'Title', ... % 按年分布 strcat(num2str(app.CalendarPanel.YearList(iijj)),'年'));pause(1); % 获取当年的月份 CurrentMonthList = app.CalendarPanel.MonthList(cell2mat( ... arrayfun(@(x)year(x)==app.CalendarPanel.YearList(iijj), ... app.CalendarPanel.MonthList,"un",false))); % 设置窗口布局 % 标准区域大小为长570,高度295 Tab_Calendar_GridLayout = uigridlayout(Tab_Calendar,'Scrollable','on');pause(1); if Tab_Calendar_GridLayout.Position(3) >570 Tab_Calendar_GridLayout.ColumnWidth = arrayfun(@(x)570,1: ... floor(Tab_Calendar_GridLayout.Position(3)/570),'UniformOutput',false); else;Tab_Calendar_GridLayout.ColumnWidth = {570}; end Tab_Calendar_GridLayout.RowHeight = arrayfun(@(x)295,1:ceil(length( ... CurrentMonthList)/length(Tab_Calendar_GridLayout.ColumnWidth)),'UniformOutput',false);pause(0.5); % 先横后竖的排布 kk = 1; for nn = 1 : length( Tab_Calendar_GridLayout.RowHeight ) for mm = 1 : length( Tab_Calendar_GridLayout.ColumnWidth ) % 面板 PanelObject = uipanel(Tab_Calendar_GridLayout,'BorderType','none','TitlePosition','centertop',... 'FontWeight','bold','FontSize',16,'BorderColor',[0.07,0.62,1.00],'BorderWidth',4,... 'Title',char(CurrentMonthList(kk))); PanelObject.Layout.Row = nn; PanelObject.Layout.Column = mm; % 内容预设 GridLayout_PanelObject = uigridlayout(PanelObject,'Scrollable','off',... 'ColumnWidth',{'1x','1x','1x','1x','1x','1x','1x'},... 'RowHeight',{30,'1x','1x','1x','1x','1x'} ); NumList = {'一','二','三','四','五','六','日'}; FirstDayInMonth = datetime(year(CurrentMonthList(kk)), ... month(CurrentMonthList(kk)),1); FirstDayInNextMonth = datetime(year(CurrentMonthList(kk)), month(CurrentMonthList(kk))+1, 1); FirstDayInWeek = day(FirstDayInMonth, 'iso-dayofweek') ; if ceil((FirstDayInWeek - 1 + days( FirstDayInNextMonth - FirstDayInMonth)) / 7) >5 GridLayout_PanelObject.RowHeight = {30,'1x','1x','1x','1x','1x','1x'}; end % 生成控件 for hh = 1 : length(GridLayout_PanelObject.RowHeight) for hhhh = 1 : length(GridLayout_PanelObject.ColumnWidth) % 首行设置 if hh == 1 LabelObject=uilabel(GridLayout_PanelObject,'FontSize',14,'FontWeight','bold',... 'Text',strcat('星期',NumList{hhhh})); LabelObject.Layout.Row = hh; LabelObject.Layout.Column = hhhh; else if 7*(hh-2)+hhhh < FirstDayInWeek || 7*(hh-2)+hhhh > ... days( FirstDayInNextMonth - FirstDayInMonth) +FirstDayInWeek-1 LabelObject=uilabel(GridLayout_PanelObject,'FontSize',18,'FontWeight','bold','Text','','HorizontalAlignment','center'); else LabelObject=uilabel(GridLayout_PanelObject,'FontSize',18,'FontWeight','bold',... 'Text',num2str(7*(hh-2)+hhhh-FirstDayInWeek+1),'UserData',char(datetime(year(CurrentMonthList(kk)), ... month(CurrentMonthList(kk)),7*(hh-2)+hhhh)),'HorizontalAlignment','center'); end LabelObject.Layout.Row = hh; LabelObject.Layout.Column = hhhh; end end end kk = kk + 1; end end end end end
%% 根据开始时间和截止时间获取年月列表 function [ MonthList ] = getMonthList( app, startDate , endDate ) % 根据开始时间和截止时间获取年月列表 MonthList = []; currentDate = startDate; while currentDate <= endDate % 循环生成月份列表 % 循环生成月份列表 yearMonth = datetime(currentDate,'Format', 'uuuu-MM'); % 提取年份和月份 MonthList = [MonthList; yearMonth]; currentDate = dateshift(currentDate,'start','month','next'); % 将日期设置为下个月的第一天 end MonthList = unique(MonthList); % 去重(因为可能有重复的月份) end
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删