亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? minicalendarctrl.cpp

?? 一款最完整的工業(yè)組態(tài)軟源代碼
?? CPP
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
// ----------------------------------------------------------------------------
// Written by Tony Ioanides (tonyi@bigpond.com)
// Copyright (c) 2003 Tony Ioanides.
//
// This code may be used in compiled form in any way you desire. This file may 
// be redistributed by any means PROVIDING it is not sold for profit without 
// the authors written consent, and providing that this notice and the authors 
// name is included. 
//
// This file is provided "as is" with no expressed or implied warranty.
// The author accepts no liability if it causes any damage to you or your
// computer whatsoever.
// ----------------------------------------------------------------------------

#include "stdafx.h"
#include "MiniCalendarCtrl.h"

#include <algorithm>

#ifndef NUM_ELEMENTS
	#define NUM_ELEMENTS(a) (sizeof(a)/sizeof(*a))
#endif // NUM_ELEMENTS

// ----------------------------------------------------------------------------
static CRect
MC_GetArrowRect(CRect rectHeader, BOOL bLeftArrow)
{
	const int yMid = (rectHeader.top + rectHeader.bottom) / 2;
	const int cx = rectHeader.Height() / 5;

	rectHeader.top = yMid - cx;
	rectHeader.bottom = yMid + cx;

	if (bLeftArrow)
	{
		rectHeader.left += 6;
		rectHeader.right = rectHeader.left + cx;
	}
	else
	{
		rectHeader.right -= 6;
		rectHeader.left = rectHeader.right - cx;
	}

	return rectHeader;
}

// ----------------------------------------------------------------------------
static void
MC_DrawArrow(CDCHandle dc, CRect rectHeader, BOOL bLeftArrow)
{
	RECT rect = MC_GetArrowRect(rectHeader, bLeftArrow);

	if (bLeftArrow)
		std::swap(rect.left, rect.right);

	POINT ptTriangle[] = 
	{
		{ rect.left, rect.top },
		{ rect.left, rect.bottom },
		{ rect.right, (rect.top + rect.bottom) / 2 }
	};

	HBRUSH hbrOrig = dc.SelectStockBrush(BLACK_BRUSH);

	dc.Polygon(ptTriangle, NUM_ELEMENTS(ptTriangle));
	dc.SelectBrush(hbrOrig);
}

// ----------------------------------------------------------------------------

// ----------------------------------------------------------------------------
// Internal constants

enum
{
	nMonthsPerYear = 12,
	nDaysPerWeek = 7,
	nRowsPerCell = 6,
	nDaysPerCell = nRowsPerCell * nDaysPerWeek,
	nBorderSize = 4,
	nCellMargin = 10
};

#define ID_TIMER_FIRST  0xDEAD
#define ID_TIMER_REPEAT 0xC0DE

#define HEADER_FORMAT   _T("%B %Y")

// ----------------------------------------------------------------------------
CMiniCalendarCtrl::CMiniCalendarCtrl()
{
	m_crBack = GetSysColor(COLOR_WINDOW);

	m_bShow3dBorder = 1;
	m_bShowNonMonthDays = 1;
	m_bHighlightToday = 1;
	m_bMultiSelEnabled = 1;

	m_nCols = 1;
	m_nRows = 1;

	m_nFirstDayOfWeek = 1;
	m_nStartMonth = 1;
	m_nStartYear = 1970;
	m_nMonthsToScroll = 1;

	m_daySpace.cx = 4;
	m_daySpace.cy = 4;

	m_nActiveElement = 0;
}

// ----------------------------------------------------------------------------
BOOL
CMiniCalendarCtrl::IsDateSelected(const COleDateTime& date) const
{
	if (m_dtSelect.GetStatus() != COleDateTime::valid)
		return FALSE;

	if (date == m_dtSelect)
		return TRUE;
		
	if (m_bMultiSelEnabled && m_dtAnchor.GetStatus() == COleDateTime::valid)
		return m_dtSelect > m_dtAnchor ?
			(date >= m_dtAnchor && date <= m_dtSelect) :
			(date >= m_dtSelect && date <= m_dtAnchor);

	return FALSE;
}

// ----------------------------------------------------------------------------
SIZE
CMiniCalendarCtrl::GetMaxSize() const
{
	return GetMaxSize(m_nCols, m_nRows);
}

// ----------------------------------------------------------------------------
SIZE
CMiniCalendarCtrl::GetMaxSize(UINT nCols, UINT nRows) const
{
	const int cxyBorder = m_bShow3dBorder ? (nBorderSize * 2) : 0;

	return CSize(
		nCols * m_cellSize.cx + cxyBorder,
		nRows * m_cellSize.cy + cxyBorder);
}

// ----------------------------------------------------------------------------
BOOL 
CMiniCalendarCtrl::SetLayout(UINT nCols, UINT nRows)
{
	if (nCols > 0 && nRows > 0 && ((int) nCols != m_nCols || (int) nRows != m_nRows))
	{
		m_nCols = nCols; 
		m_nRows = nRows;

		AutoSize();
		return TRUE;
	}

	return FALSE;
}

// ----------------------------------------------------------------------------
BOOL
CMiniCalendarCtrl::SetFirstDayOfWeek(UINT nFirstDayOfWeek)
{
	if (nFirstDayOfWeek >= 1 && nFirstDayOfWeek <= nDaysPerWeek &&
		nFirstDayOfWeek != (UINT) m_nFirstDayOfWeek)
	{
		m_nFirstDayOfWeek = nFirstDayOfWeek;
		Invalidate();
		return TRUE;
	}

	return FALSE;
}

// ----------------------------------------------------------------------------
void
CMiniCalendarCtrl::AutoSize()
{
	const SIZE size = GetMaxSize();
	SetWindowPos(0, 0, 0, size.cx, size.cy, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
}

// ----------------------------------------------------------------------------
BOOL
CMiniCalendarCtrl::EnsureVisible(const COleDateTime& date)
{
	if (date.GetStatus() != COleDateTime::valid)
		return FALSE;

	if (date >= GetMonthFromCell(0, 0) &&
		date <= GetMonthFromCell(m_nCols - 1, m_nRows - 1))
		return FALSE;

	m_nStartMonth = date.GetMonth();
	m_nStartYear = date.GetYear();

	RedrawWindow();
	return TRUE;
}

// ----------------------------------------------------------------------------
BOOL
CMiniCalendarCtrl::ResetRange()
{
	if (m_dtAnchor.GetStatus() == COleDateTime::valid)
	{
		m_dtAnchor.SetStatus(COleDateTime::invalid);
		NotifySelChanged();

		Invalidate();
		return TRUE;
	}
	
	m_dtAnchor.SetStatus(COleDateTime::invalid);
	return FALSE;
}

// ----------------------------------------------------------------------------
LRESULT
CMiniCalendarCtrl::OnCreate(LPCREATESTRUCT lpcs) 
{
	hNotifyWindow = GetParent();

	m_font[FontHeader].bBold = TRUE;
	m_font[FontHeader].nFontSize = 10;

	m_font[FontSpecialDayNumber].bBold = TRUE;

	for (int i = 0; i < NUM_ELEMENTS(m_font); ++i)
		CreateFont(i);

	ApplyStyle(lpcs->style);
	
	RecalcLayout();
	AutoSize();
	EnsureVisible(COleDateTime::GetCurrentTime());

	SetMsgHandled(FALSE);
	return 0;
}

// ----------------------------------------------------------------------------
LRESULT
CMiniCalendarCtrl::OnStyleChanged(UINT nType, LPSTYLESTRUCT lpss)
{
	if (nType & GWL_STYLE)
		ApplyStyle(lpss->styleNew);

	SetMsgHandled(FALSE);
	return 0;
}

// ----------------------------------------------------------------------------
LRESULT 
CMiniCalendarCtrl::OnTimer(UINT nID, TIMERPROC /*fnProc*/)
{
	switch (nID)
	{
		case ID_TIMER_FIRST:
			KillTimer(ID_TIMER_FIRST);
			if (m_nActiveElement & htHeader)
			{
				DoScroll(m_nActiveElement, m_nMonthsToScroll);

				int nElapse = 250;
				DWORD nRepeat = 40;

				if (SystemParametersInfo(SPI_GETKEYBOARDSPEED, 0, &nRepeat, 0))
					nElapse = 10000 / (5 * nRepeat + 25);	// milli-seconds, approximated
				SetTimer(ID_TIMER_REPEAT, nElapse);
			}
			break;

		case ID_TIMER_REPEAT:
			if (m_nActiveElement & htHeader)
				DoScroll(m_nActiveElement, m_nMonthsToScroll);
			else if (GetCapture() != m_hWnd)
				KillTimer(ID_TIMER_REPEAT);
			break;

		default:
			break;
	}

	return 0;
}

// ----------------------------------------------------------------------------
LRESULT
CMiniCalendarCtrl::OnMouseMove(UINT /*nFlags*/, CPoint point) 
{
	if (GetCapture() == m_hWnd)
	{
		m_nActiveElement &= ~htHeader;

		HitTestInfo ht;
		ht.ptHit = point;

		if (HitTest(ht))
		{
			if ((m_nActiveElement & htDate) && (ht.nFlags & htDate) && ht.dtHit != m_dtSelect)
			{
				m_dtSelect = ht.dtHit;

				if (ht.nFlags & (htBack | htNext))
					DoScroll(ht.nFlags);
				else
					RedrawWindow();

				NotifySelChanged();
			}

			if ((m_nActiveElement & (htBack | htNext)) &&
				ht.nFlags == UINT(htHeader | m_nActiveElement))
			{
				ATLTRACE("ResumeScroll\n");
				m_nActiveElement = ht.nFlags;
			}
		}
	}

	return 0;
}

// ----------------------------------------------------------------------------
LRESULT
CMiniCalendarCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
{
	m_nActiveElement = 0;

	HitTestInfo ht;
	ht.ptHit = point;

	if (HitTest(ht)) 
	{
		SetCapture();
		m_nActiveElement = ht.nFlags;

		if (m_nActiveElement & htHeader)
		{
			if (m_nActiveElement & (htBack | htNext))
			{
				DoScroll(ht.nFlags, m_nMonthsToScroll);

				int nElapse = 250;
				int nDelay = 0;
				if (SystemParametersInfo(SPI_GETKEYBOARDDELAY, 0, &nDelay, 0))
					nElapse += nDelay * 250;	// all milli-seconds
				SetTimer(ID_TIMER_FIRST, nElapse);
			}
			else
			{
				// Show month list here.
			}
		}
		else if (m_nActiveElement & htButton)
		{
		}
		else if (m_nActiveElement & htDate)
		{
			if (m_dtAnchor.GetStatus() != COleDateTime::valid || ! (nFlags & MK_SHIFT))
				m_dtAnchor = ht.dtHit;

			m_dtSelect = ht.dtHit;

			if (m_nActiveElement & (htBack | htNext))
				DoScroll(ht.nFlags);
			else
				RedrawWindow();

			NotifySelChanged();
		}
		else
			ResetRange();
	}

	return 0;
}

// ----------------------------------------------------------------------------
LRESULT
CMiniCalendarCtrl::OnLButtonUp(UINT /*nFlags*/, CPoint /*point*/) 
{
	ReleaseCapture();
	m_nActiveElement = 0;
	return 0;
}

// ----------------------------------------------------------------------------
LRESULT
CMiniCalendarCtrl::OnCaptureChanged(HWND /*hWnd*/) 
{
	m_nActiveElement = 0;
	return 0;
}

// ----------------------------------------------------------------------------
void
CMiniCalendarCtrl::DrawBorder(CDCHandle dc, CRect& rectClient)
{
	if (m_bShow3dBorder)
	{
		static const struct
		{
			COLORREF crTL;
			COLORREF crBR;
		} border[] =
		{
			{ COLOR_3DFACE,    COLOR_BTNTEXT },
			{ COLOR_3DHILIGHT, COLOR_3DSHADOW },
			{ COLOR_3DFACE,    COLOR_3DFACE },
			{ COLOR_3DSHADOW,  COLOR_3DHILIGHT }
		};

		for (int i = 0; i < NUM_ELEMENTS(border); ++i)
		{
			dc.Draw3dRect(rectClient, 
				GetSysColor(border[i].crTL), 
				GetSysColor(border[i].crBR));
			rectClient.DeflateRect(1, 1);
		}
	}
}

// ----------------------------------------------------------------------------
int
CMiniCalendarCtrl::DrawHeader(CDCHandle dc, CPoint pt, int nCol, int nRow)
{
	CRect rectHeader(0, 0, m_cellSize.cx, m_cyHeader);
	rectHeader.OffsetRect(pt);

	// Draw 'button' part
	dc.Draw3dRect(rectHeader, 
		GetSysColor(COLOR_3DHILIGHT), GetSysColor(COLOR_3DSHADOW));
	rectHeader.DeflateRect(1, 1);

	dc.FillSolidRect(rectHeader, GetSysColor(COLOR_3DFACE));
	rectHeader.DeflateRect(1, 1);

	// Draw the text
	const COleDateTime dt = GetMonthFromCell(nCol, nRow);
	const CString str = dt.Format(HEADER_FORMAT);

	SelectFont(dc, FontHeader);

	dc.DrawText(str, str.GetLength(), rectHeader, 
		DT_CENTER | DT_VCENTER | DT_SINGLELINE);

	// Draw arrow(s) (if required)
	if (nRow == 0 && (nCol == 0 || nCol == m_nCols - 1))
	{
		rectHeader.SetRect(0, 0, m_cellSize.cx, m_cyHeader);
		rectHeader.OffsetRect(pt);

		if (nCol == 0)
			MC_DrawArrow(dc, rectHeader, TRUE);

		if (nCol == m_nCols - 1)
			MC_DrawArrow(dc, rectHeader, FALSE);
	}

	return m_cyHeader;
}

// ----------------------------------------------------------------------------
int 
CMiniCalendarCtrl::DrawDaysOfWeek(CDCHandle dc, CPoint pt, int /*nCol*/, int /*nRow*/)
{
	const int cxColumn = m_dateSize.cx + m_daySpace.cx;
	const int xBeg = pt.x + m_xCol;

	SelectFont(dc, FontDayName);

	// Draw day names.
	CRect rectDate(xBeg, pt.y, xBeg + cxColumn, pt.y + m_cyDayNames);

	for (int i = 1; i <= nDaysPerWeek; ++i)
	{
		dc.DrawText(GetDayOfWeekName(i), 1, rectDate,  
			DT_SINGLELINE | DT_RIGHT | DT_VCENTER);
		rectDate.OffsetRect(cxColumn, 0);
	}
	rectDate.bottom += 4;

	// Draw separator.
	dc.SelectBrush(GetSysColorBrush(COLOR_3DSHADOW));
	dc.PatBlt(xBeg, rectDate.bottom - 2, 
		cxColumn * nDaysPerWeek + m_daySpace.cx, 1, PATCOPY);

	return rectDate.bottom - pt.y;
}

// ----------------------------------------------------------------------------
int 
CMiniCalendarCtrl::DrawDays(CDCHandle dc, CPoint pt, int nCol, int nRow)
{
	const int cxColumn = m_dateSize.cx + m_daySpace.cx;
	const int xBeg = pt.x + m_xCol;

	COleDateTime dt = GetFirstDayInCell(nCol, nRow);

	const COleDateTime dtCell = GetMonthFromCell(nCol, nRow);
	const COleDateTime dtToday = COleDateTime::GetCurrentTime();

	const BOOL bBegRange = nCol == 0 && nRow == 0;
	const BOOL bEndRange = nCol == m_nCols - 1 && nRow == m_nRows - 1;
	const int nThisMonth = dtCell.GetMonth();

	// Determine position of 'today' in this cell (if required).
	CPoint ptToday(-1, -1);

	if (m_bHighlightToday && 
		dtToday.GetMonth() == nThisMonth &&	dtToday.GetYear() == dtCell.GetYear())
	{

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人三级小说| 久久久精品欧美丰满| 在线观看日韩精品| av中文字幕在线不卡| 欧美日韩一区二区三区视频| 亚洲高清三级视频| 一区二区在线免费| 日本一区二区免费在线观看视频| 亚洲精品国产a| 亚洲美女区一区| 精品黑人一区二区三区久久| 久久99久久精品欧美| 91国内精品野花午夜精品| 亚洲乱码国产乱码精品精可以看 | 日韩精品五月天| 欧美午夜电影在线播放| 欧美va日韩va| 亚洲黄色在线视频| 国产一区二区在线影院| 色婷婷久久一区二区三区麻豆| 亚洲女子a中天字幕| 亚洲伊人伊色伊影伊综合网| 午夜精品福利一区二区蜜股av| 五月天视频一区| 久久99深爱久久99精品| 成人黄色网址在线观看| 色狠狠综合天天综合综合| 欧美精品自拍偷拍动漫精品| 精品久久久久久久人人人人传媒| 国产女主播在线一区二区| 亚洲精品中文在线观看| 亚洲第一av色| 国产精品自产自拍| 欧洲av一区二区嗯嗯嗯啊| 日韩欧美国产一区二区在线播放| 国产精品乱人伦| 日本欧美一区二区三区| 成人在线综合网| 3atv一区二区三区| 亚洲色图色小说| 狠狠色狠狠色合久久伊人| 在线中文字幕一区| 久久久精品免费网站| 婷婷国产v国产偷v亚洲高清| 国产凹凸在线观看一区二区| 91精品国产综合久久久蜜臀粉嫩| 国产精品伦理一区二区| 日精品一区二区三区| www.66久久| 国产欧美一区二区精品仙草咪| 午夜久久久影院| 色婷婷综合久久久久中文一区二区| 精品少妇一区二区三区日产乱码 | 久久不见久久见中文字幕免费| www.欧美精品一二区| 日韩视频123| 一个色综合网站| av成人免费在线| 中文无字幕一区二区三区| 久久精品国产秦先生| 欧美久久高跟鞋激| 亚洲精品v日韩精品| caoporn国产一区二区| 久久久久久久网| 精品一区二区三区视频在线观看| 欧美理论电影在线| 黄一区二区三区| 国产精品综合二区| 日韩一区二区三区在线| 亚洲一区二区三区在线播放| 91日韩在线专区| 亚洲日韩欧美一区二区在线| 成人午夜电影小说| 精品国产第一区二区三区观看体验 | 国产精品久久久久久久久久久免费看| 石原莉奈在线亚洲三区| 欧美性猛交一区二区三区精品| 亚洲欧美日韩久久| 在线看一区二区| 亚洲一区二区三区四区五区黄| 色天天综合久久久久综合片| 亚洲欧洲综合另类| 欧美综合欧美视频| 午夜精品久久久久久久99水蜜桃 | 日本成人在线网站| 欧美电视剧在线看免费| 久久精品999| 国产日韩欧美一区二区三区乱码| 国产盗摄精品一区二区三区在线| 欧美经典一区二区| 99精品欧美一区二区蜜桃免费| 国产精品超碰97尤物18| 欧洲色大大久久| 午夜视频久久久久久| 欧美一区二区视频网站| 国产精品一区二区免费不卡| 国产精品网站一区| 欧美专区日韩专区| 另类小说一区二区三区| 欧美激情一区二区| 欧美日韩一区二区三区高清| 青娱乐精品视频| 国产欧美日韩一区二区三区在线观看| 国产成人精品午夜视频免费| 中文字幕一区二区三区不卡| 欧美日韩精品一区二区三区四区 | 色婷婷狠狠综合| 另类小说欧美激情| 中文字幕不卡在线观看| 精品视频1区2区| 国产在线精品一区二区| 亚洲在线视频免费观看| 欧美成人女星排名| 91老司机福利 在线| 久久se精品一区精品二区| 国产精品久久久久久久久快鸭 | 精品一区二区三区香蕉蜜桃 | 香蕉久久夜色精品国产使用方法| 国产精品色婷婷| 日韩一区二区在线看片| 99热在这里有精品免费| 五月天激情综合| 中文字幕一区二区三区不卡在线| 亚洲成av人综合在线观看| 精品国产一区二区精华| 国产成人精品亚洲日本在线桃色 | 大尺度一区二区| 一区二区三区中文字幕电影 | 丁香亚洲综合激情啪啪综合| 国产精品视频观看| 欧美一区二区三区四区五区| 色综合天天综合在线视频| 国模冰冰炮一区二区| 日韩精品三区四区| 亚洲国产日韩综合久久精品| 一色桃子久久精品亚洲| 久久久国际精品| 欧美成人精品3d动漫h| 欧美日韩另类一区| 一本大道久久a久久精二百| 国产成人免费av在线| 国产伦精品一区二区三区免费迷 | 蜜乳av一区二区| 亚洲国产一二三| 亚洲精品第一国产综合野| 国产精品国产三级国产普通话蜜臀| 日韩欧美国产精品一区| 日韩一级视频免费观看在线| 欧美精品三级在线观看| 51精品秘密在线观看| 精品视频123区在线观看| 欧美日韩综合色| 色婷婷av一区二区三区软件| 97精品电影院| 99re热这里只有精品视频| 国产成a人无v码亚洲福利| 国产成人av资源| 国产精品自拍一区| 韩国精品在线观看| 精品无人区卡一卡二卡三乱码免费卡| 偷拍与自拍一区| 免费看欧美女人艹b| 开心九九激情九九欧美日韩精美视频电影| 五月激情综合色| 蜜桃av噜噜一区| 久久精品国产99| 黄色日韩网站视频| 国产成人免费在线观看| 成人黄色在线看| 日本乱人伦一区| 日韩一区二区免费在线电影| 亚洲精品在线网站| 国产精品美女久久久久高潮| 亚洲精品成人精品456| 日日夜夜精品视频天天综合网| 日本v片在线高清不卡在线观看| 韩国精品主播一区二区在线观看| 不卡一二三区首页| 欧美男同性恋视频网站| 久久久久国产精品麻豆| 亚洲色图清纯唯美| 免费高清在线视频一区·| 国产成人av电影免费在线观看| 一本高清dvd不卡在线观看| 91精品欧美综合在线观看最新| 26uuu久久综合| 亚洲黄色片在线观看| 久久精品国产色蜜蜜麻豆| 成人爽a毛片一区二区免费| 欧美三级乱人伦电影| 久久久久久久久久美女| 亚洲精品一二三四区| 日本免费新一区视频| 国产91精品免费| 欧美日韩精品专区| 中文字幕欧美激情一区| 亚洲va天堂va国产va久| 成人激情开心网| 日韩欧美国产综合一区| 成人欧美一区二区三区1314 |