ListDate.h
上传用户:sztopon
上传日期:2014-01-21
资源大小:55k
文件大小:5k
源码类别:

ListView/ListBox

开发平台:

Visual C++

  1. #pragma once
  2. #include "ListTypes.h"
  3. #define DATE_STRING 32
  4. class CListDate : public CWindowImpl< CListDate, CDateTimePickerCtrl >
  5. {
  6. public:
  7. CListDate()
  8. {
  9. m_nItem = NULL_ITEM;
  10. m_nSubItem = NULL_SUBITEM;
  11. m_nFlags = ITEM_FLAGS_NONE;
  12. m_nExitChar = 0;
  13. }
  14. ~CListDate()
  15. {
  16. }
  17. protected:
  18. int m_nItem;
  19. int m_nSubItem;
  20. UINT m_nFlags;
  21. TCHAR m_nExitChar;
  22. CFont m_fntDateFont;
  23. public:
  24. BOOL Create( HWND hWndParent, int nItem, int nSubItem, CRect& rcRect, UINT nFlags, SYSTEMTIME& stItemDate )
  25. {
  26. m_nItem = nItem;
  27. m_nSubItem = nSubItem;
  28. m_nFlags = nFlags;
  29. m_nExitChar = 0;
  30. // destroy old date control...
  31. if ( IsWindow() )
  32. DestroyWindow();
  33. DWORD dwStyle = WS_CHILD | WS_CLIPCHILDREN;
  34. if ( nFlags & ITEM_FLAGS_DATETIME_NONE )
  35. dwStyle |= DTS_SHOWNONE;
  36. if ( nFlags & ITEM_FLAGS_TIME_ONLY )
  37. dwStyle |= DTS_UPDOWN;
  38. // create date-time control
  39. if ( CWindowImpl< CListDate, CDateTimePickerCtrl >::Create( hWndParent, CRect( rcRect.left + 3, rcRect.top + 2, rcRect.right - 3, rcRect.bottom - 2 ), NULL, dwStyle ) == NULL )
  40. return FALSE;
  41. // remove border
  42. ModifyStyleEx( WS_EX_CLIENTEDGE, 0, SWP_FRAMECHANGED );
  43. // get system message font
  44. CLogFont logFont;
  45. logFont.SetMessageBoxFont();
  46. if ( !m_fntDateFont.IsNull() )
  47. m_fntDateFont.DeleteObject();
  48. if ( m_fntDateFont.CreateFontIndirect( &logFont ) == NULL )
  49. return FALSE;
  50. SetMonthCalFont( m_fntDateFont );
  51. SetFont( m_fntDateFont );
  52. TCHAR szDateFormat[ DATE_STRING ];
  53. GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_SSHORTDATE, szDateFormat, DATE_STRING );
  54. TCHAR szTimeFormat[ DATE_STRING ];
  55. GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_STIMEFORMAT, szTimeFormat, DATE_STRING );
  56. if ( nFlags & ITEM_FLAGS_DATE_ONLY )
  57. SetFormat( szDateFormat );
  58. else if ( nFlags & ITEM_FLAGS_TIME_ONLY )
  59. SetFormat( szTimeFormat );
  60. else
  61. SetFormat( CString( szDateFormat ) + _T( " " ) + CString( szTimeFormat ) );
  62. // get current date if setting time-only
  63. if ( nFlags & ITEM_FLAGS_TIME_ONLY )
  64. {
  65. SYSTEMTIME stCurrentDate;
  66. if ( GetSystemTime( &stCurrentDate ) == GDT_VALID )
  67. {
  68. stItemDate.wYear = stCurrentDate.wYear;
  69. stItemDate.wMonth = stCurrentDate.wMonth;
  70. stItemDate.wDay = stCurrentDate.wDay;
  71. }
  72. }
  73. SetSystemTime( ( !( nFlags & ITEM_FLAGS_TIME_ONLY ) && stItemDate.wYear == 0 ) ? GDT_NONE : GDT_VALID, &stItemDate );
  74. // show date-time control
  75. ShowWindow( SW_SHOW );
  76. SetFocus();
  77. return TRUE;
  78. }
  79. BEGIN_MSG_MAP_EX(CListDate)
  80. MSG_WM_KILLFOCUS(OnKillFocus)
  81. REFLECTED_NOTIFY_CODE_HANDLER_EX(DTN_CLOSEUP, OnCloseUp)
  82. MSG_WM_GETDLGCODE(OnGetDlgCode)
  83. MSG_WM_CHAR(OnChar)
  84. DEFAULT_REFLECTION_HANDLER()
  85. END_MSG_MAP_EX()
  86. void OnKillFocus( HWND hNewWnd )
  87. {
  88. // have we dropped down the calendar control?
  89. if ( hNewWnd != NULL && GetMonthCal() == hNewWnd )
  90. return;
  91. // have we selected a new date from the calendar control?
  92. if ( GetFocus() == m_hWnd )
  93. return;
  94. // hide calendar control in case it's not closed by losing focus
  95. if ( GetMonthCal().IsWindow() )
  96. GetMonthCal().ShowWindow( SW_HIDE );
  97. CWindow wndParent( GetParent() );
  98. if ( wndParent.IsWindow() )
  99. {
  100. SYSTEMTIME stItemDate;
  101. BOOL bValidDate = ( GetSystemTime( &stItemDate ) == GDT_VALID );
  102. if ( !bValidDate )
  103. ZeroMemory( &stItemDate, sizeof( SYSTEMTIME ) );
  104. if ( m_nFlags & ITEM_FLAGS_DATE_ONLY )
  105. {
  106. stItemDate.wHour = 0;
  107. stItemDate.wMinute = 0;
  108. stItemDate.wSecond = 0;
  109. stItemDate.wMilliseconds = 0;
  110. }
  111. if ( m_nFlags & ITEM_FLAGS_TIME_ONLY )
  112. {
  113. stItemDate.wYear = 0;
  114. stItemDate.wMonth = 0;
  115. stItemDate.wDay = 0;
  116. stItemDate.wDayOfWeek = 0;
  117. }
  118. CListNotify listNotify;
  119. listNotify.m_hdrNotify.hwndFrom = m_hWnd;
  120. listNotify.m_hdrNotify.idFrom = GetDlgCtrlID();
  121. listNotify.m_hdrNotify.code = LCN_ENDEDIT;
  122. listNotify.m_nItem = m_nItem;
  123. listNotify.m_nSubItem = m_nSubItem;
  124. listNotify.m_nExitChar = m_nExitChar;
  125. listNotify.m_lpszItemText = bValidDate ? _T( "1" ) : _T( "0" );
  126. listNotify.m_lpItemDate = &stItemDate;
  127. // forward notification to parent
  128. FORWARD_WM_NOTIFY( wndParent, listNotify.m_hdrNotify.idFrom, &listNotify.m_hdrNotify, ::SendMessage );
  129. }
  130. ShowWindow( SW_HIDE );
  131. }
  132. LRESULT OnCloseUp( LPNMHDR lpNMHDR )
  133. {
  134. SetMsgHandled( FALSE );
  135. SetFocus();
  136. return TRUE;
  137. }
  138. UINT OnGetDlgCode( LPMSG lpMessage )
  139. {
  140. return DLGC_WANTALLKEYS;
  141. }
  142. void OnChar( TCHAR nChar, UINT nRepCnt, UINT nFlags )
  143. {
  144. switch ( nChar )
  145. {
  146. case VK_TAB:
  147. case VK_RETURN:
  148. case VK_ESCAPE: {
  149. m_nExitChar = nChar;
  150. CWindow wndParent( GetParent() );
  151. if ( wndParent.IsWindow() )
  152. wndParent.SetFocus();
  153. }
  154. break;
  155. default: SetMsgHandled( FALSE );
  156. break;
  157. }
  158. }
  159. };