|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
|
Announcements
Chapters
Services
Feature Zones
|
What is this control?This is an attempt to reproduce the functionality of MS Outlook Calendar control as it appears in the Calendar view. It supports similar features as the MS Calendar control. This is a work in progress. Study the code in the demo, there you will see how to access the date item data when overriding clicks and double clicks. Below are a couple of screen shots of the control: Month view
Week view
IntroductionLike many developers I searched within the CodeProject and other sites for a control similar to this one but could not find one so I decided to create my own. I needed a control with similar functionality, but not exactly the same as the Calendar control found in MS Outlook. This piece or code/control was developed to help me display appointments and tasks in a Real Estate program that I am developing. I did not like the one that was already available but I wanted the look and feel to be similar to MS-Outlook. I hope you will find this control useful and use it in your applications. What this code provides
One of the things I learned about the original Outlook Calendar control after I created this control was that it can display week views from 1 to 6 weeks at a time. This is one of the modifications I will be making to this control in the near future. Disclaimer and acknowledgementsThis control and the source code are free to be used with commercial and non commercial software. However you are not allowed to sell the source code for profit. The author of this article does not take any responsibility for any damage done or caused directly or indirectly by this source code or an application using this source code. If you decide to redistribute the source code, please include my name and e-mail somewhere in the source. If you create an application with this control, I would appreciate an email describing what it is or a screen shot of it so that I'll know it is being used and may serve as an incentive to continue improving this code/control. Special thanks go to Tom Furuya for sharing his excellent ColorSpy utility. It was very useful in determining the colors and the magnified views of the mouse pointer locations were critical in getting some of the drawing dimensions correct in this control. BackgroundThe code and its classes in this article provide all the functionality to not only display a Calendar control in Week or Month views but also to include and display entries (Appointments/Tasks) for the selected dates. Although this code does not provide the dialog boxes or windows necessary to enter entries it does provide you with the methods, properties and overridables necessary to create, modify and delete these entries. I know this code is not perfect and that someone may actually find a better way to paint the control. I have done all that I can to make sure the painting of different views are as efficient as possible. Of course, if I make further enhancements or fixes to the code or if any of you come up with fixes, I will update this article. Using the code
You also need to add a custom control object within your FormView or Dialog Window. Make sure to name the class: Visual Studio 6
Visual Studio .NET 2003
Now we create the variable for this control. Assign the variable name Next, you need to attach the variable name to the custom control. Within the FormView or Dialog class code, locate the DDX_Control(pDX, IDC_CALCTRL, m_WMCtrl); Now, within the FormView or Dialog box (usually within COleDateTime dtS = COleDateTime::GetCurrentDate(); // Display Calendar in Month View m_WVCtrl.SetCurrentDate(dtS, FALSE, WV_MONTHVIEW); or COleDateTime dtS = COleDateTime::GetCurrentDate(); // Display Calendar in Week View m_WVCtrl.SetCurrentDate(dtS, FALSE, WV_WEEKVIEW); If you need to change the view of the control at runtime you can use the m_WMCtrl.SetView(WV_WEEKVIEW, TRUE); or m_WMCtrl.SetView(WV_MONTHVIEW, TRUE); When you compile your code and display the window which contains this custom control you should see the Calendar control displayed in Week or Month view. Member functionsThese functions are in alphabetical order. void CWMDateCtrl::DeleteAllItems()DescriptionThis method is used to delete all the data items related to this control. Syntaxm_WVCtrl.DeleteAllItems(); BOOL CWMDateCtrl::DeleteItem(long nItem)DescriptionThis method is used to delete a specific data item as specified by the Syntaxvoid CWeekViewDlg::OnCellDblClick(NMHDR *pNotifyStruct, LRESULT *pResult) { NM_WVCELLDATA *pData = (NM_WVCELLDATA *)pNotifyStruct; if (pData->pItem != NULL) m_WVCtrl.DeleteItem(pData->nItem); } COleDateTime CWMDateCtrl::GetCurrentDate()DescriptionReturns the current date for this control. The current date is the highlighted cell within the Week or Month view. SyntaxCOleDateTime dtCurDate = m_WVCtrl.GetCurrentDate(); void CWMDateCtrl::GetDateRange(COleDateTime *pStartDate, COleDateTime *pEndDate)DescriptionUse this method to retrieve the current start and end date based on how the control is displayed. If the control is displayed in Month view, as pictured above, this method will return the following values: If the control is displayed in Week view, as pictured above, this method will return the following values: Syntax// Display Date Range!! CString strBuf; COleDateTime dtS, dtE; m_WVCtrl.GetDateRange(&dtS, &dtE); strBuf.Format("Date Range: %s - %s", dtS.Format("%m/%d/%Y"), dtE.Format("%m/%d/%Y")); int CWMDateCtrl::GetDay()int CWMDateCtrl::GetMonth()int CWMDateCtrl::GetYear()DescriptionThis method returns the day, month or year of the current date. Syntaxint nCurrentDate = m_WVCtrl.GetDay(); int nCurrentMonth = m_WVCtrl.GetMonth(); int nCurrentYear = m_WVCtrl.GetYear(); int CWMDateCtrl::GetView()DescriptionThis method returns one of two values Syntaxif (m_WVCtrl.GetView() == WV_WEEKVIEW) m_WVCtrl.SetView(WV_MONTHVIEW); else m_WVCtrl.SetView(WM_WEEKVIEW); DWORD CWMDateCtrl::GetItemData(long nItem)DescriptionReturns a 32-bit application-specific value associated with the specified item. SyntaxNM_WVCELLDATA *pData = (NM_WVCELLDATA *)pNotifyStruct; if (pData->pItem != NULL) DWORD dwValue = m_WVCtrl.GetItemData(pData->nItem); ... long CWMDateCtrl::InsertItem(COleDateTime dtStart, COleDateTime dtEnd, CString strLine /*=""*/, int nImage /*=-1*/)DescriptionInserts a date item into the custom control. For an item to be displayed within the control the first parameter of this method should be within range of the date set by the Syntax// Set WVCtrl date for week display dtS.SetDate(2005, 2, 19); m_WVCtrl.SetCurrentDate(dtS, FALSE, WV_MONTHVIEW); dtS.SetDateTime(2005, 2, 14, 8, 30, 0); dtE.SetDateTime(2005, 2, 14, 9, 45, 0); m_WVCtrl.InsertItem(dtS, dtS, "Monday Appointment", 0); dtS.SetDateTime(2005, 2, 15, 22, 30, 0); dtE.SetDateTime(2005, 2, 15, 23, 45, 0); nItem = m_WVCtrl.InsertItem(dtS, dtE, "Tuesday Task", 1); BOOL CWMDateCtrl::IsMilitaryTime()DescriptionReturns a Syntaxif (m_WVCtrl.IsMilitaryTime()) m_WVCtrl.SetMilitaryTime(FALSE); else m_WVCtrl.SetMilitaryTime(TRUE); void CWMDateCtrl::SetBkColor(COLORREF clrBk)DescriptionChanges the background color of the Calendar control. Syntaxm_WVCtrl.SetBkColor(RGB(255, 0, 0); // Set to red // background color void CWMDateCtrl::SetCurrentDate(COleDateTime dtDate, BOOL bMilitaryTime /*= FALSE*/, int nView /*= WV_WEEKVIEW*/)DescriptionThis method is used to specify the date that is to be used as the current date, if we are displaying the date item times using Military or Regular time and the type of view to be used. Using this method you have to specify a date, preferably the current date (this would be the highlighted date within the control). This control would take this date and determine which other dates are to be painted based on the specified view. SyntaxCOleDateTime dtToday = COleDateTime::GetCurrentTime(); // Display calendar in month view and // today's date would be highlighted. m_WVCtrl.SetCurrentDate(dtToday, FALSE, WV_MONTHVIEW); void CWMDateCtrl::SetFont(CString strFName, int nSize)DescriptionUse this method to change the default font and font size to be used to paint the Calendar control. Syntaxm_WVCtrl.SetFont("Verdana", 14); void CWMDateCtrl::SetImageList(CImageList *pImgList)DescriptionUse this method to attach an image list to the Calendar control. The example below shows how to attach a 256 color 16 X 16 bitmap to the control. Syntax// Setup the Calendar control CBitmap bmpImgSm; m_ImgList.Create(16, 16, ILC_COLOR24 | ILC_MASK, 0, 1); // Load 256 color bitmap containing the images... bmpImgSm.LoadBitmap(IDB_BMPREMINDER); // Place bitmap into image list... m_ImgList.Add(&bmpImgSm, RGB(0, 255, 0)); // Attach image list to the Calendar Control m_WVCtrl.SetImageList(&m_ImgList); void CWMDateCtrl::SetItemColor(long nItem, COLORREF clrItem)DescriptionUse this method to set or change the background color of individual date items. This is useful to identify the type of appointments and tasks based on color. SyntaxdtSDate.SetDateTime(2005, 8, 6, 12, 00, 0); // 45 minutes for lunch dtWDate.SetDateTime(2005, 8, 6, 12, 45, 0); // Display as a task, use task image int nItem = m_WVCrtrl.InsertItem(dtSDate, dtEDate, "Lunch with Rolando", 1); // Set appointment to green color m_WMCtrl.SetItemColor(nItem, RGB(0, 255, 0)); dtSDate.SetDateTime(2005, 8, 6, 8, 30, 0); // 2 hour appointment dtWDate.SetDateTime(2005, 8, 6, 10, 30, 0); nItem = m_WVCrtrl.InsertItem(dtSDate, dtEDate, "Sales meeting", 0); // Set appointment to blue color m_WMCtrl.SetItemColor(nItem, RGB(0, 0, 255)); void CWMDateCtrl::SetItemData(long nItem, DWORD dwData)DescriptionThis function sets the 32-bit application-specific value associated with the item specified by Syntaxint nItem = m_WVCtrl.InsertItem(dtS, dtE, "Lunch time"); // 999 use this internal value m_WVCtrl.SetItemData(nItem, 999); void CWMDateCtrl::SetMilitaryTime(BOOL bMil)DescriptionUse this method to set or change the display of date item times. Setting the parameter to Syntaxm_WVCtrl.SetMilitaryTime(TRUE); void CWMDateCtrl::SetView(int nV, BOOL bRedraw /*=TRUE*/)DescriptionUse this method to change the way the Calendar control is painted. The values which can be used are Syntaxif (m_WVCtrl.GetView() == WV_WEEKVIEW) m_WVCtrl.SetView(WV_MONTHVIEW); else m_WVCtrl.SetView(WM_WEEKVIEW); Override functionsCurrently, there are only two messages that you can override in order to interact with this control. The Calendar control will notify the parent window with a
NM_WVCELLDATA notification structuretypedef struct tagNM_WVCELLDATA { NMHDR hdr; CWVCellData *pCell; CWVCellDataItem *pItem; int iRow; int iColumn; BOOL bDNFClicked; long nItem; } NM_WVCELLDATA; CWVCellData *pCell;This member variable contains all the information regarding the actual date cell of the Calendar control. You have access to many functions and procedures which directly affect the appearance and behaviour of the Calendar date cell. Take a look at the WVCellData.h and WVCellData.cpp files for more information on this Calendar object. I believe all the procedures and functions are self explanatory. CWVCellDataItem *pItem;This member variable is usually Take a look at the WVCellDataItem.h and WVCellDataItem.cpp files for more information on this Calendar date item object. I believe the procedures and functions are self-explanatory. int iRow;int iCol;These two member variables contain the mouse pointer coordinates where the actual click or double click has occurred. BOOL bDNFClicked;This is a special member variable. This member variable will have a value of
When the user clicks on this object, the Calendar control will notify the parent window as if the user has double clicked the cell at which point this member variable will be set to long nItem;This is the ID number given to the Calendar date item ( Look at the History
| ||||||||||||||||||||||