MFC Month Calendar Control 控件使用

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

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;
	}
}
时间: 2024-10-13 12:44:23

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

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

如果希望对显示在MFC Picture Control 控件里的图像进行操作,比如画线画点之类的,可以利用 OpenCV 结合 MFC 本身的鼠标响应函数来实现. 如何将图像显示到 Picture Control 控件不谈,本文是采用的这篇博客所介绍的方法实现的. 点击打开链接 给对话框添加 WM_LBUTTONDOWN 鼠标左键点击消息,在消息响应函数中添加如下代码: void CMFCOpenCVShowDlg::OnLButtonDown(UINT nFlags, CPoint point

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

OpenCV 2.2 以及后面的版本取消掉了 CvvImage.h 和CvvImage.cpp 两个文件,直接导致了苦逼的程序员无法调用里面的显示函数来将图片显示到 MFC 的 Picture Control 控件中.为此,网上很多人表示只要将那两个文件人为的提取出来然后放到工程里面就解决问题了,也提供了两个文件的下载,但是这麻烦不说,还会导致一些奇奇怪怪的报错(至少本人是这样的,很崩溃!).所以在了解了一些gdi绘图之后结合网上的代码写了如下的函数,只需调用就可以将OpenCV的图片显示在上面

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

OpenCV 2.2 以及后面的版本号取消掉了 CvvImage.h 和CvvImage.cpp 两个文件,直接导致了苦逼的程序猿无法调用里面的显示函数来将图片显示到 MFC 的 Picture Control 控件中.为此,网上非常多人表示仅仅要将那两个文件人为的提取出来然后放到project里面就解决这个问题了,也提供了两个文件的下载,可是这麻烦不说.还会导致一些奇奇怪怪的报错(至少本人是这种,非常崩溃!).所以在了解了一些gdi画图之后结合网上的代码写了例如以下的函数,仅仅需调用就能够将O

MFC编程 | tab control控件的使用

因为课程需要,会用到MFC编程,所以讲一些经验总结下,以便日后使用查询. // tab control控件的使用 // 建立一个Cluster窗口,通过tab可以切换成C-Means和Fuzzy C-Means窗口 1.插入对话框((ID:IDD_DIG_CLUSTER),删去默认生成的控件“OK”和“Cancel”后,插入一个tab control控件(ID:IDC_TAB).通过类向导,给此对话框定义一个类CCluster,给tab控件定义变量m_tab. 2.插入另外两个对话框作为C-Me

MFC List Control控件添加单元格编辑和单元格下拉列表项以适用于数据库相关操作

作为现代的软件,往往是连着数据库的,而连着和用户方便地操作之间,还有着界面这道坎.MFC是Windows上比较好开发用户界面的框架,然而其自带的控件中没有对于数据库表格支持较好的控件,而使用网上提到的 DataGrid 等控件在本人的win8.1+VS2013平台上老出现找不到控件或者头文件的问题,搞的烦死人.最后想到 List Control 控件只要稍作修改,加上单元格编辑和单元格下拉列表,其实就能和数据库进行良好的对接,一百度,果然有人已经做了这件事,实在是太让人感动了!       

基于wince的MFC Tab Control控件的使用

1,先建立一个对话框MFC应用程序,然后在工具箱里面把Tab Control控件放到对话框中的合适位置上. 再在对话框类中,声明一个CTabCtrl变量: CTabCtrl m_tab; 变量m_tab用来与对话框中的Tab Control控件交互,为此要在DoDataExchange函数中加入DDX_Control语句: 1 //{{AFX_DATA_MAP(CTABDlg) 2 DDX_Control(pDX, IDC_TAB, m_tab); 3 //}}AFX_DATA_MAP IDC_

通过编写串口助手工具学习MFC过程&mdash;&mdash;(七)添加Tab Control控件

通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个串口助手再次熟悉一下MFC,并做了一下记录,以便方便以后查阅.做的过程中多是遇到问题直接百度和谷歌搜索来的,所以很多都是不求甚解,知其然不知其所以然.另外做此工具只是为了熟悉了解,许多功能还没有完善!(开发工具VS2008) (七)添加Tab Control控件 要在对话框里添加标签页,点击标签页上

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

1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后Finish.?2. 删除对话框上默认添加的三个控件. 添加Tab Control控件并在Property属性中设置ID为IDC_TABTEST 在More Styles里勾上Bottom. 调速尺寸使其布满整个对话框, 我这边Tab Control的尺寸最后为164X203. 在ClassWizard为其添加变量, 变量名为m_tab. 类型为CTabCtrl.?3. 在对话框的初始化函数OnInitDialog

mfc Picture Control 控件属性

知识点: Picture Control 控件属性 CStatic类 图片控件 图片控件使用 一.图片控件属性 Picture Control 属性: Type:Frame //框架 Type:Etched Horz水平蚀刻线条 Type:Etched Vert垂真蚀刻线条 Type:Rectangle实心矩形 Type:Bitmap位图 Type:Icon 图标 Type:Enhanced Metafile 增强图元 支持wmf格式图片 Type:Owner Draw 自绘图 Color:颜色