⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dtpicker.h

📁 一款最完整的工业组态软源代码
💻 H
📖 第 1 页 / 共 2 页
字号:
		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 + -