MFC-日期控制元件DataTime的使用詳述
阿新 • • 發佈:2019-01-02
這裡我們想做一個日期控制元件的小demo,空間名為Datatimepicker,定義兩個日期視窗,並且在edit視窗中顯示兩個日期空間所顯示時間之間相差的年月日時分秒。以下為本人一步步的x詳細操作:
首先前面板的控制元件就那麼三個,前兩個是日期控制元件,後一個為編輯框,用來顯示時間間隔,效果圖如下:
相應的id號改好,並將編輯文字框控制元件改成可換行,這可以在屬性裡設定。
這裡附加上日期格式初始化的方式,WIndows裡日期的標準格式為“yyyy-MM-dd HH:mm:ss”年月日時分秒,首先右鍵時間控制元件框新增倆變數,我這裡命名為m_data_begin、m_data_end.在面板初始化函式裡新增相應的程式碼: *(BOOL CDataTimeDemoDlg::OnInitDialog)*
m_data_begin.SetFormat(L"yyyy-MM-dd HH:mm:ss");
m_data_end.SetFormat(L"yyyy-MM-dd HH:mm:ss");//設定為標準的時間格式
既然我們的目的是計算出時間間隔,因此每次在控制元件的時間發生改變的時候都要響應某一個訊息函式,分別點選兩個控制元件右鍵類嚮導,新增相應的處理程式:
出現如下兩個訊息函式:
現在便是要在這個函式中獲取當前時間,且將時間間隔輸出到文字框控制元件中,新增如下的程式碼:
SYSTEMTIME time_begin={0},time_end={0 };
m_data_begin.GetTime(&time_begin);//獲取當前控制元件的時間
m_data_end.GetTime(&time_end);//獲取另一控制元件的時間
/*WORD wYear;WORD wMonth;WORD wDayOfWeek;WORD wDay;WORD wHour;WORD wMinute;WORD wSecond;WORD wMilliseconds;SYSTEMTIME該結構體包含詳細的年月日時分秒並不適於計算*/
FILETIME ft_begin,ft_end;
//從1601年1月1日到今天的納秒數,是另一種型別結構體
SystemTimeToFileTime(&time_begin,&ft_begin);
SystemTimeToFileTime(&time_end,&ft_end);
//相當於對filetime進行的初始化
/*typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;包括高位和低位,並不能直接相減,這裡引入一個聯合體ULARGE_INTEGER*/
ULARGE_INTEGER u_begin,u_end;
u_begin.u.HighPart=ft_begin.dwHighDateTime;
u_begin.u.LowPart=ft_begin.dwLowDateTime;
u_end.u.HighPart=ft_end.dwHighDateTime;
u_end.u.LowPart=ft_end.dwLowDateTime;
ULONGLONG ull_span;//用來存差值(納秒)
ull_span=u_begin.QuadPart>=u_end.QuadPart?(u_begin.QuadPart-u_end.QuadPart):(u_end.QuadPart-u_begin.QuadPart); //三目運算子
ULONGLONG ull_seconds=ull_span/10000000;
int n_minutes=ull_seconds/60;
int n_hours=n_minutes/60;
int n_day=n_hours/24;//計算相應的日時分秒
CString StrOutput;
StrOutput.Format(L"秒數:%d\r\n分鐘數:%d\r\n小時數:%d\r\n天數:%d\r\n",(int)ull_seconds,n_minutes,n_hours,n_day);
SetDlgItemTextW(IDC_EDIT_OUTPUT,StrOutput);
編譯一下,大功告成!