|

楼主 |
发表于 2018-6-1 09:36:27
|
显示全部楼层
本帖最后由 hpdell 于 2018-6-3 08:43 编辑
你,参考了,这个历程是使用点击某个按钮控件后跟新的,我也测试过,确实是可以的
但是我目前的这个使用方法是不需要点击某个按钮控件的,不知道有什么好方法啊 ??????
程序如下:
模拟日历程序:
typedef struct
{
U16 X; // X
U16 Y; // Y
U16 X_x; // X显示阴历 x 坐标
U16 Y_y; // Y显示阴历 y 坐标
U32 Color; // 颜色
U8 Date; // 日期
} CLD_DAY;
/**************************************************************************************
* FunctionName : _DateToWeek()
* Description : 通过日期获取周
* EntryParameter : year, 输入年 10进制
month, 输入月 10进制
day 输入日 10进制, day 固定输入为 1,切记切记
* ReturnValue : 返回周
**************************************************************************************/
U8 _DayToWeek(U8 year, U8 month, U8 day)
{
U8 i, y, m, d, weekDay;
U16 ti = 2000;
U32 days = 0;
y = (year / 10) * 10 + (year % 10);
m = (month / 10) * 10 + (month % 10);
d = (day / 10) * 10 + (day % 10);
for (i = 0; i<y; i++)
{
if (((ti % 4) == 0) && (((ti % 100) != 0) || ((ti % 400) == 0)))
{
days += 366;
}
else
{
days += 365;
}
ti++;
}
for (i = 1; i<m; i++)
{
switch (i)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
days += 31;
break;
}
case 2:
{
ti = 2000 + y;
if (((ti % 4) == 0) && (((ti % 100) != 0) || ((ti % 400) == 0)))
{
days += 29;
}
else
{
days += 28;
}
break;
}
case 4:
case 6:
case 9:
case 11:
{
days += 30;
break;
}
}
}
days += d;
weekDay = (days % 7) + 5;
weekDay %= 7;
return weekDay;
}
#define USER_X_BASE_ADDR 1024-367
#define USER_Y_BASE_ADDR 32+332
/**************************************************************************************
* FunctionName : _DrawCalendar()
* Description : 绘制日历表格
* EntryParameter : None
* ReturnValue : None
**************************************************************************************/
//static const U8 cstWek[][4] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };
const char *cstWek[] = { "日\0", "一\0", "二\0", "三\0", "四\0", "五\0", "六\0" };
void _DrawCalendar(WM_MESSAGE * pMsg, CLD_DAY *pDay)
{
WM_HWIN hWinOld;
U8 i;
U8 n ;
int x1,x2,y;
GUI_RECT pRect;
char pData[4];
hWinOld = WM_SelectWindow(pMsg->hWin);
GUI_SetBkColor(GUI_GRAY_C8); //矩形区域背景色
pRect.x0 = USER_X_BASE_ADDR;
pRect.y0 = USER_Y_BASE_ADDR;
pRect.x1 = 1024;
pRect.y1 = 600;
GUI_ClearRectEx (&pRect); //绘制矩形框背景色
GUI_SetColor(GUI_WHITE);
for ( i = 0; i < 7; i++)
{
sprintf((char *)&pData[0],
"%s",
cstWek
);
GUI_SetFont(&GUI_FontHZ16); //显示中文字体
GUI_DispStringAt((const char *) & pData[0], USER_X_BASE_ADDR+4+8+(i*52), USER_Y_BASE_ADDR); // 显示星期
}
y = (USER_Y_BASE_ADDR+16+1) ; //24是年、月高度,16是星期高度
x1 = USER_X_BASE_ADDR;
x2 = 1024;
GUI_SetColor(GUI_BROWN); // 设置线条颜色
GUI_SetFont(&GUI_Font16_ASCII);
GUI_DrawHLine(y, x1, x2); // 画水平线
// 设置日期显示坐标值
for ( i = 0; i < 7; i++) // 设置显示 阳历的 y坐标
{
for ( n = 0; n < 7; n++)
{
{
pDay[i * 7 + n].Y = (USER_Y_BASE_ADDR +16+4 + (i * 36)); // 39 = (600-32-332-24-16-1)/5
}
}
}
for ( i = 0; i < 7; i++) // 设置显示 阳历的 x坐标
{
for ( n = 0; n < 6; n++) // 显示 6行
{
pDay[i + 7 * n].X = (12 + USER_X_BASE_ADDR + (i * 52)); // 12 是为了显示在每格的中间位置
}
}
/* 配置回之前选择的目标窗口 */
WM_SelectWindow(hWinOld);
}
/**************************************************************************************
* FunctionName : _FillCalendar()
* Description : 日历填写
* EntryParameter : None
* ReturnValue : None
**************************************************************************************/
// static const U8 cstmonth[][4] = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEQ", "OCT", "NOV", "DEC" };
static const U8 monthDay[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
void _FillCalendar(WM_MESSAGE * pMsg, CLD_DAY *pDay, U8 year, U8 month, U8 day)
{
WM_HWIN hWinOld;
U8 tmpWek;
U8 i;
hWinOld = WM_SelectWindow(pMsg->hWin);
tmpWek = _DayToWeek(year, month, 0x01); // 获取星期
for ( i = 0; i < tmpWek; i++) // 存储上月的
{
if (month == 0x01)
{
pDay.Date = monthDay[12 - 1] - tmpWek + i + 1;
}
else
{
pDay.Date = monthDay[month - 2] - tmpWek + i+1;
}
pDay.Color = GUI_GRAY;
}
for ( i = 0; i < monthDay[month-1]; i++)
{
pDay[i + tmpWek].Date = i+1; // 存储本月的
pDay[i + tmpWek].Color = (day == i + 1) ? GUI_WHITE : GUI_MAGENTA;
}
for ( i = 0; i < 42 - tmpWek - monthDay[month-1]; i++)
{
if (month == 0x12)
{
pDay[i + tmpWek + monthDay[1-1]].Date = i + 1;
}
else
{
pDay[i + tmpWek + monthDay[month - 1]].Date = i + 1; // 存储下月的
}
pDay[i + tmpWek + monthDay[month-1]].Color = GUI_GRAY;
}
for ( i = 0; i < 42; i++)
{
GUI_SetFont(&GUI_Font16B_ASCII);
GUI_SetColor(pDay.Color);
GUI_DispDecAt(pDay.Date, pDay.X, pDay.Y, ((pDay.Date > 10) ? 2 : 1));
}
/* 配置回之前选择的目标窗口 */
WM_SelectWindow(hWinOld);
}
/**************************************************************************************
* FunctionName : DisCalendar()
* Description : 日历显示
* EntryParameter : year, 输入年 10进制
month, 输入月 10进制
day 输入日 10进制
* ReturnValue : None
**************************************************************************************/
static CLD_DAY tmpDay[42];
void DisCalendar(WM_MESSAGE * pMsg, U8 year, U8 month, U8 day)
{
_DrawCalendar(pMsg, tmpDay);
_FillCalendar(pMsg, tmpDay, year, month, day);
}
// 在需要使用的地方使用
main()
{
WM_MESSAGE * pMsg;
... ...
switch(xx){
/* 定时1秒更新一次时间 */
case WM_TIMER: 或者在 WM_PAINT 这个消息里面调用也行 ??????????
WM_InvalidateRect(hWin, &rRTC); //指定区域无效化
GUI_ClockUpdate(pMsg);
break;
case WM_PAINT : // 此处 跟新或者上面跟新都不行,此时貌似程序比较容易死掉 ?????????????????
DisCalendar( pMsg, 53, 11, 29); //日期设置为 2053.11.29 日
break;
}
}
|
|