在上层软件编程中,往往须要提供一个月历控件让用户选择对应日期或者用此月历控件来强调特定的一天。

MFC的 Month Calendar Control 控件自系统升级到 Windows 7 之后,对于日期控件所能做的操作变少了,不能对指定的日期的背景颜色进行更改。在网上查了非常久之后发现是操作系统画图风格的关系。

在这样的情况下。

仅仅能通过加粗特定日期的字体粗细来凸显该日期的不同(至少本人仅仅想到这个办法)。

首先拉入 Month Calendar Control 控件,为控件加入一个变量叫做 monthcontrol。将控件的 Day States 和 No Trailing Dates 属性置为 True。

在project的初始化代码中增加例如以下代码:

int nCount;
SYSTEMTIME timeFrom;
SYSTEMTIME timeUntil;
nCount = monthcontrol.GetMonthRange(&timeFrom, &timeUntil, GMR_DAYSTATE);//返回月历显示的月份数,将控件的No Trailing Dates属性设为True之后,一个页面仅仅显示一个月份
if (nCount == 1)
{
LPMONTHDAYSTATE pDayState;//日期状态结构体
pDayState = new MONTHDAYSTATE[nCount];
memset(pDayState, 0, sizeof(MONTHDAYSTATE)* nCount);
pDayState[0] |= 1 << (10 - 1);//设置本月的10日要加粗
VERIFY(monthcontrol.SetDayState(nCount, pDayState));//设置本月的10日加粗
delete[]pDayState;
}

这时候编译运行project就会看到月历的10号被加粗了,可是一旦点击月份切换,其它月份的页面就会有非常多莫名其妙的被加粗的日期。本人採取的办法是在控件的MCN_VIEWCHANGE控件事件中加入响应函数,让一个计时器启动,例如以下:

timerun = true;//计时器启动标志
SetTimer(0, 10, 0);//计时器启动

加入对话框的 WM_TIMER 消息

int nCount;
SYSTEMTIME timeFrom;
SYSTEMTIME timeUntil;
nCount = monthcontrol.GetMonthRange(&timeFrom, &timeUntil, GMR_DAYSTATE);//返回月历显示的月份数,将控件的No Trailing Dates属性设为True之后,一个页面仅仅显示一个月份
if (nCount == 1)
{
LPMONTHDAYSTATE pDayState;//日期状态结构体
pDayState = new MONTHDAYSTATE[nCount];
memset(pDayState, 0, sizeof(MONTHDAYSTATE)* nCount);
pDayState[0] |= 1 << (10 - 1);//设置本月的10日要加粗
VERIFY(monthcontrol.SetDayState(nCount, pDayState));//设置本月的10日加粗
delete[]pDayState;
if (timerun == true)
{
timerun = false;
KillTimer(0);
}
}

在控件的MCN_SELCHANGE控件事件中也加入响应函数,例如以下:

int nCount;
SYSTEMTIME timeFrom;
SYSTEMTIME timeUntil;
nCount = monthcontrol.GetMonthRange(&timeFrom, &timeUntil, GMR_DAYSTATE);//返回月历显示的月份数,将控件的No Trailing Dates属性设为True之后,一个页面仅仅显示一个月份
if (nCount == 1)
{
LPMONTHDAYSTATE pDayState;//日期状态结构体
pDayState = new MONTHDAYSTATE[nCount];
memset(pDayState, 0, sizeof(MONTHDAYSTATE)* nCount);
pDayState[0] |= 1 << (10 - 1);//设置本月的10日要加粗
VERIFY(monthcontrol.SetDayState(nCount, pDayState));//设置本月的10日加粗
delete[]pDayState;
}

到此。全部月份页面中的10号就都加粗了,而不影响别的日期。假设稍加留意会发现上面代码的反复率很高。为看起来简洁。能够用一个函数来封装一下。这样能大量缩减代码。

假设结合对于目录和文件的操作。能够实现搜索全部盘符指定目录中指定后缀文件。然后将月历中跟文件的改动日期同样的日期加粗的功能。代码例如以下:

void CDataTestDlg::selectfile()
{
WCHAR Drive[MAX_PATH] = { 0 };
int i = 0;
GetLogicalDriveStrings(MAX_PATH, Drive);
CString myDrive;
CString strDBPath;
bool dayset[33] = { 0 };
int datlong = 0;
int nCount;
int month = 0;
while (Drive[i - 1] != '\0' || Drive[i] != '\0')
{
myDrive = L"";
myDrive = Drive[i];
myDrive = myDrive + L":\\";
strDBPath = myDrive + L"h264视频";//搜索全部盘符以下的名为“h264视频”的目录
HTREEITEM hItem, hSubItem;
if (PathFileExists(strDBPath))//推断目录是否存在
{
CFileFind finder;
vector<CString> allfile;
vector<CString> allfile1;
CString mydrivewholefilepath;
mydrivewholefilepath = strDBPath + L"\\*.*";
bool bworking = finder.FindFile(mydrivewholefilepath);
while (bworking)
{
bworking = finder.FindNextFile();
allfile.push_back(finder.GetFileName());//全部文件。目录的名称
}
for (int i = 0; i<allfile.size(); i++)
{
int flag = allfile[i].Find(L".h264");//找目录以下后缀为“.h264”的文件
if (flag >= 0)
{
CString myfilepath;
myfilepath = strDBPath + L"\\" + allfile[i];
//获得指定路径文件的改动日期
SYSTEMTIME time;
CStdioFile file;
file.Open(myfilepath, CFile::modeRead);
FILETIME file_time;
GetFileTime(file.m_hFile, NULL, NULL, &file_time);
FileTimeToSystemTime(&file_time, &time); SYSTEMTIME timeFrom;
SYSTEMTIME timeUntil;
nCount = monthcontrol.GetMonthRange(&timeFrom, &timeUntil, GMR_DAYSTATE);
if (timeFrom.wYear == time.wYear && timeFrom.wMonth == time.wMonth)
{
month = timeFrom.wMonth;
datlong = timeUntil.wDay - timeFrom.wDay;
dayset[time.wDay] = true;
} file.Close();
}
}
finder.Close();
}
i += 4;
}
if (nCount == 1)
{
LPMONTHDAYSTATE pDayState;//日期状态结构体
pDayState = new MONTHDAYSTATE[nCount];
memset(pDayState, 0, sizeof(MONTHDAYSTATE)* nCount);
for (int i = 0; i <= datlong + 1; i++)
{
if (dayset[i] == true)
{
pDayState[0] |= 1 << (i - 1);
}
}
VERIFY(monthcontrol.SetDayState(nCount, pDayState));
delete[]pDayState;
}
}

MFC Month Calendar Control 控件使用的更多相关文章

  1. OpenCV 2.2版本号以上显示图片到 MFC 的 Picture Control 控件中

    OpenCV 2.2 以及后面的版本号取消掉了 CvvImage.h 和CvvImage.cpp 两个文件,直接导致了苦逼的程序猿无法调用里面的显示函数来将图片显示到 MFC 的 Picture Co ...

  2. MFC编程 | tab control控件的使用

    因为课程需要,会用到MFC编程,所以讲一些经验总结下,以便日后使用查询. // tab control控件的使用 // 建立一个Cluster窗口,通过tab可以切换成C-Means和Fuzzy C- ...

  3. OpenCV 通过 MFC 的 Picture Control 控件操作图像

    假设希望对显示在MFC Picture Control 控件里的图像进行操作,比方画线画点之类的,能够利用 OpenCV 结合 MFC 本身的鼠标响应函数来实现. 怎样将图像显示到 Picture C ...

  4. 【MFC】Tab Control 控件的使用(转)

    原文转自 http://blog.csdn.net/hustspy1990/article/details/5425365 1.先建立一个对话框MFC应用程序,然后在工具箱里面把Tab Control ...

  5. C++MFC之picture control控件铺满图片

    UpdateData(true); //更新路径公共变量     CString m_path = m_edit1.GetString();      if(m_path=="") ...

  6. WPF中增加Month Calendar月历控件

    XAML代码:(这里使用了codeproject.com网站上的一个Dll,你可以在这里下载它:http://www.codeproject.com/cs/miscctrl/MonthCalendar ...

  7. C++ MFC Tab Control控件的详细使用

    1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后Finish. 2. 删除对话框上默认添加的三个控件. 添加Tab Control控件并在Property属性中设置I ...

  8. 通过编写串口助手工具学习MFC过程——(七)添加Tab Control控件

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  9. C++ 关于MFC List Control 控件的使用事项 原创

    1\在开发项目时,使用到了 listcontrol 控件,就一些问题,做一下备注,以备以后使用 (1)  给list项目 删除所有的项目  DeleteAllItems(); (2) 给list项目 ...

随机推荐

  1. STM32中如何对printf函数重定向

    通过USART1向计算机的串口调试助手打印数据,或者接收计算机串口调试助手的数据,接下来我们现STM32工程上的printf()函数,方便用于程序开发中调试信息的打印. 方法一:使用MicroLIB库 ...

  2. shell 几中专用修饰符 :- :+ := ${variable:offset:length}

    1.${variable:-word} ${variable:-word} 如果variable已经被设置了,且不为空,则代入它的值,否则代入word; $ fruit=peach $ echo ${ ...

  3. 【LeetCode】Valid Parentheses(有效的括号)

    这道题是LeetCode里的第20道题. 题目要求: 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭 ...

  4. SQL注入与xss

    1. 什么是SQL注入 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.通过递交参数构造巧妙的SQL语句,从而成功获取 ...

  5. BZOJ 2780 [Spoj]8093 Sevenk Love Oimaster ——广义后缀自动机

    给定n个串m个询问,问每个串在n个串多少个串中出现了. 构建广义后缀自动机,(就是把所有字符串的后缀自动机合并起来)其实只需要add的时候注意一下就可以了. 然后对于每一个串,跑一边匹配,到达了now ...

  6. jenkins执行自动化用例(详细、有用、mark 优先级高高高)

    http://blog.sina.com.cn/s/blog_68f262210102vx8o.html 第七章 测试用例接入jenkins自动运行 ------Web自动化测试之Webdriver+ ...

  7. VMware---之网卡设置

    闲来无事,扯点皮,详细说下NAT配置过程 NAT全称Network Address Translation网络地址转换,顾名思义,配置的重点也是地址转换. 步骤1.配置局域网段及网关 打开vmware ...

  8. POJ 2279

    线性DP 本题的正解是杨氏矩阵与钩子定理 但是这道题用DP的思想非常好 但是这样会MLE... #include <iostream> #include <cstdio> #i ...

  9. Spring学习之路——简单入门HelloWorld

    Spring简单介绍 Spring是一个提供了解决J2EE问题的一站式框架. Spring的核心是反转控制,通过配置文件完成业务对象之间的依赖注入,他鼓励一个良好的习惯,就是注入对接口编程而不是对类编 ...

  10. 实战分析Tomcat的类加载器结构(使用Eclipse MAT验证)

    一.前言 在各种Tomcat相关书籍,书上都提到了其类加载器结构: 在Tomcat 7或者8中,共享类和Catalina类加载器在catalina.properties中都是没配置的,请看: 所以,c ...