1020 lines
42 KiB
C++
1020 lines
42 KiB
C++
// ==========================================================================
|
|
// Class Specification : COXDateTimeCtrl
|
|
// ==========================================================================
|
|
|
|
// Version: 9.3
|
|
|
|
// This software along with its related components, documentation and files ("The Libraries")
|
|
// is © 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is
|
|
// governed by a software license agreement ("Agreement"). Copies of the Agreement are
|
|
// available at The Code Project (www.codeproject.com), as part of the package you downloaded
|
|
// to obtain this file, or directly from our office. For a copy of the license governing
|
|
// this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900.
|
|
|
|
// //////////////////////////////////////////////////////////////////////////
|
|
|
|
// Properties:
|
|
// NO Abstract class (does not have any objects)
|
|
// YES Derived from CWnd
|
|
|
|
// YES Is a Cwnd.
|
|
// YES Two stage creation (constructor & Create())
|
|
// NO Has a message map
|
|
// NO Needs a resource (template)
|
|
|
|
// NO Persistent objects (saveable on disk)
|
|
// NO Uses exceptions
|
|
|
|
// //////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Desciption :
|
|
|
|
/*
|
|
|
|
A COXDateTimeCtrl object encapsulates the functionality of a date and time picker control.
|
|
The date and time picker control (DTP control) provides a simple interface to exchange
|
|
date and time information with a user. This interface contains fields, each of which
|
|
displays a part of the date and time information stored in the control. The user can
|
|
change the information stored in the control by changing the content of the string in a
|
|
given field. The user can move from field to field using the mouse or the keyboard.
|
|
|
|
You can customize the date and time picker control by applying a variety of styles to the
|
|
object when you create it. The following window styles are specific to date and time
|
|
picker (DTP) controls:
|
|
|
|
DTS_APPCANPARSE - Allows the owner to parse user input and take
|
|
necessary action. It enables users to edit within
|
|
the client area of the control when they press the
|
|
F2 key. The control sends DTN_USERSTRING notification
|
|
messages when users are finished.
|
|
DTS_LONGDATEFORMAT - Displays the date in long format. The default format
|
|
string for this style is defined by
|
|
LOCALE_SLONGDATEFORMAT, which produces output like
|
|
"Friday, April 19, 1996".
|
|
DTS_RIGHTALIGN - The drop-down month calendar will be right-aligned
|
|
with the control instead of left-aligned, which is
|
|
the default.
|
|
DTS_SHOWNONE - It is possible to have no date currently selected in
|
|
the control. With this style, the control displays a
|
|
check box that users can check once they have entered
|
|
or selected a date. Until this check box is checked,
|
|
the application will not be able to retrieve the date
|
|
from the control because, in essence, the control has
|
|
no date. This state can be set with the SetTime
|
|
function or verified with the GetTime function.
|
|
DTS_SHORTDATEFORMAT - Displays the date in short format. The default format
|
|
string for this style is defined by LOCALE_SSHORTDATE,
|
|
which produces output like "4/19/96".
|
|
DTS_TIMEFORMAT - Displays the time. The default format string for this
|
|
style is defined by LOCALE_STIMEFORMAT, which produces
|
|
output like "5:31:42 PM".
|
|
DTS_UPDOWN - Appears to the right of the DTP control to modify date
|
|
values. This style can be used instead of the drop-down
|
|
month calendar, which is the default style.
|
|
|
|
|
|
You can set the display format of the DTP control using format styles.
|
|
Date and time picker (DTP) controls support the following format characters.
|
|
"d" The one- or two-digit day.
|
|
"dd" The two-digit day. Single-digit day values are preceded by a zero.
|
|
"ddd" The three-character weekday abbreviation.
|
|
"dddd" The full weekday name.
|
|
"h" The one- or two-digit hour in 12-hour format.
|
|
"hh" The two-digit hour in 12-hour format. Single-digit values are preceded
|
|
by a zero.
|
|
"H" The one- or two-digit hour in 24-hour format.
|
|
"HH" The two-digit hour in 24-hour format. Single-digit values are preceded
|
|
by a zero.
|
|
"m" The one- or two-digit minute.
|
|
"mm" The two-digit minute. Single-digit values are preceded by a zero.
|
|
"M" The one- or two-digit month number.
|
|
"MM" The two-digit month number. Single-digit values are preceded by a zero.
|
|
"MMM" The three-character month abbreviation.
|
|
"MMMM" The full month name.
|
|
"t" The one-letter AM/PM abbreviation (that is, AM is displayed as "A").
|
|
"tt" The two-letter AM/PM abbreviation (that is, AM is displayed as "AM").
|
|
"X" The callback field. The control still uses the other valid format
|
|
characters and queries the owner to fill in the "X" portion. So the owner
|
|
must be prepared to handle the DTN_WMKEYDOWN, DTN_FORMAT, and
|
|
DTN_FORMATQUERY notification messages. Multiple "X" characters can be used
|
|
in series to signify unique callback fields.
|
|
"y" The one-digit year (that is, 1996 would be displayed as "6").
|
|
"yy" The last two digits of the year (that is, 1996 would be displayed as "96").
|
|
"yyy" The full year (that is, 1996 would be displayed as "1996").
|
|
|
|
|
|
Callback fields
|
|
In addition to the standard format characters that define date and time picker (DTP)
|
|
fields, you can customize your output by specifying certain parts of a format string
|
|
as callback fields. To declare a callback field, include one or more "X" characters
|
|
(ASCII Code 88) anywhere in the body of the format string. Like other DTP control
|
|
fields, callback fields are displayed in left-to-right order based on their location
|
|
in the format string. You can create callback fields that are unique to each other
|
|
by repeating the "X" character. Thus, the format string "XXddddMMMdd', 'yyyXXX"
|
|
contains two unique callback fields, "XX" and "XXX". Remember, callback fields are
|
|
treated as valid fields, so your application must be prepared to handle DTN_WMKEYDOWN
|
|
notification messages. When the DTP control parses the format string and encounters
|
|
a callback field, it sends DTN_FORMAT and DTN_FORMATQUERY notification messages.
|
|
The callback field string is included with the notifications so the receiving
|
|
application can determine which callback field is being queried. The owner of the
|
|
control must respond to these notifications to ensure that the custom information
|
|
is properly displayed.
|
|
|
|
|
|
|
|
|
|
//////////////////////////
|
|
Using COXDateTimeCtrl
|
|
|
|
The date and time picker control (COXDateTimeCtrl) implements an intuitive and recognizable
|
|
method of entering or selecting a specific date. The main interface of the control is
|
|
similar in functionality to a combo box. However, if the user expands the control,
|
|
a month calendar control appears (by default), allowing the user to specify a particular
|
|
date. When a date is chosen, the month calendar control automatically disappears.
|
|
|
|
!!!
|
|
Note To use both the CDateTimePicker and COXMonthCalCtrl classes in your project,
|
|
you must include OXDateTimeCtrl.h
|
|
!!!
|
|
|
|
|
|
|
|
|
|
//////////////////////////
|
|
Creating the Date and Time Picker Control
|
|
|
|
How the date and time picker control is created depends on whether you are using the
|
|
control in a dialog box or creating it in a nondialog window.
|
|
|
|
To use COXDateTimeCtrl directly in a dialog box
|
|
|
|
Visual C++ v6.0:
|
|
In the dialog editor, add a Date and Time Picker Control to your dialog template resource.
|
|
Specify its control ID. Specify any styles required, using the Properties dialog box of the
|
|
date and time picker control. Use ClassWizard to map handler functions in the dialog class
|
|
for any date time picker control notification messages you need to handle. In OnInitDialog,
|
|
set any additional styles for the COXDateTimeCtrl object.
|
|
|
|
Visual C++ v5.0:
|
|
In the dialog editor, add a Static Control to your dialog template resource (it will be
|
|
a placeholder for the DTP control). Specify its control ID. In OnInitDialog, you can use
|
|
next code to replace Static Control on our DTP control:
|
|
|
|
CWnd *pFrame=GetDlgItem(IDC_DATETIMEPICKER);
|
|
CRect rcWnd;
|
|
pFrame->GetWindowRect(rcWnd);
|
|
pFrame->DestroyWindow(); //pFrame was just a placeholder anyway.
|
|
ScreenToClient(rcWnd);
|
|
m_ctlDateTimePicker.Create(WS_CHILD|WS_VISIBLE|WS_TABSTOP,rcWnd,this,
|
|
IDC_DATETIMEPICKER);
|
|
|
|
|
|
|
|
To use COXDateTimeCtrl in a nondialog window
|
|
|
|
Declare the control in the view or window class. Call the control's Create member function,
|
|
possibly in OnInitialUpdate, possibly as early as the parent window's OnCreate handler
|
|
function (if you're subclassing the control). Set the styles for the control.
|
|
|
|
|
|
|
|
|
|
//////////////////////////
|
|
Accessing the Embedded Month Calendar Control
|
|
|
|
The embedded month calendar control object can be accessed from the COXDateTimeCtrl object
|
|
with a call to the GetMonthCalCtrl member function.
|
|
|
|
!!!
|
|
Note The embedded month calendar control is used only when the date and time picker
|
|
control does not have the DTS_UPDOWN style set.
|
|
!!!
|
|
|
|
This is useful if you want to modify certain attributes before the embedded control is
|
|
displayed. To accomplish this, handle the DTN_DROPDOWN notification, retrieve the month
|
|
calendar control (using COXDateTimeCtrl::GetMonthCalCtrl), and make your modifications.
|
|
Unfortunately, the month calendar control is not persistent.
|
|
|
|
In other words, when the user requests the display of the month calendar control, a new
|
|
month calendar control is created (before the DTN_DROPDOWN notification). The control is
|
|
destroyed (after the DTN_CLOSEUP notification) when dismissed by the user. This means that
|
|
any attributes you modify, before the embedded control is displayed, are lost when the
|
|
embedded control is dismissed.
|
|
|
|
The following example demonstrates this procedure, using a handler for the DTN_DROPDOWN
|
|
notification. The code changes the background color of the month calendar control,
|
|
with a call to SetMonthCalColor, to gray. The code is as follows:
|
|
|
|
void CMyDlg::OnDropdown(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
|
|
//set the background color of the month to gray
|
|
COLORREF clr= RGB(100, 100, 100);
|
|
SetMonthCalColor(MCSC_MONTHBK, clr);
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
As stated previously, all modifications to properties of the month calendar control are
|
|
lost, with two exceptions, when the embedded control is dismissed. The first exception,
|
|
the colors of the month calendar control, has already been discussed. The second exception
|
|
is the font used by the month calendar control. You can modify the default font by making
|
|
a call to COXDateTimeCtrl::SetMonthCalFont, passing the handle of an existing font.
|
|
The following example (where m_dtPicker is the date and time control object) demonstrates
|
|
one possible method:
|
|
|
|
COXMonthCalCtrl* pMCCtrl= NULL;
|
|
|
|
pMCCtrl= m_dtPicker.GetMonthCalCtrl();
|
|
|
|
//create and initialize the font to be used
|
|
LOGFONT logFont;
|
|
|
|
logFont.lfHeight = -12;
|
|
logFont.lfWidth = 0;
|
|
logFont.lfWeight = FW_NORMAL;
|
|
logFont.lfItalic = FALSE;
|
|
logFont.lfUnderline = FALSE;
|
|
logFont.lfStrikeOut = FALSE;
|
|
logFont.lfEscapement = 0;
|
|
logFont.lfOrientation = 0;
|
|
lstrcpy(logFont.lfFaceName, _T("Verdana"));
|
|
|
|
m_MCFont.CreateFontIndirect(&logFont);
|
|
m_dtPicker.SetMonthCalFont((HFONT)m_MCFont);
|
|
|
|
Once the font has been changed, with a call to COXDateTimeCtrl::SetMonthCalFont, the new font
|
|
is stored and used the next time a month calendar is to be displayed.
|
|
|
|
|
|
|
|
|
|
//////////////////////////
|
|
Using Callback Fields in a Date and Time Picker Control
|
|
|
|
In addition to the standard format characters that define date and time picker fields,
|
|
you can customize your output by specifying certain parts of a custom format string as
|
|
callback fields. To declare a callback field, include one or more "X" characters
|
|
(ASCII Code 88) anywhere in the body of the format string. For example, the following
|
|
string "'Today is: 'yy'/'MM'/'dd' (Day 'X')'"causes the date and time picker control
|
|
to display the current value as the year followed by the month, date, and finally the
|
|
day of the year.
|
|
|
|
!!!
|
|
Note The number of X's in a callback field does not correspond to the number of
|
|
characters that will be displayed.
|
|
!!!
|
|
|
|
You can distinguish between multiple callback fields in a custom string by repeating
|
|
the "X" character. Thus, the format string "XXddddMMMdd', 'yyyXXX" contains two unique
|
|
callback fields, "XX" and "XXX".
|
|
|
|
!!!
|
|
Note Callback fields are treated as valid fields, so your application must be
|
|
prepared to handle DTN_WMKEYDOWN notification messages.
|
|
!!!
|
|
|
|
Implementing callback fields in your date and time picker control consists of three parts:
|
|
|
|
1) Initializing the custom format string
|
|
Initialize the custom string with a call to COXDateTimeCtrl::SetFormat. A common
|
|
place to set the custom format string is in the OnInitDialog function of your
|
|
containing dialog class or OnInitalUpdate function of your containing view class.
|
|
|
|
2) Handling the DTN_FORMATQUERY notification
|
|
When the control parses the format string and encounters a callback field, the
|
|
application sends DTN_FORMAT and DTN_FORMATQUERY notification messages. The
|
|
callback field string is included with the notifications so you can determine
|
|
which callback field is being queried.
|
|
The DTN_FORMATQUERY notification is sent to retrieve the maximum allowable size
|
|
in pixels of the string that will be displayed in the current callback field.
|
|
To properly calculate this value, you must calculate the height and width of
|
|
the string, to be substituted for the field, using the control's display font.
|
|
The actual calculation of the string is easily achieved with a call to the
|
|
::GetTextExtentPoint32 Win32 function. Once the size is determined, pass the
|
|
value back to the application and exit the handler function.
|
|
|
|
The following example is one method of supplying the size of the callback string:
|
|
|
|
NMDATETIMEFORMATQUERY* pDTFormatQuery= (NMDATETIMEFORMATQUERY *)pNMHDR;
|
|
CDC* pDC;
|
|
CFont* pFont;
|
|
CFont* pOrigFont;
|
|
|
|
// Prepare the device context for the GetTextExtentPoint32 call.
|
|
pDC= GetDC();
|
|
|
|
pFont= GetFont();
|
|
if(!pFont)
|
|
pFont->CreateStockObject(DEFAULT_GUI_FONT);
|
|
|
|
pOrigFont = pDC->SelectObject(pFont);
|
|
|
|
// Check to see if this is the callback segment desired. If so,
|
|
// use the longest text segment to determine the maximum
|
|
* // width of the callback field, and then place the information into
|
|
// the NMDATETIMEFORMATQUERY structure.
|
|
if(!lstrcmp("X",pDTFormatQuery->pszFormat))
|
|
::GetTextExtentPoint32 (pDC->m_hDC, "366", 3, &pDTFormatQuery->szMax);
|
|
|
|
// Reset the font in the device context then release the context.
|
|
pDC->SelectObject(pOrigFont);
|
|
ReleaseDC(pDC);
|
|
|
|
*pResult = 0;
|
|
|
|
|
|
Once the size of the current callback field has been calculated, you must supply
|
|
a value for the field. This is done in the handler for the DTN_FORMAT notification.
|
|
|
|
3) Handling the DTN_FORMAT notification
|
|
The DTN_FORMAT notification is used by the application to request the character
|
|
string that will be substituted. The following example demonstrates one possible
|
|
method:
|
|
|
|
NMDATETIMEFORMAT* pDTFormat= (NMDATETIMEFORMAT *)pNMHDR;
|
|
|
|
COleDateTime oCurTime;
|
|
m_dtPicker.GetTime(oCurTime);
|
|
|
|
wsprintf(pDTFormat->pszDisplay,"%d",oCurTime.GetDayOfYear());
|
|
|
|
*pResult = 0;
|
|
|
|
Note The pointer to the NMDATETIMEFORMAT structure is found by casting the first
|
|
parameter of the notification handler to the proper type.
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////
|
|
Using Custom Format Strings in a Date and Time Picker Control
|
|
|
|
By default, date and time picker controls provide three format types (each format
|
|
corresponding to a unique style) for displaying the current date or time:
|
|
|
|
DTS_LONGDATEFORMAT - Displays the date in long format, producing output
|
|
like "Wednesday, January 3, 1998".
|
|
DTS_SHORTDATEFORMAT - Displays the date in short format, producing output
|
|
like "1/3/98".
|
|
DTS_TIMEFORMAT - Displays the time in long format, producing output
|
|
like "5:31:42 PM".
|
|
|
|
However, you can customize the appearance of the date or time by using a custom format
|
|
string. This custom string is comprised of either existing format characters, nonformat
|
|
characters, or a combination of both. Once the custom string is built, make a call to
|
|
COXDateTimeCtrl::SetFormat passing in your custom string. The date and time picker control
|
|
will then display the current value using your custom format string.
|
|
|
|
The following example code (where m_dtPicker is the COXDateTimeCtrl object) demonstrates
|
|
one possible solution:
|
|
|
|
CString formatStr= _T("'Today is: 'yy'/'MM'/'dd");
|
|
m_dtPicker.SetFormat(formatStr);
|
|
|
|
In addition to custom format strings, date and time picker controls also support callback
|
|
fields.
|
|
|
|
|
|
|
|
|
|
//////////////////////////
|
|
Processing Notification Messages in Date and Time Picker Controls
|
|
|
|
As users interact with the date and time picker control, the control (COXDateTimeCtrl)
|
|
sends notification messages to its parent window, usually a view or dialog object.
|
|
Handle these messages if you want to do something in response. For example, when the
|
|
user opens the date and time picker to display the embedded month calendar control,
|
|
the DTN_DROPDOWN notification is sent.
|
|
|
|
The following list describes the various notifications sent by the date and time picker
|
|
control.
|
|
|
|
DTN_DROPDOWN - Notifies the parent that the embedded month calendar control
|
|
is about to be displayed. This notification is only sent
|
|
when the DTS_UPDOWN style has not been set. For more
|
|
information on this notification, see Accessing the
|
|
Embedded Month Calendar Control.
|
|
|
|
DTN_CLOSEUP - Notifies the parent that the embedded month calendar control
|
|
is about to be closed. This notification is only sent when
|
|
the DTS_UPDOWN style has not been set.
|
|
|
|
DTN_DATETIMECHANGE - Notifies the parent that a change has occurred in the control.
|
|
|
|
lpChange = (LPNMDATETIMECHANGE) lParam;
|
|
The owner of the control must return zero.
|
|
|
|
lpChange - Address of an NMDATETIMECHANGE structure
|
|
containing information about the change that
|
|
took place in the control.
|
|
|
|
NMDATETIMECHANGE
|
|
|
|
typedef struct tagNMDATETIMECHANGE {
|
|
NMHDR nmhdr;
|
|
DWORD dwFlags;
|
|
SYSTEMTIME st;
|
|
} NMDATETIMECHANGE, FAR * LPNMDATETIMECHANGE;
|
|
Contains information about a change that has taken place
|
|
in a date and time picker (DTP) control. This structure is
|
|
used with the DTN_DATETIMECHANGE notification message.
|
|
|
|
nmhdr - NMHDR structure that contains information about
|
|
the notification message.
|
|
dwFlags - Value that indicates if the control was set to
|
|
"no date" status (for DTS_SHOWNONE only). This
|
|
flag also specifies whether the contents of the
|
|
st member are valid and contain current time
|
|
information. This value can be one of the
|
|
following:
|
|
|
|
GDT_NONE - The control is set to "no date"
|
|
status. The "no date" status
|
|
applies only to controls that are
|
|
set to the DTS_SHOWNONE style.
|
|
GDT_VALID - The control is not set to the
|
|
"no date" status. The st member
|
|
contains the current date and time.
|
|
|
|
st - SYSTEMTIME structure that contains information
|
|
about the current system date and time.
|
|
|
|
DTN_FORMAT - Notifies the parent that text is needed to be displayed in a
|
|
callback field. For more information on this notification and
|
|
callback fields, see Using Callback Fields in a Date and Time
|
|
Picker Control.
|
|
|
|
lpNMFormat = (LPNMDATETIMEFORMAT) lParam;
|
|
The owner of the control must return zero.
|
|
|
|
lpNMFormat - Address of an NMDATETIMEFORMAT structure
|
|
containing information regarding this instance
|
|
of the notification message. The structure
|
|
contains the substring that defines the
|
|
callback field and receives the formatted
|
|
string that the control will display.
|
|
|
|
NMDATETIMEFORMAT
|
|
|
|
typedef struct tagNMDATETIMEFORMAT{
|
|
NMHDR nmhdr;
|
|
LPCTSTR pszFormat;
|
|
SYSTEMTIME st;
|
|
LPCTSTR pszDisplay;
|
|
TCHAR szDisplay[64];
|
|
} NMDATETIMEFORMAT, FAR * LPNMDATETIMEFORMAT;
|
|
Contains information about a portion of the format string that
|
|
defines a callback field within a date and time picker (DTP)
|
|
control. It carries the substring that defines the callback
|
|
field and contains a buffer to receive the string that will be
|
|
displayed in the callback field. This structure is used with
|
|
the DTN_FORMAT notification message.
|
|
|
|
nmhdr - NMHDR structure that contains information
|
|
about the notification message.
|
|
pszFormat - Address of the substring that defines a DTP
|
|
control callback field The substring comprises
|
|
one or more "X" characters, followed by a NULL
|
|
character.
|
|
st - SYSTEMTIME structure that contains information
|
|
about the current system date and time.
|
|
pszDisplay - Address of a null-terminated string that
|
|
contains the display text of the control.
|
|
By default, this is the address of the
|
|
szDisplay member of this structure. It is legal
|
|
to set this member to point to an existing
|
|
string. If so, the application is not required
|
|
to place a string into the szDisplay member.
|
|
szDisplay - 64-character buffer that is to receive the
|
|
zero-terminated string that the DTP control
|
|
will display. It is not necessary to fill the
|
|
entire buffer.
|
|
|
|
Handling this message allows the owner of the control to
|
|
provide a custom string that the control will display.
|
|
|
|
DTN_FORMATQUERY - Requests the parent to supply the maximum allowable size of
|
|
the string that will be displayed in a callback field.
|
|
Handling this notification allows the control to properly
|
|
display output at all times, reducing flicker within the
|
|
control's display. For more information on this notification,
|
|
see Using Callback Fields in a Date and Time Picker Control.
|
|
|
|
lpDTFormatQuery = (LPNMDATETIMEFORMATQUERY) lParam;
|
|
The owner of the control must calculate the maximum possible
|
|
width of the text that will be displayed in the callback field,
|
|
set the szMax member of the NMDATETIMEFORMATQUERY structure,
|
|
and return zero.
|
|
|
|
lpDTFormatQuery - Address of an NMDATETIMEFORMATQUERY
|
|
structure containing information about
|
|
the callback field. The structure
|
|
contains a substring that defines a
|
|
callback field and receives the maximum
|
|
allowable size of the string that will
|
|
be displayed in the callback field.
|
|
|
|
NMDATETIMEFORMATQUERY
|
|
|
|
typedef struct tagNMDATETIMEFORMATQUERY{
|
|
NMHDR nmhdr;
|
|
LPCTSTR pszFormat;
|
|
SIZE szMax;
|
|
} NMDATETIMEFORMATQUERY, FAR * LPNMDATETIMEFORMATQUERY;
|
|
|
|
Contains information about a date and time picker (DTP) control
|
|
callback field. It contains a substring (taken from the
|
|
control's format string) that defines a callback field.
|
|
The structure receives the maximum allowable size of the text
|
|
that will be displayed in the callback field. This structure
|
|
is used with the DTN_FORMATQUERY notification message.
|
|
|
|
nmhdr - NMHDR structure that contains information
|
|
about this notification message.
|
|
pszFormat - Address of a substring that defines a DTP
|
|
control callback field. The substring is one
|
|
or more "X" characters followed by a NULL.
|
|
szMax - SIZE structure that must be filled with the
|
|
maximum size of the text that will be displayed
|
|
in the callback field.
|
|
|
|
|
|
Handling this message prepares the control to adjust for the
|
|
maximum size of the string that will be displayed in a
|
|
particular callback field. This enables the control to properly
|
|
display output at all times, reducing flicker within the
|
|
control's display.
|
|
|
|
DTN_USERSTRING - Notifies the parent that the user has finished editing the
|
|
contents of the date and time picker control. This notification
|
|
is only sent when the DTS_APPCANPARSE style has been set.
|
|
|
|
lpDTstring = (LPNMDATETIMESTRING) lParam;
|
|
The owner of the control must return zero.
|
|
|
|
lpDTstring - Address of an NMDATETIMESTRING structure
|
|
that contains information about the instance
|
|
of the notification message.
|
|
|
|
NMDATETIMESTRING
|
|
|
|
typedef struct tagNMDATETIMESTRING{
|
|
NMHDR nmhdr;
|
|
LPCTSTR pszUserString;
|
|
SYSTEMTIME st;
|
|
DWORD dwFlags;
|
|
} NMDATETIMESTRING, FAR * LPNMDATETIMESTRING;
|
|
|
|
Contains information specific to an edit operation that has
|
|
taken place in a date and time picker (DTP) control. This
|
|
message is used with the DTN_USERSTRING notification message.
|
|
|
|
nmhdr - NMHDR structure that contains information
|
|
about this notification message.
|
|
pszUserString - Address of the zero-terminated string that
|
|
the user entered.
|
|
st - SYSTEMTIME structure that must be filled in
|
|
by the owner when handling the
|
|
DTN_USERSTRING notification message.
|
|
dwFlags - Return field. Set this member to GDT_VALID
|
|
to indicate that the st member is valid or
|
|
to GDT_NONE to set the control to "no date"
|
|
status (DTS_SHOWNONE style only).
|
|
|
|
|
|
Handling this message allows the owner to provide custom
|
|
responses to strings entered into the control by the user.
|
|
The owner must be prepared to parse the input string and take
|
|
action if necessary.
|
|
|
|
DTN_WMKEYDOWN - Notifies the parent when the user types in a callback field.
|
|
Handle this notification to emulate the same keyboard response
|
|
supported for non-callback fields in a date and time picker
|
|
control.
|
|
|
|
lpDTKeystroke = (LPNMDATETIMEWMKEYDOWN)lParam;
|
|
The owner of the control must return zero.
|
|
|
|
lpDTKeystroke - Address of an NMDATETIMEWMKEYDOWN structure
|
|
containing information about this instance
|
|
of the notification. The structure includes
|
|
information about the key that the user
|
|
typed, the substring that defines the
|
|
callback field, and the current system
|
|
date and time.
|
|
|
|
NMDATETIMEWMKEYDOWN
|
|
|
|
typedef struct tagNMDATETIMEWMKEYDOWN{
|
|
NMHDR nmhdr;
|
|
int nVirtKey;
|
|
LPCTSTR pszFormat;
|
|
SYSTEMTIME st;
|
|
} NMDATETIMEWMKEYDOWN, FAR * LPNMDATETIMEWMKEYDOWN;
|
|
Carries information used to describe and handle a DTN_WMKEYDOWN
|
|
notification message.
|
|
|
|
nmhdr - NMHDR structure that contains information
|
|
about the notification message.
|
|
nVirtKey - Virtual key code that represents the key that
|
|
the user pressed.
|
|
pszFormat - Zero-terminated substring, taken from the
|
|
format string, that defines the callback field.
|
|
The substring is one or more "X" characters,
|
|
followed by a NULL.
|
|
st - SYSTEMTIME structure containing the current
|
|
date and time from the DTP control. The owner
|
|
of the control must modify the time information
|
|
based on the user's keystroke.
|
|
|
|
|
|
Handling this message allows the owner of the control to
|
|
provide specific responses to keystrokes within the callback
|
|
fields of the control.
|
|
|
|
|
|
*/
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#if !defined(_OXDATETIMECTRL_H_)
|
|
#define _OXDATETIMECTRL_H_
|
|
|
|
#if _MSC_VER >= 1000
|
|
#pragma once
|
|
#endif // _MSC_VER >= 1000
|
|
|
|
#include "OXDllExt.h"
|
|
|
|
|
|
#include "OXMonthCalCtrl.h"
|
|
|
|
#ifndef MCS_NOTODAYCIRCLE
|
|
#undef MCS_NOTODAY
|
|
#if (_WIN32_IE >= 0x0400)
|
|
#define MCS_NOTODAYCIRCLE 0x0008
|
|
#define MCS_NOTODAY 0x0010
|
|
#else
|
|
#define MCS_NOTODAY 0x0008
|
|
#endif // (_WIN32_IE >= 0x0400)
|
|
#endif // MCS_NOTODAYCIRCLE
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
// OXDateTimeCtrl.h : header file
|
|
//
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// COXDateTimeCtrl window
|
|
|
|
#if _MFC_VER<=0x0421
|
|
class OX_CLASS_DECL COXDateTimeCtrl : public CWnd
|
|
#else
|
|
class OX_CLASS_DECL COXDateTimeCtrl : public CDateTimeCtrl
|
|
#endif // _MFC_VER>0x0421
|
|
{
|
|
//#if _MFC_VER<=0x0421
|
|
DECLARE_DYNCREATE(COXDateTimeCtrl)
|
|
//#endif // _MFC_VER>0x0421
|
|
|
|
protected:
|
|
static BOOL bComCtlInitialized;
|
|
|
|
COXMonthCalCtrl m_ctlMonthCal;
|
|
|
|
public:
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Initializes Date Time Picker class in the comctl32.dll
|
|
static void InitializeDTPCtrl();
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Construct the object
|
|
COXDateTimeCtrl();
|
|
|
|
|
|
// --- In : dwStyle - Specifies the combination of date time control
|
|
// styles. The following window styles are specific
|
|
// to date and time picker (DTP) controls:
|
|
//
|
|
// DTS_APPCANPARSE - Allows the owner to parse user input
|
|
// and take necessary action. It enables
|
|
// users to edit within the client area
|
|
// of the control when they press the F2
|
|
// key. The control sends DTN_USERSTRING
|
|
// notification messages when users are
|
|
// finished.
|
|
// DTS_LONGDATEFORMAT - Displays the date in long format. The
|
|
// default format string for this style is
|
|
// defined by LOCALE_SLONGDATEFORMAT, which
|
|
// produces output like
|
|
// "Friday, April 19, 1996".
|
|
// DTS_RIGHTALIGN - The drop-down month calendar will be
|
|
// right-aligned with the control instead
|
|
// of left-aligned, which is the default.
|
|
// DTS_SHOWNONE - It is possible to have no date currently
|
|
// selected in the control. With this style,
|
|
// the control displays a check box that
|
|
// users can check once they have entered
|
|
// or selected a date. Until this check
|
|
// box is checked, the application will not
|
|
// be able to retrieve the date from the
|
|
// control because, in essence, the control
|
|
// has no date. This state can be set with
|
|
// the SetTime function or verified with
|
|
// the GetTime function.
|
|
// DTS_SHORTDATEFORMAT - Displays the date in short format. The
|
|
// default format string for this style is
|
|
// defined by LOCALE_SSHORTDATE, which
|
|
// produces output like "4/19/96".
|
|
// DTS_TIMEFORMAT - Displays the time. The default format
|
|
// string for this style is defined by
|
|
// LOCALE_STIMEFORMAT, which produces
|
|
// output like "5:31:42 PM".
|
|
// DTS_UPDOWN - Appears to the right of the DTP control
|
|
// to modify date values. This style can
|
|
// be used instead of the drop-down month
|
|
// calendar, which is the default style.
|
|
//
|
|
// rect - A reference to a RECT structure, which is the
|
|
// position and size of the date and time picker
|
|
// control.
|
|
// pParentWnd - A pointer to a CWnd object that is the parent
|
|
// window of the date and time picker control. It must
|
|
// not be NULL.
|
|
// nID - Specifies the date and time picker control's
|
|
// control ID.
|
|
// --- Out :
|
|
// --- Returns: Nonzero if creation was successful; otherwise 0.
|
|
// --- Effect : Create a date and time picker control in two steps:
|
|
// 1) Call COXDateTimeCtrl to construct a COXDateTimeCtrl object.
|
|
// 2) Call this member function, which creates the Windows date and
|
|
// time picker control and attaches it to the COXDateTimeCtrl object.
|
|
// When you call Create, the common controls are initialized
|
|
BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
|
|
|
|
|
|
#if _MFC_VER<=0x0421
|
|
// Attributes
|
|
// --- In : iColor - An int value specifying which color area of the
|
|
// month calendar to retrieve. For a list of values,
|
|
// see the iColor parameter for SetMonthCalColor.
|
|
// --- Out :
|
|
// --- Returns: A COLORREF value that represents the color setting for the specified
|
|
// portion of the month calendar control if successful. The function
|
|
// returns -1 if unsuccessful
|
|
// --- Effect : Retrieves the color for a given portion of the month calendar within
|
|
// a date and time picker (DTP) control.
|
|
inline COLORREF GetMonthCalColor(int iColor) const {
|
|
ASSERT(::IsWindow(m_hWnd));
|
|
return (COLORREF)::SendMessage(m_hWnd,DTM_GETMCCOLOR,(WPARAM)iColor,0);
|
|
}
|
|
|
|
|
|
// --- In : iColor - An int value specifying which color area of the
|
|
// month calendar to change. This value can be one
|
|
// of the following.
|
|
//
|
|
// MCSC_BACKGROUND - Set the background color displayed
|
|
// between months.
|
|
// MCSC_MONTHBK - Set the background color displayed
|
|
// within a month.
|
|
// MCSC_TEXT - Set the color used to display text
|
|
// within a month.
|
|
// MCSC_TITLEBK - Set the background color displayed
|
|
// in the calendar's title.
|
|
// MCSC_TITLETEXT - Set the color used to display text
|
|
// within the calendar's title.
|
|
// MCSC_TRAILINGTEXT - Set the color used to display header
|
|
// and trailing-day text. Header and
|
|
// trailing days are the days from the
|
|
// previous and following months that
|
|
// appear on the current calendar.
|
|
//
|
|
// ref - A COLORREF value representing the color that will
|
|
// be set for the specified area of the month calendar.
|
|
//
|
|
// --- Out :
|
|
// --- Returns: A COLORREF value that represents the previous color setting for the
|
|
// specified portion of the month calendar control if successful.
|
|
// Otherwise, the message returns -1.
|
|
// --- Effect : Sets the color for a given portion of the month calendar within a date
|
|
// and time picker (DTP) control.
|
|
inline COLORREF SetMonthCalColor(int iColor, COLORREF ref) {
|
|
ASSERT(::IsWindow(m_hWnd));
|
|
return (COLORREF)::SendMessage(m_hWnd,DTM_SETMCCOLOR,(WPARAM)iColor,(LPARAM)ref);
|
|
}
|
|
|
|
|
|
// --- In : pstrFormat - A pointer to a zero-terminated format string that
|
|
// defines the desired display. Setting this parameter
|
|
// to NULL will reset the control to the default
|
|
// format string for the current style.
|
|
// --- Out :
|
|
// --- Returns: Nonzero if successful; otherwise 0.
|
|
// --- Effect : Sets the display of a date and time picker (DTP) control based on a
|
|
// given format string. Refer to "Custom format strings" section in
|
|
// the documentation for description of available format characters.
|
|
inline BOOL SetFormat(LPCTSTR pstrFormat) {
|
|
ASSERT(::IsWindow(m_hWnd));
|
|
return (BOOL)::SendMessage(m_hWnd,DTM_SETFORMAT,0,(LPARAM)pstrFormat);
|
|
}
|
|
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns: A pointer to a CFont object, or NULL if unsuccessful.
|
|
// --- Effect : Call this member function to get the font currently used by the
|
|
// date and time picker control's month calendar control. The CFont
|
|
// object pointed to by the return value is a temporary object and
|
|
// is destroyed during the next idle processing time.
|
|
inline CFont* GetMonthCalFont() const {
|
|
ASSERT(::IsWindow(m_hWnd));
|
|
return CFont::FromHandle((HFONT) ::SendMessage(m_hWnd, DTM_GETMCFONT, 0, 0));
|
|
}
|
|
|
|
|
|
// --- In : hFont - Handle to the font that will be set.
|
|
// bRedraw - Specifies whether the control should be redrawn
|
|
// immediately upon setting the font. Setting this
|
|
// parameter to TRUE causes the control to redraw
|
|
// itself.
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Sets the font to be used by the date and time picker (DTP) control's
|
|
// child month calendar control.
|
|
inline void SetMonthCalFont(HFONT hFont, BOOL bRedraw = TRUE) {
|
|
ASSERT(::IsWindow(m_hWnd));
|
|
::SendMessage(m_hWnd, DTM_SETMCFONT, (WPARAM) hFont, MAKELONG(bRedraw, 0));
|
|
}
|
|
|
|
// Operations
|
|
|
|
// --- In : timeNew - A reference to a COleDateTime object containing
|
|
// the to which the control will be set.
|
|
// pTimeNew - In the second version above, a pointer to a CTime
|
|
// object containing the time to which the control
|
|
// will be set. In the third version above, a pointer
|
|
// to a SYSTEMTIME structure containing the time to
|
|
// which the control will be set.
|
|
// --- Out :
|
|
// --- Returns: Nonzero if successful; otherwise 0.
|
|
// --- Effect : Sets the time in a date and time picker (DTP) control.
|
|
BOOL SetTime(const COleDateTime& timeNew);
|
|
BOOL SetTime(const CTime* pTimeNew);
|
|
BOOL SetTime(LPSYSTEMTIME pTimeNew = NULL);
|
|
|
|
|
|
// --- In :
|
|
// --- Out : timeDest - In the first version, a reference to a COleDateTime
|
|
// object that will receive the system time information.
|
|
// In the second version, a reference to a CTime object
|
|
// that will receive the system time information.
|
|
// pTimeDest - A pointer to the SYSTEMTIME structure to receive
|
|
// the system time information. Must not be NULL.
|
|
// --- Returns: In the first version, nonzero if the time is successfully written to
|
|
// the COleDateTime object; otherwise 0. In the second and third versions,
|
|
// a DWORD value equal to the dwFlag member set in the NMDATETIMECHANGE
|
|
// structure.
|
|
// --- Effect : Retrieves the currently selected time from a date and time picker (DTP)
|
|
// control. The return value DWORD in the second and third versions,
|
|
// above, indicates whether or not the date and time picker control is set
|
|
// to the "no date" status, as indicated in the NMDATETIMECHANGE structure
|
|
// member dwFlags. If the value returned equals GDT_NONE, the control is
|
|
// set to "no date" status, and uses the DTS_SHOWNONE style. If the value
|
|
// returned equals GDT_VALID, the system time is successfully stored in
|
|
// the destination location.
|
|
BOOL GetTime(COleDateTime& timeDest) const;
|
|
DWORD GetTime(CTime& timeDest) const;
|
|
inline DWORD GetTime(LPSYSTEMTIME pTimeDest) const
|
|
{
|
|
ASSERT(::IsWindow(m_hWnd));
|
|
ASSERT(pTimeDest != NULL);
|
|
return (DWORD)::SendMessage(m_hWnd,DTM_GETSYSTEMTIME,0,(LPARAM)pTimeDest);
|
|
}
|
|
|
|
#endif // _MFC_VER>0x0421
|
|
|
|
// --- In : pMinRange - A pointer to a COleDateTime object or a CTime
|
|
// object or a pointer to a SYSTEMTIME structure
|
|
// containing the earliest time allowed in
|
|
// the COXDateTimeCtrl object.
|
|
// pMaxRange - A pointer to a COleDateTime object or a CTime
|
|
// object or a pointer to a SYSTEMTIME structure
|
|
// containing the latest time allowed in the
|
|
// COXDateTimeCtrl object.
|
|
// --- Out :
|
|
// --- Returns: Nonzero if successful; otherwise 0.
|
|
// --- Effect : Sets the minimum and maximum allowable system times for a date and
|
|
// time picker (DTP) control.
|
|
BOOL SetRange(const COleDateTime* pMinRange, const COleDateTime* pMaxRange);
|
|
BOOL SetRange(const CTime* pMinRange, const CTime* pMaxRange);
|
|
BOOL SetRange(const LPSYSTEMTIME pMinRange, const LPSYSTEMTIME pMaxRange);
|
|
|
|
|
|
// --- In :
|
|
// --- Out : pMinRange - A pointer to a COleDateTime object or a CTime
|
|
// object or a pointer to a SYSTEMTIME structure
|
|
// containing the earliest time allowed in
|
|
// the COXDateTimeCtrl object.
|
|
// pMaxRange - A pointer to a COleDateTime object or a CTime
|
|
// object or a pointer to a SYSTEMTIME structure
|
|
// containing the latest time allowed in the
|
|
// COXDateTimeCtrl object.
|
|
// --- Returns: A DWORD value containing flags that indicate which ranges are set.
|
|
// --- Effect : Retrieves the current minimum and maximum allowable system times for
|
|
// a date and time picker (DTP) control.
|
|
DWORD GetRange(COleDateTime* pMinRange, COleDateTime* pMaxRange) const;
|
|
DWORD GetRange(CTime* pMinRange, CTime* pMaxRange) const;
|
|
DWORD GetRange(LPSYSTEMTIME pMinRange, LPSYSTEMTIME pMaxRange) const;
|
|
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns: A pointer to a COXMonthCalCtrl object, or NULL if unsuccessful or
|
|
// if the window is not visible
|
|
// --- Effect : Call this member function to retrieve the COXMonthCalCtrl object
|
|
// associated with the date and time picker control. Date and time picker
|
|
// controls create a child month calendar control when the user clicks
|
|
// the drop-down arrow. When the COXMonthCalCtrl object is no longer needed,
|
|
// it is destroyed, so your application must not rely on storing the
|
|
// object representing the date time picker control's child month calendar.
|
|
inline COXMonthCalCtrl* GetMonthCalCtrl() const
|
|
{
|
|
ASSERT(::IsWindow(m_hWnd));
|
|
|
|
HWND hwndMonthCal=(HWND)::SendMessage(m_hWnd,DTM_GETMONTHCAL,0,0);
|
|
if(hwndMonthCal!=NULL)
|
|
{
|
|
ASSERT(::IsWindow(m_ctlMonthCal.GetSafeHwnd()));
|
|
ASSERT(m_ctlMonthCal.GetSafeHwnd()==hwndMonthCal);
|
|
|
|
COXMonthCalCtrl* pMonthCal=(COXMonthCalCtrl*)&m_ctlMonthCal;
|
|
return pMonthCal;
|
|
}
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
|
|
// --- In : hFont - Handle to the font that will be set.
|
|
// bRedraw - Specifies whether the control should be redrawn
|
|
// immediately upon setting the font. Setting this
|
|
// parameter to TRUE causes the control to redraw
|
|
// itself.
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Sets the font to be used by the date and time picker (DTP) control's
|
|
// child month calendar control.
|
|
inline void SetMonthCalFont(CFont* pFont, BOOL bRedraw = TRUE)
|
|
{
|
|
ASSERT(::IsWindow(m_hWnd));
|
|
ASSERT(pFont!=NULL);
|
|
#if _MFC_VER<=0x0421
|
|
SetMonthCalFont((HFONT)*pFont,bRedraw);
|
|
#else
|
|
CDateTimeCtrl::SetMonthCalFont((HFONT)*pFont,bRedraw);
|
|
#endif // _MFC_VER>0x0421
|
|
}
|
|
|
|
// Overrides
|
|
// ClassWizard generated virtual function overrides
|
|
//{{AFX_VIRTUAL(COXSHBListCtrl)
|
|
protected:
|
|
virtual void PreSubclassWindow();
|
|
//}}AFX_VIRTUAL
|
|
|
|
public:
|
|
// Overridables
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : destructor
|
|
virtual ~COXDateTimeCtrl();
|
|
|
|
protected:
|
|
|
|
// Generated message map functions
|
|
//{{AFX_MSG(COXDateTimeCtrl)
|
|
//}}AFX_MSG
|
|
afx_msg BOOL OnDropDown(NMHDR *pHdr, LRESULT *pRes);
|
|
DECLARE_MESSAGE_MAP()
|
|
|
|
protected:
|
|
// initialize calendar control
|
|
virtual BOOL InitDateTimeCtrl();
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
//{{AFX_INSERT_LOCATION}}
|
|
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
|
|
|
|
#endif // !defined(_OXDATETIMECTRL_H_)
|