// Calendar1.cpp : implementation file
//
/***************************************************************************
致看到这些源代码的兄弟:
你好!
这本来是我为一个商业PDA产品开发的日历程序,最近移植于PC机上, 所以算法
和数据部分是用纯C++写的,不涉及MFC,所有的代码都是以短节省存储空间为主要目
的.
很高兴你对这些代码有兴趣,你可以随意复制和使用些代码,唯一有一点小小的
愿望:在你使用和复制给别人时,别忘注明这些代码作者:-)。程序代码也就罢了,后
面的数据可是我辛辛苦苦从万年历上找出来输进去的。
如果你有什么好的意见不妨Mail给我。
wangfei@hanwang.com.cn
或
wangfei@engineer.com.cn
2000年3月
****************************************************************************/
#include "stdafx.h"
#include "Calendar.h"
#include "Calendar1.h"
#include "Calendarfrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCalendar
extern WORD gLunarMonthDay[];
extern BYTE gLunarMonth[];
extern BYTE gLunarHolDay[];
const WORD START_YEAR =1901;
const WORD END_YEAR =2050;
void CCalendar::l_InitData()
{
SYSTEMTIME systime;
::GetSystemTime(&systime);
m_iYear = systime.wYear;
m_iMonth = systime.wMonth;
m_iDay = systime.wDay;
m_dwBackColor = RGB(255,255,255);
m_dwForeColor = RGB(0,0,0);
m_dwSelColor = RGB(150,150,230);
m_dwSelForeColor = RGB(255,255,255);
m_dwTitleBkColor = RGB(190,70,70);
m_dwTitleColor = RGB(255,255,0);
}
CCalendar::CCalendar(WORD iYear, WORD iMonth, WORD iDay)
{
if(!SetDate(iYear, iMonth, iDay))
l_InitData();
}
CCalendar::CCalendar()
{
l_InitData();
}
CCalendar::~CCalendar()
{
DestroyWindow();
}
BEGIN_MESSAGE_MAP(CCalendar, CWnd)
//{{AFX_MSG_MAP(CCalendar)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_WM_CONTEXTMENU()
ON_WM_CREATE()
//}}AFX_MSG_MAP
ON_COMMAND(ID_TITLEBKCOLOR, OnTitleBkColor)
ON_COMMAND(ID_TITLECOLOR, OnTitleColor)
ON_COMMAND(ID_SELCOLOR, OnSelColor)
ON_COMMAND(ID_FORECOLOR, OnForeColor)
END_MESSAGE_MAP()
#define COL_WIDTH 32
#define ROW_HEIGHT 20
#define TITLE_HEIGHT 20
BOOL CCalendar::Create(RECT &rect, CWnd *pParentWnd, UINT nID)
{
CString szClassName = AfxRegisterWndClass(CS_CLASSDC|CS_SAVEBITS|
CS_HREDRAW|CS_VREDRAW,
0, (HBRUSH)CBrush(RGB(255,255,255)), 0);
rect.right = rect.left + COL_WIDTH*7 +4;
rect.bottom = rect.top + TITLE_HEIGHT+ROW_HEIGHT*6 +10 ;
if(!CWnd::CreateEx(WS_EX_CLIENTEDGE, szClassName, _T(""),
WS_CHILD|WS_VISIBLE|WS_TABSTOP, rect,
pParentWnd, nID, NULL))
return FALSE;
UpdateWindow();
for(int i=0; i<42; i++)
m_oBitMapList[i].LoadBitmap(IDB_BITMAP1+i);
m_oPopMenu.CreatePopupMenu();
m_oPopMenu.AppendMenu(MF_STRING, ID_TITLEBKCOLOR, _T("标题背景色..."));
m_oPopMenu.AppendMenu(MF_STRING, ID_TITLECOLOR, _T("标题前景色..."));
m_oPopMenu.AppendMenu(MF_STRING, ID_FORECOLOR , _T("日期前景色..."));
m_oPopMenu.AppendMenu(MF_STRING, ID_SELCOLOR, _T("选中区颜色..."));
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CCalendar message handlers
void CCalendar::l_PaintTitle(CPaintDC &dc)
{
CRect rect ;
GetClientRect(&rect);
rect.left ++; rect.top ++;
rect.right --; rect.bottom = rect.top + TITLE_HEIGHT;
dc.FillRect(&rect, &CBrush(m_dwTitleBkColor));
dc.SetBkColor(m_dwTitleBkColor);
dc.SetTextColor(m_dwTitleColor);
int startx = rect.left +8;
char sztext[][3]={"日","一","二","三","四","五","六"};
for(int i=0; i <7; i++)
{
dc.TextOut(startx, rect.top +2, sztext[i]);
startx += COL_WIDTH;
}
}
void CCalendar:: l_PaintOneDay(CPaintDC &dc, CDC &imgdc, WORD &iDay,
WORD &iLunarYear, WORD &iLunarMonth,
WORD &iLunarDay,
LONG startx, LONG starty)
{
char text[3];
sprintf(text, "%2d", iDay);
// select icon
if(iLunarDay!=1)
imgdc.SelectObject(&m_oBitMapList[iLunarDay-1]);
else
imgdc.SelectObject(&m_oBitMapList[29+iLunarMonth]);
// if day == current day
if(iDay++ == m_iDay)
{
dc.FillRect(&CRect(startx-1, starty,
startx +COL_WIDTH-3, starty + ROW_HEIGHT),
&CBrush(m_dwSelColor));
dc.SetTextColor(m_dwSelForeColor);
dc.SetBkColor(m_dwSelColor);
dc.TextOut(startx, starty +2, text);
dc.SetBkColor(m_dwBackColor);
dc.SetTextColor(m_dwForeColor);
dc.BitBlt(startx+17, starty +2, 8,16,&imgdc,0,0,MERGEPAINT);
}
else
{
dc.TextOut(startx, starty+2, text);
dc.BitBlt(startx+17, starty +2, 8,16,&imgdc,0,0,SRCCOPY);
}
if(iLunarDay<29)
iLunarDay++;
else
{
LONG days = LunarMonthDays(iLunarYear, iLunarMonth);
if(!HIWORD(days) && iLunarDay == LOWORD(days))
iLunarMonth = (iLunarMonth)%12+1;
if(iLunarDay < LOBYTE(days))
iLunarDay++;
else
iLunarDay =1;
}
}
void CCalendar::l_PaintDate(CPaintDC &dc)
{
CDC imgdc;
imgdc.CreateCompatibleDC(&dc);
RECT rect;
GetClientRect(&rect);
rect.top +=TITLE_HEIGHT+6;
dc.SetBkColor(m_dwBackColor);
dc.SetTextColor(m_dwForeColor);
WORD day =1;
WORD iLunarYear, iLunarMonth, iLunarDay;
GetLunarDate(m_iYear, m_iMonth, 1, iLunarYear, iLunarMonth, iLunarDay);
for(int i=0; i<6; i++, rect.top += ROW_HEIGHT)
{
long startx = rect.left +2;
for(int j=0; j<7; j++,startx += COL_WIDTH)
{
if(j < WeekDay(m_iYear, m_iMonth, 1) && i==0)
continue;
if(day > MonthDays(m_iYear, m_iMonth))
break;
l_PaintOneDay(dc, imgdc, day, iLunarYear, iLunarMonth,
iLunarDay, startx, rect.top);
}
}
}
void CCalendar::OnPaint()
{
CPaintDC dc(this); // device context for painting
CFont *font = ((CCalendarFrm *)GetParent())->GetDispFont();
dc.SelectObject(font);
dc.SetMapMode(0);
l_PaintTitle(dc);
l_PaintDate(dc);
}
LONG CCalendar::CalcDateDiff(WORD iEndYear, WORD iEndMonth, WORD iEndDay,
WORD iStartYear, WORD iStartMonth, WORD iStartDay)
{
WORD monthday[]={0, 31, 59 ,90, 120, 151, 181, 212, 243, 273, 304, 334};
//计算两个年份1月1日之间相差的天数
LONG iDiffDays =(iEndYear - iStartYear)*365;
iDiffDays += (iEndYear-1)/4 - (iStartYear-1)/4;
iDiffDays -= ((iEndYear-1)/100 - (iStartYear-1)/100);
iDiffDays += (iEndYear-1)/400 - (iStartYear-1)/400;
//加上iEndYear年1月1日到iEndMonth月iEndDay日之间的天数
iDiffDays += monthday[iEndMonth-1] +
(IsLeapYear(iEndYear)&&iEndMonth>2? 1: 0);
iDiffDays += iEndDay;
//减去iStartYear年1月1日到iStartMonth月iStartDay日之间的天数
iDiffDays -= (monthday[iStartMonth-1] +
(IsLeapYear(iStartYear)&&iStartMonth>2 ? 1: 0));
iDiffDays -= iStartDay;
return iDiffDays;
}
void CCalendar::l_CalcLunarDate(WORD &iYear, WORD &iMonth ,WORD &iDay, LONG iSpanDays)
{
//阳历1901年2月19日为阴历1901年正月初一
//阳历1901年1月1日到2月19日共有49天
if(iSpanDays <49)
{
iYear = START_YEAR-1;
if(iSpanDays <19)
{
iMonth = 11;
iDay = 11+WORD(iSpanDays);
}
else
{
iMonth = 12;
iDay = WORD(iSpanDays) -18;
}
return ;
}
//下面从阴历1901年正月初一算起
iSpanDays -=49;
iYear = START_YEAR;
iMonth = 1;
iDay = 1;
//计算年
LONG tmp = LunarYearDays(iYear);
while(iSpanDays >= tmp)
{
iSpanDays -= tmp;
tmp = LunarYearDays(++iYear);
}
//计算月
tmp = LOWORD(LunarMonthDays(iYear, iMonth));
while(iSpanDays >= tmp)
{
iSpanDays -= tmp;
if(iMonth == GetLeapMonth(iYear)
没有合适的资源?快使用搜索试试~ 我知道了~
中国农历,有详细的阴历算法
共63个文件
bmp:44个
h:6个
cpp:5个
5星 · 超过95%的资源 需积分: 50 89 下载量 151 浏览量
2008-12-27
11:26:20
上传
评论 3
收藏 44KB RAR 举报
温馨提示
这本来是我为一个商业PDA产品开发的日历程序,最近移植于PC机上, 所以算法 和数据部分是用纯C++写的,不涉及MFC,所有的代码都是以短节省存储空间为主要目 的. 很高兴你对这些代码有兴趣,你可以随意复制和使用些代码,唯一有一点小小的 愿望:在你使用和复制给别人时,别忘注明这些代码作者:-)。程序代码也就罢了,后 面的数据可是我辛辛苦苦从万年历上找出来输进去的。
资源详情
资源评论
资源推荐
收起资源包目录
.rar (63个子文件)
20070323_lunar
Calendar.rc 8KB
Calendar.clw 2KB
StdAfx.cpp 210B
Calendar.dsw 539B
Calendar.h 1KB
CalendarFrm.cpp 9KB
resource.hm 169B
StdAfx.h 999B
CalendarDlg.cpp 5KB
CalendarDlg.h 1KB
Resource.h 3KB
Release
Calendar.exe 44KB
Calendar.dsp 7KB
res
35.bmp 182B
38.bmp 182B
06.bmp 182B
01.bmp 182B
19.bmp 182B
bitmap43.bmp 246B
11.bmp 182B
16.bmp 182B
31.bmp 182B
07.bmp 182B
41.bmp 182B
22.bmp 182B
03.bmp 182B
30.bmp 182B
25.bmp 182B
04.bmp 182B
12.bmp 182B
15.bmp 182B
26.bmp 182B
37.bmp 182B
14.bmp 182B
10.bmp 182B
29.bmp 182B
23.bmp 182B
02.bmp 182B
idr_main.ico 1KB
20.bmp 182B
05.bmp 182B
bitmap1.bmp 182B
27.bmp 182B
36.bmp 182B
21.bmp 182B
17.bmp 182B
28.bmp 182B
18.bmp 182B
40.bmp 182B
09.bmp 182B
24.bmp 182B
32.bmp 182B
08.bmp 182B
39.bmp 182B
13.bmp 182B
33.bmp 182B
Calendar.rc2 400B
34.bmp 182B
42.bmp 182B
Calendar1.cpp 30KB
Calendar.cpp 2KB
Calendar1.h 5KB
CalendarFrm.h 3KB
共 63 条
- 1
薄皮虾壳
- 粉丝: 1
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 修复windows系统库软件
- OpenCv 使用fffffffff
- 正点原子开拓者FPGA多人表决器代码项目
- EOP-Last5Years.txt
- windows 32位、64位系统常见缺少的库
- 毕业设计基于springboot+vue实现的求职招聘类型网站源码+数据库(高分项目).zip
- 535springboot + vue 体质测试数据分析及可视化设计.zip(可运行源码+数据库文件+文档)
- python毕业设计-基于Django+OpenCV的二维码生成与识别系统源码.zip
- 基于springboot+vue实现的求职招聘类型网站源代码+数据库(优质毕设项目).zip
- iOS APP提审checklist
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论8