📄 dtpicker.h
字号:
MESSAGE_HANDLER(WM_LBUTTONDOWN,OnLBttonDown)
MESSAGE_HANDLER(WM_LBUTTONUP,OnLBttonUp)
MESSAGE_HANDLER(WM_MOUSELEAVE,OnLBttonUp)
MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)
MESSAGE_HANDLER(WM_SETFONT, OnSetFont)
//MESSAGE_HANDLER(MCXN_LOSEFOCUS, OnCalendarKillFocus)
//MESSAGE_HANDLER(WM_NCCALCSIZE, OnNcCalcSize)
NOTIFY_CODE_HANDLER(MCXN_SELCHANGED,OnCalendarSelChange)
NOTIFY_CODE_HANDLER(MCXN_LOSEFOCUS, OnCalendarKillFocus)
CHAIN_MSG_MAP_ALT(COwnerDraw<CDateTimeCtrl>, 1)
ALT_MSG_MAP(2)
MESSAGE_HANDLER(WM_KILLFOCUS, OnEditKillFocus)
MESSAGE_HANDLER(WM_SETFOCUS, OnEditSetFocus)
MESSAGE_HANDLER(WM_KEYDOWN, OnEditKeyDown)
MESSAGE_HANDLER(WM_GETDLGCODE, OnEditGetDlgCode)
END_MSG_MAP()
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
Init();
return 0;
}
LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
if (_items.GetSize() > 0){
ActivateItem(0);
}
return 0;
}
LRESULT OnCalendarKillFocus(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)
{
m_wndCalendar.ShowWindow(SW_HIDE);
//SetDateTime(&m_wndCalendar.GetSelectedDateTime());
::SetFocus(::GetNextWindow(m_hWnd,GW_HWNDNEXT));
return 0;
}
LRESULT OnCalendarSelChange(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
{
NMMCXSELCHANGED* pnch = (NMMCXSELCHANGED*)pnmh;
SYSTEMTIME st;
bool b = GetDateTime(&st);
ATLASSERT(b);
pnch->dateFrom.wHour = st.wHour;
pnch->dateFrom.wMilliseconds = st.wMilliseconds;
pnch->dateFrom.wMinute = st.wMinute;
pnch->dateFrom.wSecond = st.wSecond;
SetDateTime(&pnch->dateFrom);
return 0;
}
LRESULT OnSetText(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
return 0;
}
LRESULT OnGetText(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
return GetDateTimeText((PTSTR)lParam,wParam);
}
LRESULT OnGetTextLength(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
TCHAR buf[1000];
return GetDateTimeText(buf,1000);
}
LRESULT OnSetFont(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
_edit.SetFont((HFONT)wParam);
bHandled = FALSE;
return 0;
}
LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
return (LRESULT)::GetStockObject(WHITE_BRUSH);
}
LRESULT OnLBttonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
{
CPoint p(lParam);
CRect rc;
GetClientRect(&rc);
rc.left = rc.right-rc.Height();
if (rc.PtInRect(p)){
_fDrawButton = 1;
Invalidate();
TRACKMOUSEEVENT tme = {sizeof(TRACKMOUSEEVENT),TME_LEAVE,m_hWnd};
_TrackMouseEvent(&tme);
ShowCal();
}
else{
const int idx = GetItemIdxByPos(p);
if (idx != -1){
ActivateItem(idx);
}
}
return 0;
}
LRESULT OnLBttonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
_fDrawButton = 2;
Invalidate();
_fDrawButton = 0;
return 0;
}
LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
switch(wParam){
case VK_F4:
ShowCal();
break;
}
bHandled = FALSE;
return 0;
}
LRESULT OnNcPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
return 0;
}
LRESULT OnNcCalcSize(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
return 0;
}
void DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
CDCHandle dc = lpDIS->hDC;
const CRect& r = lpDIS->rcItem;
CRect rcForCombo(r.right-r.Height(),r.top,r.right,r.bottom);
CRect rcForMainArea(r.left,r.top,r.right-r.Height(),r.bottom);
int nState = 0;
if (_fDrawButton == 1)
nState = DFCS_PUSHED;
dc.DrawFrameControl(&rcForCombo,DFC_SCROLL,nState|DFCS_SCROLLDOWN);
if (!_fDrawButton){
CRect rc = rcForMainArea;
if (fBorder){
rc.DeflateRect(2,2);
}
dc.FillSolidRect(rc.left,rc.top,rc.right,rc.bottom,
RGB(255,255,255));
TCHAR buf[500];
const int l = GetDateTimeText(buf,500);
if (l > 0){
dc.SetBkMode(TRANSPARENT);
rc.left += _xOffset;
dc.DrawText(buf,lstrlen(buf),&rc,DT_SINGLELINE|DT_VCENTER);
}
if (fBorder){
dc.DrawEdge(&rcForMainArea,EDGE_SUNKEN,BF_RECT);
}
}
}
///////////////////////////////////
//Handlers for edit control
LRESULT OnEditKillFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
_xOffset = 0;
_edit.ShowWindow(SW_HIDE);
char buf[10];
const int c = ::GetWindowTextA(_edit,buf,10);
const int type_len = lstrlen(_items[_iActiveItemIdx]._type);
if (c < type_len){
if (_items[_iActiveItemIdx]._type[0] != _T('t')){
TCHAR buf1[100] = _T("%0");
buf1[2] = TCHAR(type_len)+_T('0');
buf1[3] = _T('s');
buf1[4] = 0;
//_stprintf(buf1,);
wsprintf(_items[_iActiveItemIdx].data,buf1,buf);
//lstrcpy(_items[_iActiveItemIdx].data,buf1);
}
}
else{
USES_CONVERSION;
lstrcpy(_items[_iActiveItemIdx].data,A2T(buf));
}
Cash[0] = 0;
Invalidate();
bHandled = FALSE;
return 0;
}
LRESULT OnEditSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
_edit.SetSelAll();
bHandled = FALSE;
return 0;
}
LRESULT OnEditKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
if (GetAsyncKeyState(VK_CONTROL) < 0){
switch(wParam){
case VK_LEFT:
PrevItem();
break;
case VK_RIGHT:
NextItem();
break;
}
fCancel = false;
return 0;
}
switch(wParam){
case VK_TAB:
case VK_RETURN:
fCancel = false;
break;
case VK_ESCAPE:
fCancel = true;
break;
case VK_F4:
ShowCal();
default:
bHandled = FALSE;
return 0;
}
::SetFocus(::GetNextWindow(m_hWnd,GW_HWNDNEXT));
// ::SetFocus(GetParent());
return 0;
}
LRESULT OnEditGetDlgCode(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
return DLGC_WANTALLKEYS;
}
protected:
CSimpleArray<CMaskItem> _items;
CMiniCalendarCtrl m_wndCalendar;
TCHAR Cash[500];
bool fCancel;
private:
int _xOffset;
int _iActiveItemIdx;
int _fDrawButton;
CContainedWindowT<CEdit> _edit;
bool fBorder;
}; //end of CDateTimeCtrl
class CDateTimeRangeCtrl : public CDateTimeCtrl
{
private:
typedef CDateTimeCtrl _baseClass;
public:
DECLARE_WND_SUPERCLASS(_T("AWTL_DateTimeRangeCtrl"),GetWndClassName())
private:
BEGIN_MSG_MAP(CDateTimeRangeCtrl)
NOTIFY_CODE_HANDLER(MCXN_SELCHANGED,OnCalendarSelChange)
CHAIN_MSG_MAP(_baseClass)
ALT_MSG_MAP(2)
CHAIN_MSG_MAP_ALT(_baseClass,2)
END_MSG_MAP()
LRESULT OnCalendarSelChange(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
{
NMMCXSELCHANGED* pnch = (NMMCXSELCHANGED*)pnmh;
SetDateTime(&pnch->dateFrom,&pnch->dateTo);
return 0;
}
void Init()
{
_baseClass::Init();
_baseClass::SetFormat(_T("yyyy/MM/dd - yyyy/MM/dd"));
SYSTEMTIME st,st1;
GetSystemTime(&st);
st1 = st;
st1.wYear = 1900;
st.wYear = 2100;
SetDateTime(&st1,&st);
m_wndCalendar.ModifyStyle(0,MCX_MULTISELECT,0);
//Invalidate();
}
public:
void SetDateTime(LPSYSTEMTIME)
{
}
void SetDateTime(LPSYSTEMTIME From,LPSYSTEMTIME To)
{
for(int i = 0;i < _items.GetSize()/2;i++)
{
GetDateFormat(LOCALE_USER_DEFAULT,0,From,
_items[i]._type,_items[i].data,100);
}
for(;i < _items.GetSize();i++)
{
GetDateFormat(LOCALE_USER_DEFAULT,0,To,
_items[i]._type,_items[i].data,100);
}
Cash[0] = 0;
Invalidate();
}
bool GetDateTime(LPSYSTEMTIME)
{
return false;
}
bool GetDateTimeRange(LPSYSTEMTIME dtFrom,LPSYSTEMTIME dtTo)
{
ATLASSERT(dtFrom);
ATLASSERT(dtTo);
TCHAR buf[500];
GetDateTimeText(buf,500);
TCHAR* p = _tcschr(buf,_T('-'));
ATLASSERT(p);
*p = 0;
p++;
CComVariant v(buf);
bool b = SUCCEEDED(v.ChangeType(VT_DATE));
if (b){
b = VariantTimeToSystemTime(v.date,dtFrom) == TRUE;
if (b){
v = p;
b = SUCCEEDED(v.ChangeType(VT_DATE));
if (b)
b = VariantTimeToSystemTime(v.date,dtTo) == TRUE;
}
}
return b;
}
bool SetFormat(PTSTR)
{
return false;
}
protected:
void ShowCal()
{
SetFocus();
ATLASSERT(m_wndCalendar.IsWindow());
SYSTEMTIME from,to;
GetDateTimeRange(&from,&to);
m_wndCalendar.EnsureVisible(from,to);
CRect r;
GetClientRect(&r);
r.OffsetRect(0,r.Height());
ClientToScreen(&r);
m_wndCalendar.SetWindowPos(NULL,&r,SWP_SHOWWINDOW|SWP_NOSIZE);
}
};
} //end of AWTL namespace
#endif //__DTPICKER__H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -