问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求MFC万年历源码,感激不禁!!

发布网友 发布时间:2024-07-02 14:20

我来回答

1个回答

热心网友 时间:2024-07-22 04:14

VC有自己的日历控件 CMonthCalCtrl
http://www.codeguru.com/code/legacy/controls/MonthCalCtrlCalendar.zip

阅读MSDN2003,我们可以看到,MFC提供了18种通用控件,具体是哪18种,我不详细列出,可以在MSDN2003的MSDN \ Visual Studio .NET \ Visual C++ \ 添加功能 \ MFC \ 用户界面 \ 控件 \ 中看到。其中每一个控件都对应了一个MFC类,这些类的详细说明可以在MSDN2003 的MSDN \ Visual Studio .NET \ Visual C++ \ Visual C++参考 \ MFC Reference \ MFC Classes \ 中找到。

在MFC中添加控件有两种方法。

第一种是直接手动从“Controls”工具栏中拖动控件到窗体上,这种方法比较直观,但是仅仅局限与基于对话框的MFC应用程序。为此我将重点描述第二种方法。

第二种方法是使用MFC类动态添加控件,我将以Month Calendar控件为例介绍这中方法。Month Calendar控件对应的MFC类是CMonthCalCtrl。

第一步,在窗体中添加成员指针:CMonthCalCtrl *m_pCtrlMonth

第二步,在窗体初始化的时候初始化控件,这里所说的窗体初始化,并不是窗体类的初始化函数,而是OnInitialUpdate()或OnInitDialog()函数

m_pCtrlMonth = new CMonthCalCtrl;

m_pCtrlMonth->Create(WS_VISIBLE|WS_CHILD|WS_BORDER|MCS_NOTODAY,rect,this, IDC_MCC );

m_pCtrlMonth->ShowWindow(SW_SHOW);

Create()函数有四个参数:

第一个参数是一些宏定义的组合,这些宏指定了控件的风格,例如WS_VISIBLE表示控件初始化可见,WS_CHILD表示控件为子窗体,WS_BORDER表示控件有边框,MCS_NOTODAY是Month Calendar的风格,表示控件不会在底部提示今天的日期。关于控件的风格,可以参考MSDN。在MSDN \ Visual Studio .NET \ Visual C++ \ Visual C++参考 \ MFC Reference \ Structures, Styles, Callbacks, and Message Maps \ Styles Used by MFC \ 中描述了各种窗体风格。具体控件特有的风格,在MSDN描述该控件对应类的Create函数的时候 具体给出。

第二个参数是一个RECT结构体的引用,表示控件在窗体中的位置坐标。

第三个参数是该控件父窗体的指针。

第四个参数是控件的资源ID。可以自己定义#define ID_CONTROL ******。

现在控件已经基本初始化成功,其他的控件也是这样的方式,不同的是控件的风格和控件对应的MFC类。接下来就可以设置控件的属性和添加控件消息。这里,我只介绍Month Calendar控件两个常用的消息。

MCN_SELECT消息:当完成日期选定的时候触发此消息的消息处理函数。

NM_RELEASEDCAPTURE消息:在Month Calendar控件中有一个Scoll,击中Scoll就会触发这个消息的消息处理函数,默认的,点击一次Scoll,控件切换一个月,可以通过SetMonthDelta函数设置切换几个月。m_pCtrlMonth->SetMonthDelta(3)表示一次切换三个月。

控件中如果添加MCS_DAYSTATE风格,可以显示日期的状态。此状态强调当前显示的月的某些日期,状态信息表示为 32 位数据类型,MONTHDAYSTATE。MONTHDAYSTATE 位域(1 到 31)中的每一位表示一月中一天的状态。如果某个位打开,相应的日将用粗体显示;否则,日将以无强调的方式显示。有两种方法用于设置月历 (MonthCalendar) 控件的日状态:通过调用 CMonthCalCtrl::SetDayState 显式地设置或通过处理 MCN_GETDAYSTATE 通知消息来设置。

MCN_GETDAYSTATE消息:此方法在MSDN \ Visual Studio .NET \ Visual C++ \ 添加功能 \ MFC \ 用户界面 \ 控件 \ 使用 CMonthCalCtrl \ 设置月历 (MonthCalendar) 控件的日状态 \ 中有详细的中文说明。

一种方法是调用SetDayState函数,例如在NM_RELEASEDCAPTURE消息处理函数中,初始化这个月的哪些天需要突出显示:

SYSTEMTIME timeFrom;

SYSTEMTIME timeUntil;

int nCount =m_pCtrlMonth ->GetMonthRange(&timeFrom,&timeUntil,GMR_DAYSTATE);

LPMONTHDAYSTATE pDayState;

pDayState = new MONTHDAYSTATE[nCount];

memset(pDayState, 0, sizeof(MONTHDAYSTATE) * nCount);

int nIndex = (timeFrom.wDay == 1) ? 0 : 1;

pDayState[nIndex] |= 1 << 3; // 4th day

pDayState[nIndex] |= 1 << 18; // 19th day

pDayState[nIndex] |= 1 <<24; // 25th day

VERIFY(m_pCtrlMonth ->SetDayState(nCount, pDayState));

delete [] pDayState;

这段代码是MSDN中介绍SetDayState函数时给出的。原理其实很简单,控件中有个属性表示这些日期的状态,自己定义一个该属性的副本,然后设置副本中日期的状态,最后调用SetDayState函数把这个副本的信息传递给控件的属性。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
脾基本简介 人体有2个脾脏吗 百度百科 人的脾有几个 我是无锡的,公司需要办理健康证,请问应该到哪里去办理? 儿童健康小常识:让宝宝快乐成长 如何构建认罪认罚案件相对不起诉适用标准 相对不起诉概述 杨笠脱口秀称男人没底线,直言没有男人生活会更幸福,你认可吗? 每个人都是独立的个体都有自己生活的选择方式和权利,别人不要干涉... ...人观点,是我的自由、我的权利别人无权 干涉”这种观点 复东宁大朗是什么意思 如何使用智能寄存柜? 我和不是很熟悉的人一起会无聊,而且时间长了我就想离开,比方这次出差... 乌龟盲盒哪家好 大朗镇的特产小吃? 中外合资公司股权转让的程序和条件和比较 劈的组词劈有什么意思 ...一个去湿的一个补血益气什么的emm还是要搁几天的分开喝啊?_百度知 ... 看见朋友拿了个白色的手机,背后是emm标志的,哪位大神知道是什么牌子啊... 小鸟棕色,翅膀羽毛中间黑色两侧浅黄色,爪子和嘴黑色,尾巴长 为什么win7系统播放视频只有声音? [玫瑰][衰][凋谢][心碎][敲打][Emm]什么意思 QQ名字怎么才能修改 信贷大数据是什么意思? 好听的吃鸡网名情侣好听的吃鸡昵称情侣 电脑看视频只有声音怎么解决啊 新建实验大楼消防设施如何验收 本地视频为什么只显示声音不显示画面呢? 途观L旗舰版蓝牙问题? 2022途观L首保会刷转向曲线 精神病人怕警察吗 ...现在好像没朋友太无聊了怎么办啊?以前的熟悉的城市是不想回_百度... 假如你在一个不熟悉地方,在那里一群人玩,只有你无事可做,无聊没人理... 数据存储器和数据寄存器有啥差别 犯罪人被牢改成精神病人怕警察,警察有者仁吗? ...手术切口的地方疤痕粘连造成闭嘴困难该怎么办,,取出假体一个月_百... 瓷砖粘结剂多少钱长宁区 微微一笑很倾城拍摄地在哪里微微一笑很倾城拍摄地 我有个亲戚,胸口和脖子烧伤,下巴和胸口有些粘连,没有伤到面部, 怎么整 ... 东南亚十大旅游景点排行榜东南亚最值得去的地方 熊和先何时担任毕节市七星关区黔西北产业园区党工委副书记? 7岁男童身高120标准吗 集美们,长宁区正规老房装修公司哪家比较好?推荐个比较靠谱的吧_百度... 二婚女人,平时特爱在朋友圈晒生活秀恩爱,可是一到节日什么的就没动静... 大家说说长宁婚房装修公司哪家好些? 旗杆国旗的制作方法 甲状腺结节手术后两个月了现在还是耳朵后面到下巴下面抽胀是怎么... 厚椰乳粉和厚椰乳的区别 我在淘宝网上买了东西之后,快递送错了门该怎么办? 怎么开自行车锁那种U型大钢锁,厚道有大母手指那么粗