// DateTimePickerDlg.cpp : implementation file // #include "stdafx.h" #include "DateTimePicker.h" #include "DateTimePickerDlg.h" #include "UTSampleAbout.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDateTimePickerDlg dialog CDateTimePickerDlg::CDateTimePickerDlg(CWnd* pParent /*=NULL*/) : CDialog(CDateTimePickerDlg::IDD, pParent) { //{{AFX_DATA_INIT(CDateTimePickerDlg) m_nFirstDay = -1; m_nDimension = -1; m_nScrollRate = 0; m_bCanParse = FALSE; m_bShowNone = FALSE; m_bUpDown = FALSE; m_nFormat = -1; m_bRightAlign = FALSE; m_bNotoday = FALSE; m_bNotodaycircle = FALSE; m_bWeeknumbers = FALSE; m_sMonthCalFontName = _T(""); m_nDateFormat = -1; m_nTimeFormat = -1; //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_clrTrailingText=RGB(0,0,0); m_clrTitleText=RGB(0,0,0); m_clrTitleBk=RGB(0,0,0); m_clrText=RGB(0,0,0); m_clrMonthBk=RGB(0,0,0); m_clrBk=RGB(0,0,0); } void CDateTimePickerDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDateTimePickerDlg) DDX_Control(pDX, IDC_COMBO_TIMEFORMAT, m_cmbTimeFormat); DDX_Control(pDX, IDC_COMBO_DATEFORMAT, m_cmbDateFormat); DDX_Control(pDX, IDC_STATIC_CALFONT, m_ctlMonthCalFontName); DDX_Control(pDX, IDC_COMBO_FIRSTDAY, m_cmbFirstDay); DDX_Control(pDX, IDC_COMBO_DIMENSION, m_cmbDimension); DDX_Control(pDX, IDC_BUTTON_CLRTRAILINGTEXT, m_btnClrTrailingText); DDX_Control(pDX, IDC_BUTTON_CLRTITLETEXT, m_btnClrTitleText); DDX_Control(pDX, IDC_BUTTON_CLRTITLEBK, m_btnClrTitleBk); DDX_Control(pDX, IDC_BUTTON_CLRTEXT, m_btnClrText); DDX_Control(pDX, IDC_BUTTON_CLRMONTHBK, m_btnClrMonthBk); DDX_Control(pDX, IDC_BUTTON_CLRBK, m_btnClrBk); DDX_CBIndex(pDX, IDC_COMBO_FIRSTDAY, m_nFirstDay); DDX_CBIndex(pDX, IDC_COMBO_DIMENSION, m_nDimension); DDX_Text(pDX, IDC_EDIT_SCROLLRATE, m_nScrollRate); DDX_Check(pDX, IDC_CHECK_CANPARSE, m_bCanParse); DDX_Check(pDX, IDC_CHECK_SHOWNONE, m_bShowNone); DDX_Check(pDX, IDC_CHECK_UPDOWN, m_bUpDown); DDX_Radio(pDX, IDC_RADIO_TIMEFORMAT, m_nFormat); DDX_Check(pDX, IDC_CHECK_RIGHTALIGN, m_bRightAlign); DDX_Check(pDX, IDC_CHECK_NOTODAY, m_bNotoday); DDX_Check(pDX, IDC_CHECK_NOTODAYCIRCLE, m_bNotodaycircle); DDX_Check(pDX, IDC_CHECK_WEEKNUMBERS, m_bWeeknumbers); DDX_Text(pDX, IDC_STATIC_CALFONT, m_sMonthCalFontName); DDX_CBIndex(pDX, IDC_COMBO_DATEFORMAT, m_nDateFormat); DDX_CBIndex(pDX, IDC_COMBO_TIMEFORMAT, m_nTimeFormat); //}}AFX_DATA_MAP DDX_ColorPicker(pDX, IDC_BUTTON_CLRTRAILINGTEXT, m_clrTrailingText); DDX_ColorPicker(pDX, IDC_BUTTON_CLRTITLETEXT, m_clrTitleText); DDX_ColorPicker(pDX, IDC_BUTTON_CLRTITLEBK, m_clrTitleBk); DDX_ColorPicker(pDX, IDC_BUTTON_CLRTEXT, m_clrText); DDX_ColorPicker(pDX, IDC_BUTTON_CLRMONTHBK, m_clrMonthBk); DDX_ColorPicker(pDX, IDC_BUTTON_CLRBK, m_clrBk); } BEGIN_MESSAGE_MAP(CDateTimePickerDlg, CDialog) //{{AFX_MSG_MAP(CDateTimePickerDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_CHECK_CANPARSE, OnCheckCanparse) ON_BN_CLICKED(IDC_CHECK_SHOWNONE, OnCheckShownone) ON_BN_CLICKED(IDC_CHECK_UPDOWN, OnCheckUpdown) ON_BN_CLICKED(IDC_RADIO_LONGDATEFORMAT, OnRadioFormat) ON_BN_CLICKED(IDC_CHECK_RIGHTALIGN, OnCheckRightalign) ON_BN_CLICKED(IDC_BUTTON_CALFONT, OnButtonCalfont) ON_CBN_SELCHANGE(IDC_COMBO_DATEFORMAT, OnSelchangeComboDateformat) ON_BN_CLICKED(IDC_RADIO_SHORTDATEFORMAT, OnRadioFormat) ON_BN_CLICKED(IDC_RADIO_TIMEFORMAT, OnRadioFormat) ON_CBN_SELCHANGE(IDC_COMBO_TIMEFORMAT, OnSelchangeComboTimeformat) //}}AFX_MSG_MAP ON_NOTIFY(DTN_DROPDOWN ,IDC_DATETIMEPICKER, OnDTDropDown) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDateTimePickerDlg message handlers BOOL CDateTimePickerDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here // populate combo boxes // m_cmbDimension.AddString(_T("One month")); m_cmbDimension.AddString(_T("2x1 months")); m_cmbDimension.AddString(_T("1x2 months")); m_cmbDimension.AddString(_T("2x2 months")); m_nDimension=0; m_cmbFirstDay.AddString(_T("Monday")); m_cmbFirstDay.AddString(_T("Tuesday")); m_cmbFirstDay.AddString(_T("Wednesday")); m_cmbFirstDay.AddString(_T("Thursday")); m_cmbFirstDay.AddString(_T("Friday")); m_cmbFirstDay.AddString(_T("Saturday")); m_cmbFirstDay.AddString(_T("Sunday")); m_nFirstDay=6; m_cmbDateFormat.AddString(_T("Default")); m_cmbDateFormat.AddString(_T("ddd''d' 'MMM' 'yy")); m_cmbDateFormat.AddString(_T("dddd' 'dd' 'MMMM' 'yyy")); m_cmbDateFormat.AddString(_T("MM'/'dd'/'yyy' 'hh':'mm' 'tt")); m_nDateFormat=0; m_cmbTimeFormat.AddString(_T("Default")); m_cmbTimeFormat.AddString(_T("h':'m' 't")); m_cmbTimeFormat.AddString(_T("HH':'mm")); m_cmbTimeFormat.AddString(_T("hh':'mm' 'tt' 'MM'/'dd'/'yyy")); m_nTimeFormat=0; ///////////////////////////// // month calendar settings // m_nScrollRate=1; m_bNotoday = FALSE; m_bNotodaycircle = FALSE; m_bWeeknumbers = FALSE; ///////////////////////////// // enable tooltips for color picker buttons // m_btnClrTrailingText.SetToolTip(TRUE); m_btnClrTitleText.SetToolTip(TRUE); m_btnClrTitleBk.SetToolTip(TRUE); m_btnClrText.SetToolTip(TRUE); m_btnClrMonthBk.SetToolTip(TRUE); m_btnClrBk.SetToolTip(TRUE); ///////////////////////////// // create date time picker control // CWnd *pFrame=GetDlgItem(IDC_DATETIMEPICKER); CRect rcWnd; pFrame->GetWindowRect(rcWnd); DWORD dwStyle=WS_CHILD|WS_VISIBLE|WS_TABSTOP; pFrame->DestroyWindow(); //pFrame was just a placeholder anyway. ScreenToClient(rcWnd); VERIFY(m_ctlDateTimePicker.Create(dwStyle,rcWnd,this,IDC_DATETIMEPICKER)); GetVars(); return TRUE; // return TRUE unless you set the focus to a control } void CDateTimePickerDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CUTSampleAboutDlg dlgAbout(IDR_MAINFRAME,ID_DESCRIPTION_FILE); dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CDateTimePickerDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CDateTimePickerDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CDateTimePickerDlg::GetVars() { DWORD dwStyle=m_ctlDateTimePicker.GetStyle(); m_bCanParse=(dwStyle&DTS_APPCANPARSE)!=0 ? TRUE : FALSE; m_bShowNone=(dwStyle&DTS_SHOWNONE)!=0 ? TRUE : FALSE; m_bUpDown=(dwStyle&DTS_UPDOWN)!=0 ? TRUE : FALSE; m_bRightAlign=(dwStyle&DTS_RIGHTALIGN)!=0 ? TRUE : FALSE; if((dwStyle&DTS_TIMEFORMAT)!=0) m_nFormat=0; else if((dwStyle&DTS_SHORTDATEFORMAT)!=0) m_nFormat=1; else if((dwStyle&DTS_LONGDATEFORMAT)!=0) m_nFormat=2; else m_nFormat=1; m_clrTrailingText=m_ctlDateTimePicker.GetMonthCalColor(MCSC_TRAILINGTEXT); m_clrTitleText=m_ctlDateTimePicker.GetMonthCalColor(MCSC_TITLETEXT); m_clrTitleBk=m_ctlDateTimePicker.GetMonthCalColor(MCSC_TITLEBK); m_clrText=m_ctlDateTimePicker.GetMonthCalColor(MCSC_TEXT); m_clrMonthBk=m_ctlDateTimePicker.GetMonthCalColor(MCSC_MONTHBK); m_clrBk=m_ctlDateTimePicker.GetMonthCalColor(MCSC_BACKGROUND); // font // CFont* pFont=m_ctlDateTimePicker.GetMonthCalFont(); if(pFont==NULL) pFont=m_ctlDateTimePicker.GetFont(); VERIFY(pFont->GetLogFont(&m_lfMonthCal)); m_sMonthCalFontName.Format(_T("%d pt, %s"), (ConvertLogUnitToPoint(m_lfMonthCal.lfHeight)+5)/10, m_lfMonthCal.lfFaceName); m_ctlMonthCalFontName.SetTextLogFont(&m_lfMonthCal); m_ctlMonthCalFontName.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT)); ///////////////////////////// VERIFY(UpdateData(FALSE)); } void CDateTimePickerDlg::SetMonthCalColors() { if(!UpdateData(TRUE)) return; m_ctlDateTimePicker.SetMonthCalColor(MCSC_TRAILINGTEXT,m_clrTrailingText); m_ctlDateTimePicker.SetMonthCalColor(MCSC_TITLETEXT,m_clrTitleText); m_ctlDateTimePicker.SetMonthCalColor(MCSC_TITLEBK,m_clrTitleBk); m_ctlDateTimePicker.SetMonthCalColor(MCSC_TEXT,m_clrText); m_ctlDateTimePicker.SetMonthCalColor(MCSC_MONTHBK,m_clrMonthBk); m_ctlDateTimePicker.SetMonthCalColor(MCSC_BACKGROUND,m_clrBk); } void CDateTimePickerDlg::OnCheckCanparse() { // TODO: Add your control notification handler code here VERIFY(UpdateData(TRUE)); if(m_bCanParse) RecreateDateTimePicker(DTS_APPCANPARSE,0); else RecreateDateTimePicker(0,DTS_APPCANPARSE); } void CDateTimePickerDlg::OnCheckShownone() { // TODO: Add your control notification handler code here VERIFY(UpdateData(TRUE)); if(m_bShowNone) RecreateDateTimePicker(DTS_SHOWNONE,0); else RecreateDateTimePicker(0,DTS_SHOWNONE); } void CDateTimePickerDlg::OnCheckUpdown() { // TODO: Add your control notification handler code here VERIFY(UpdateData(TRUE)); if(m_bUpDown) RecreateDateTimePicker(DTS_UPDOWN,0); else RecreateDateTimePicker(0,DTS_UPDOWN); } void CDateTimePickerDlg::OnCheckRightalign() { // TODO: Add your control notification handler code here VERIFY(UpdateData(TRUE)); if(m_bRightAlign) m_ctlDateTimePicker.ModifyStyle(0,DTS_RIGHTALIGN,SWP_NOSIZE); else m_ctlDateTimePicker.ModifyStyle(DTS_RIGHTALIGN,0); } void CDateTimePickerDlg::OnRadioFormat() { // TODO: Add your control notification handler code here VERIFY(UpdateData(TRUE)); DWORD dwAddStyle=0; DWORD dwRemoveStyle=0; switch(m_nFormat) { case 0: dwAddStyle=DTS_TIMEFORMAT; dwRemoveStyle=DTS_SHORTDATEFORMAT|DTS_LONGDATEFORMAT; break; case 1: dwAddStyle=DTS_SHORTDATEFORMAT; dwRemoveStyle=DTS_TIMEFORMAT|DTS_LONGDATEFORMAT; break; case 2: dwAddStyle=DTS_LONGDATEFORMAT; dwRemoveStyle=DTS_SHORTDATEFORMAT|DTS_TIMEFORMAT; break; } //remove previous format style m_ctlDateTimePicker.ModifyStyle(dwRemoveStyle,0); //set this style m_ctlDateTimePicker.ModifyStyle(0,dwAddStyle,SWP_NOSIZE); if(m_nFormat!=0) SetDateFormat(); else SetTimeFormat(); } BOOL CDateTimePickerDlg::RecreateDateTimePicker(DWORD dwAddStyle, DWORD dwRemoveStyle) { CRect rc; m_ctlDateTimePicker.GetWindowRect(rc); long lStyle = ::GetWindowLong(m_ctlDateTimePicker.m_hWnd,GWL_STYLE); lStyle |= dwAddStyle; lStyle &= ~dwRemoveStyle; m_ctlDateTimePicker.DestroyWindow(); ScreenToClient(rc); if(m_ctlDateTimePicker.Create(lStyle,rc,this,IDC_DATETIMEPICKER)) { if(m_nFormat!=0) SetDateFormat(); else SetTimeFormat(); return TRUE; } else return FALSE; } void CDateTimePickerDlg::OnDTDropDown(NMHDR *pHdr, LRESULT *pRes) { UNREFERENCED_PARAMETER(pHdr); VERIFY(UpdateData(TRUE)); SetMonthCalColors(); static CFont font; if((HFONT)font!=NULL) font.DeleteObject(); VERIFY(font.CreateFontIndirect(&m_lfMonthCal)); m_ctlDateTimePicker.SetMonthCalFont(&font,FALSE); COXMonthCalCtrl* pCtlMonthCal=m_ctlDateTimePicker.GetMonthCalCtrl(); ASSERT(pCtlMonthCal); if(m_bNotoday) pCtlMonthCal->ModifyStyle(0,MCS_NOTODAY); else pCtlMonthCal->ModifyStyle(MCS_NOTODAY,0); #if (_WIN32_IE >= 0x0400) if(m_bNotodaycircle) pCtlMonthCal->ModifyStyle(0,MCS_NOTODAYCIRCLE); else pCtlMonthCal->ModifyStyle(MCS_NOTODAYCIRCLE,0); #endif if(m_bWeeknumbers) pCtlMonthCal->ModifyStyle(0,MCS_WEEKNUMBERS); else pCtlMonthCal->ModifyStyle(MCS_WEEKNUMBERS,0); pCtlMonthCal->SetMonthDelta(m_nScrollRate); pCtlMonthCal->SetFirstDayOfWeek(m_nFirstDay); switch(m_nDimension) { case 0: pCtlMonthCal->SetCtrlDimension(1,1); break; case 1: pCtlMonthCal->SetCtrlDimension(2,1); break; case 2: pCtlMonthCal->SetCtrlDimension(1,2); break; case 3: pCtlMonthCal->SetCtrlDimension(2,2); break; default: ASSERT(FALSE); } pCtlMonthCal->EnableToolTips(TRUE); *pRes=0; } void CDateTimePickerDlg::OnButtonCalfont() { // TODO: Add your control notification handler code here VERIFY(UpdateData(TRUE)); // Use font common dialog CFontDialog fontDlg(&m_lfMonthCal); if(fontDlg.DoModal()==IDOK) { fontDlg.GetCurrentFont(&m_lfMonthCal); m_sMonthCalFontName.Format(_T("%d pt, %s"),(fontDlg.GetSize()+5)/10, m_lfMonthCal.lfFaceName); m_ctlMonthCalFontName.SetTextLogFont(&m_lfMonthCal); UpdateData(FALSE); } } void CDateTimePickerDlg::OnSelchangeComboDateformat() { // TODO: Add your control notification handler code here VERIFY(UpdateData(TRUE)); if(m_nFormat!=0) SetDateFormat(); } void CDateTimePickerDlg::OnSelchangeComboTimeformat() { // TODO: Add your control notification handler code here VERIFY(UpdateData(TRUE)); if(m_nFormat==0) SetTimeFormat(); } void CDateTimePickerDlg::SetDateFormat() { if(m_nDateFormat==0) m_ctlDateTimePicker.SetFormat(NULL); else { CString sFormat; m_cmbDateFormat.GetLBText(m_nDateFormat,sFormat); m_ctlDateTimePicker.SetFormat(sFormat); } } void CDateTimePickerDlg::SetTimeFormat() { if(m_nTimeFormat==0) m_ctlDateTimePicker.SetFormat(NULL); else { CString sFormat; m_cmbTimeFormat.GetLBText(m_nTimeFormat,sFormat); m_ctlDateTimePicker.SetFormat(sFormat); } } int CDateTimePickerDlg::ConvertPointToLogUnit(const int nPointSize, CDC* pDC/*=NULL*/) { HDC hDC; if (pDC!=NULL) { ASSERT_VALID(pDC); ASSERT(pDC->m_hAttribDC != NULL); hDC=pDC->m_hAttribDC; } else hDC=::GetDC(NULL); // convert nPointSize to logical units based on pDC POINT pt; pt.y=::GetDeviceCaps(hDC,LOGPIXELSY)*nPointSize; pt.y/=720; // 72 points/inch, 10 decipoints/point ::DPtoLP(hDC,&pt,1); POINT ptOrg = {0,0}; ::DPtoLP(hDC,&ptOrg,1); if(pDC==NULL) ::ReleaseDC(NULL,hDC); return -abs(pt.y-ptOrg.y); } int CDateTimePickerDlg::ConvertLogUnitToPoint(const int nLogUnitSize, CDC* pDC/*=NULL*/) { HDC hDC; if (pDC!=NULL) { ASSERT_VALID(pDC); ASSERT(pDC->m_hAttribDC != NULL); hDC=pDC->m_hAttribDC; } else hDC=::GetDC(NULL); POINT ptOrg={0,0}; ::DPtoLP(hDC,&ptOrg,1); POINT pt={0,0}; pt.y=abs(nLogUnitSize)+ptOrg.y; ::LPtoDP(hDC,&pt,1); pt.y*=720; // 72 points/inch, 10 decipoints/point int nPointSize=(pt.y)/(::GetDeviceCaps(hDC,LOGPIXELSY)); if (pDC==NULL) ::ReleaseDC(NULL,hDC); return nPointSize; }