注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

沙漠里de烟雨

原创分享,禁止转载

 
 
 

日志

 
 

MFC--日期_时钟_农历  

2012-09-04 01:29:08|  分类: C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

/*****
日期与时钟的处理:
--涉及函数:
 OnCreate,OnTimer,OnPaint以及Clock
--操作流程:
 在OnCreate中埋下定时器 ==>> 每隔1秒(1000ms)发送WM_TIMER消息,OnTimer函数被调用(在OnTimer中处理失效区域从而激发WM_PAINT消息来重绘这个区域) ==>>OnPaint被调用(OnPaint中调用了Clock函数) ==>> Clock函数被调用,此函数处理日期与时间显示  ==>> 之后每隔1秒从OnTimer开始此流程再走一次,以此循环往复,实现数字的跳跃,犹如时钟在走。
 还加上显示农历几月几号;
*****/

//头文件代码(*Dlg.h):
protected:
afx_msg void OnPaint();
afx_msg void OnTimer(UINT nTimerID); //--zwh---注:定时器;
afx_msg int OnCreate(LPCREATESTRUCT lpcs);  //--zwh--注:为种下定时器而加的消息;
public:
void Clock();  //--zwh--设置让时钟等动起来;

//源文件代码(*Dlg.cpp)
BEGIN_MESSAGE_MAP(CBackupToolDlg, CDialog)
 ...
 ON_WM_PAINT()
 ON_WM_TIMER()   //--zwh--注:定时器消息;
 ON_WM_CREATE()  //--zwh--注:窗口创建消息;
END_MESSAGE_MAP()

void CBackupToolDlg::OnPaint()
{
 Clock();  //---zwh---注:处理时钟的自定义程序;

 if (IsIconic())
 { .... }
 else
 { CDialog::OnPaint();}
}

int CBackupToolDlg::OnCreate(LPCREATESTRUCT lpcs)
{
 if(CDialog::OnCreate(lpcs)==-1)
 {
  return -1;
 }
 if(!SetTimer(1,450,NULL))   //种下计时器,以450ms间隔发送一次WM_TIMER消息,让程序调用OnTimer消息处理函数;
 {
  MessageBox(_T("Error:SetTimer failed"));
  return -1;
 }

 return 0;
}
void CBackupToolDlg::OnTimer(UINT nTimerID)
{
 CRect rectDate;  //显示日期的那个区域;
 CRect rectTime;  //显示时间的那个区域;
 CRect rectWeek;  //星期;
 CRect rectNongLi; //农历;
 GetDlgItem(IDC_STATIC_DATE)->GetClientRect(&rectDate);  //得到日期区域的大小;
 GetDlgItem(IDC_STATIC_TIME)->GetClientRect(&rectTime);   //得到时间区域的大小;
 GetDlgItem(IDC_STATIC_WEEK)->GetClientRect(&rectWeek);   //得到星期区域的大小;
 GetDlgItem(IDC_STATIC_NONGLI)->GetClientRect(&rectNongLi);   //得到农历区域的大小;
 InvalidateRect(&rectDate,TRUE);   //通知OnPaint重绘这个日期区域;  //设成450ms间隔的话,它会有闪动;但设成1000ms时间秒数就慢1秒.
 InvalidateRect(&rectTime,TRUE);   //通知OnPaint重绘这个时间区域;
 InvalidateRect(&rectWeek,TRUE);   //通知OnPaint重绘这个星期区域;
 InvalidateRect(&rectNongLi,TRUE);   //通知OnPaint重绘这个农历区域;
}
void CBackupToolDlg::Clock()
{
 SYSTEMTIME sysTime;
 GetLocalTime(&sysTime);   //这里要注意:要拿到当地时间,与您电脑的设置时间一样,则用GetLocalTime(&sysTime),
 //如果是GetSystemTime(&sysTime)的话,拿的就是格林威治时间,整整慢了8个小时,而你又不能简单地相加,日期也不好同步修改;

 char strDate[100];  //存放日期;
 char week[5] = {0};
 switch(sysTime.wDayOfWeek)  //将0-6转换成星期天至星期六;
 {
 case 0:
  strcpy(week,"天");
  break;
 case 1:
  strcpy(week,"一");
  break;
 case 2:
  strcpy(week,"二");
  break;
 case 3:
  strcpy(week,"三");
  break;
 case 4:
  strcpy(week,"四");
  break;
 case 5:
  strcpy(week,"五");
  break;
 case 6:
  strcpy(week,"六");
  break;
 }
 sprintf(strDate,"%d-%d-%d",sysTime.wYear,sysTime.wMonth,sysTime.wDay);
 CString currentDate(strDate);//转换成CString;
 GetDlgItem(IDC_STATIC_DATE)->SetWindowText(currentDate.GetBuffer());//显示日期;

 char strWeek[30]; //存放星期;
 sprintf(strWeek,"星期 %s",week);
 CString currentWeek(strWeek);
 GetDlgItem(IDC_STATIC_WEEK)->SetWindowText(currentWeek.GetBuffer());//显示星期;

 char strTime[100];  //存放时间;
 sprintf(strTime,"%d : %d : %d",sysTime.wHour,sysTime.wMinute,sysTime.wSecond);
 CString currentTime(strTime);//转换成CString;
 GetDlgItem(IDC_STATIC_TIME)->SetWindowText(currentTime.GetBuffer());//显示时间;

 CNongLi nongliDate;  //存放农历;
 CString strNongLiDate = nongliDate.NongLi();
 GetDlgItem(IDC_STATIC_NONGLI)->SetWindowText(strNongLiDate.GetBuffer());  //显示农历时间;

}

//为代码的紧凑性,农历要另建一个一般的C++类CNongLi类,建议采用在项目中右键添加类的方式进行;

//头文件代码(NongLi.h):
#pragma once

class CNongLi
{
public:
 CNongLi(void);
 ~CNongLi(void);
 
 //////////--zwh--
private:
 int judge(int year);
 int lmonth(int year);
 int ldays(int year);
 int ydays(int year);
 int mdays(int year,int m);
 CString yinli(int year);
public:
 CString NongLi();
 //////////--
 
};

 

//源文件代码(NongLi.cpp):
#include "StdAfx.h"
#include ".\nongli.h"

//////////////////////////////////////////////////////////////////////////--zwh
#include "afxwin.h"
#include <windows.h>
#include <stdio.h>
#include "string.h"
#include <iostream>
using namespace std;
//////////////////////////////////////////////////////////////////////////--
CNongLi::CNongLi(void)
{
}

CNongLi::~CNongLi(void)
{
}
//////////////////////////////////////////////////////////////////////////--zwh

int Sum,A[12],b[12],M,D,w[2];
int m[]={23,1,3,5,7,9,11,13,15,17,19,21,0},
n[]={0,2,4,6,8,10,12,14,16,18,20,22};
int Y1[]={101,214,308,312,315,401,501,504,512,601,701,801,910,1001,1006,1024,1225,0};
int Y2[]={101,115,505,707,815,909,1208,1224,1230,0};
int str[]={0,21208,42467,63836,85337,107014,128867,150921,173149,195551,218072,
240693,263343,285989,308563,331033,353350,375494,397447,419210,440795,
462224,483532,504758};

int lunar[]={0x09570,
0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,
0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,
0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,
0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,
0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,
0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,
0x14b63,0x09370,0x049f8,0x04970,0x064b0,0x168a6,0x0ea50,0x06b20,0x1a6c4,0x0aae0,
0x092e0,0x0d2e3,0x0c960,0x0d557,0x0d4a0,0x0da50,0x05d55,0x056a0,0x0a6d0,0x055d4,
0x052d0,0x0a9b8,0x0a950,0x0b4a0,0x0b6a6,0x0ad50,0x055a0,0x0aba4,0x0a5b0,0x052b0,
0x0b273,0x06930,0x07337,0x06aa0,0x0ad50,0x14b55,0x04b60,0x0a570,0x054e4,0x0d260};

//////////////////////////////////////////////////////////////////////////--

//////////////////////////////////////////////////////////////////////////---zwh
int CNongLi::judge(int year)
{
 if((year%4==0&&year%100!=0)||year%400==0)return(1);
 else return(0);
}


int CNongLi::lmonth(int year)
{
 return(lunar[year-1989]&0xf);
}

int CNongLi::ldays(int year)
{
 if(lmonth(year)) return((lunar[year-1989]&0x10000)?30:29);
 else return(0);
}

int CNongLi::ydays(int year)
{
 int i,sum = 348;
 for(i=0x8000; i>0x8; i>>=1) sum+=(lunar[year-1989]&i)?1:0;
 return(sum+ldays(year));
}

int CNongLi::mdays(int year,int m)
{
 return( (lunar[year-1989]&(0x10000>>m))?30:29 );
}

CString CNongLi::yinli(int year)
{
 char c[][9]={"一","二","三","四","五","六","七","八","九","十"};
 char d[][9]={"初","十","廿"};
 int y=0,i,j=10,k=1,s,date=2,t,a;
 s=mdays(1989,10)+mdays(1989,11)+mdays(1989,12)-2;
 if(Sum<s)
 {
  if((2+Sum)>mdays(1989,10))
  {
   s=Sum-mdays(1989,10);
   j++;
   if((2+s)>mdays(1989,11))
   {s-=mdays(1989,11);j++;}
  }
  else s=Sum;
  date=date+s;
 }
 else
 {
  s=Sum-s;
  for(i=1990;s>0;i++)
   s-=ydays(i);
  i--;
  s+=ydays(i);
  if(s==0)
  {j=12;date=mdays(i,12);}
  else
  {for(;k<=12&&s>0;k++)
  {
   s-=mdays(i,k);
   if(s>0&&lmonth(i)==k)
   {s-=ldays(i);y=k;}
  }
  --k;
  if(y==k)s=s+ldays(i);
  else s=s+mdays(i,k);
  date=s;j=k;
  }
 }
 t=i-1924;
 a=M*100+D;t=year-1924;
 char strTemp[30]={0};
 char strDate[60];
 if(y==j) strcpy(strDate,"闰");
 else strcpy(strDate,"");
 if(j>10) sprintf(strTemp,"%s%s月",d[1],c[j-11]);
 else sprintf(strTemp,"%s月",c[j-1]);
 strcat(strDate,strTemp);
 strcpy(strTemp,"");
 switch(date/10)
 {
 case(0):
  sprintf(strTemp,"%s%s",d[0],c[date-1]);break;
 case(1):
  if(date==10)sprintf(strTemp,"%s%s",d[0],c[date-1]);
  else sprintf(strTemp,"%s%s",d[1],c[date%10-1]);break;
 case(2):
  if(date==20) sprintf(strTemp,"二十");
  else sprintf(strTemp,"%s%s",d[2],c[date%10-1]);break;
 default:sprintf(strTemp,"三十");
 }
 strcat(strDate,strTemp);
 CString CstrDate(strDate);

 return CstrDate;
}

CString CNongLi::NongLi()

 int year,month,day,y,i,j,a[100],s,N;
 b[0]=31;b[2]=31;b[3]=30;b[4]=31;b[5]=30;b[6]=31;b[7]=31;b[8]=30;b[9]=31;b[10]=30;b[11]=31;
 SYSTEMTIME sys;
 GetLocalTime( &sys );      
 year=sys.wYear;month=sys.wMonth;day=sys.wDay;
 Sum=0;N=0;s=month*100+day;
 if(judge(year)==1)b[1]=29;
 else b[1]=28;
 for(i=1,j=1990;i<100&&j<year;i++,j++)
 {
  if(judge(j)==1) a[i]=366;
  else a[i]=365;
 }
 a[0]=62;
 y=year-1989;
 if(y==0)
 {
  switch(month)
  {
  case(10):Sum=day-30;break;
  case(11):Sum=1+day;break;
  default:Sum=1+b[10]+day;
  }
 }
 else
 {
  for(i=0;i<y;i++)
   Sum+=a[i];
  if(month!=1){for(i=0;i<month-1;i++) Sum+=b[i];}
  Sum+=day;
 } 

 return yinli(year);

}
////////////////////////////////////////////////////////////////////////////--

  评论这张
 
阅读(427)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018