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

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

?? minicalendarctrl.cpp

?? 一款最完整的工業(yè)組態(tài)軟源代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// ----------------------------------------------------------------------------
// 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
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品国产三级国产aⅴ中文 | 一区二区在线电影| 99久久er热在这里只有精品66| 国产亚洲短视频| 色综合天天综合网天天看片| 亚洲图片你懂的| 色天天综合久久久久综合片| 香蕉成人伊视频在线观看| 91麻豆精品国产无毒不卡在线观看| 天堂蜜桃一区二区三区| 日韩一区二区电影| 丰满岳乱妇一区二区三区| 最新国产の精品合集bt伙计| 欧洲一区二区三区免费视频| 亚洲chinese男男1069| 91精品国产91热久久久做人人| 国内外精品视频| 1区2区3区国产精品| 欧美福利视频一区| 国产成人午夜高潮毛片| 一区二区三区不卡视频| 日韩午夜中文字幕| 国产91丝袜在线播放| 亚洲黄色免费网站| 日韩欧美高清一区| 波多野结衣视频一区| 亚洲电影第三页| 国产日韩视频一区二区三区| 欧美日韩五月天| 高清av一区二区| 亚洲成在线观看| 国产欧美一区二区精品仙草咪| 欧美怡红院视频| 国产精品1区2区3区| 亚洲制服丝袜av| 国产视频在线观看一区二区三区 | 午夜精品久久久久久久久| 欧美精品一区二区蜜臀亚洲| www.日韩在线| 麻豆精品视频在线观看视频| 伊人色综合久久天天人手人婷| 日韩美女视频一区二区在线观看| 色综合久久久久综合| 美女视频第一区二区三区免费观看网站 | 欧美日本一区二区| aa级大片欧美| 精品无码三级在线观看视频| 午夜精品久久久久久久久久 | 99久久久久久99| 久久精品72免费观看| 亚洲电影激情视频网站| 日韩伦理av电影| 欧美激情一区二区三区蜜桃视频| 日韩精品中文字幕一区二区三区| 在线观看91视频| 9l国产精品久久久久麻豆| 国模少妇一区二区三区| 五月天激情综合| 亚洲在线观看免费| 亚洲视频综合在线| 国产精品素人视频| 久久久久久久久久电影| 欧美一级片在线看| 欧美日本国产一区| 欧美日本在线看| 欧美日韩精品欧美日韩精品一综合| 91影院在线免费观看| 成人sese在线| 福利一区二区在线观看| 精品亚洲国内自在自线福利| 麻豆精品新av中文字幕| 久久国产精品一区二区| 久久精品国产网站| 美腿丝袜亚洲三区| 久久精品国产色蜜蜜麻豆| 免费在线观看一区| 美女脱光内衣内裤视频久久影院| 肉丝袜脚交视频一区二区| 婷婷成人激情在线网| 丝袜亚洲另类欧美| 日本少妇一区二区| 日韩不卡一区二区三区| 青青草成人在线观看| 麻豆91在线观看| 国产一区二区三区国产| 国内成人精品2018免费看| 国产真实乱对白精彩久久| 国产精品一二三在| 成人高清在线视频| 99久久99久久精品免费观看 | 欧美唯美清纯偷拍| 欧美精品xxxxbbbb| 日韩女优毛片在线| 精品国产髙清在线看国产毛片| ww久久中文字幕| 国产精品久久看| 一区二区不卡在线播放 | 亚洲欧洲日产国码二区| 亚洲特黄一级片| 亚洲一二三四区| 久久99久久久久| 成人黄色软件下载| 欧美日韩一区在线| 精品日产卡一卡二卡麻豆| 国产三级欧美三级日产三级99| 中文字幕在线一区免费| 亚洲午夜成aⅴ人片| 九色porny丨国产精品| 欧美疯狂做受xxxx富婆| 久久中文字幕电影| 亚洲欧美日韩电影| 五月天一区二区| 国产成人在线视频播放| 在线看不卡av| 久久久国产午夜精品| 洋洋成人永久网站入口| 蜜臀av性久久久久蜜臀aⅴ流畅 | 91黄色激情网站| 日韩欧美电影一区| 亚洲免费在线视频一区 二区| 免费人成黄页网站在线一区二区 | 捆绑调教美女网站视频一区| 不卡免费追剧大全电视剧网站| 欧美精选一区二区| 中文在线资源观看网站视频免费不卡| 亚洲一区二区三区中文字幕在线| 国产在线一区观看| 欧美亚洲一区三区| 久久九九久久九九| 午夜精品免费在线观看| www.66久久| 久久久久久久网| 日韩在线一区二区| 色偷偷88欧美精品久久久| 亚洲精品在线一区二区| 亚洲成a人v欧美综合天堂下载| 成人一区二区三区视频| 日韩精品中文字幕一区| 亚洲一区二区在线观看视频 | 丝袜亚洲另类丝袜在线| 色欧美日韩亚洲| 久久精品这里都是精品| 日韩电影一区二区三区四区| 91麻豆国产自产在线观看| 久久一二三国产| 日韩二区三区在线观看| 欧美影院精品一区| 国产精品美女一区二区三区| 国产一区二区伦理| 日韩亚洲欧美高清| 日韩中文欧美在线| 欧美体内she精视频| 亚洲视频中文字幕| av午夜精品一区二区三区| 欧美经典一区二区| 国产一区二区三区不卡在线观看| 91精品国产综合久久精品| 亚洲高清三级视频| 欧美日韩一区二区电影| 亚洲精品乱码久久久久久日本蜜臀| 成人性生交大片免费看视频在线 | 欧美在线不卡一区| 日韩一区在线播放| 欧美日韩国产首页在线观看| 亚洲精品第1页| 色偷偷成人一区二区三区91| 一区二区欧美视频| 91久久精品一区二区| 亚洲一区精品在线| 在线观看91精品国产入口| 亚洲一区二区三区四区的| 在线观看免费成人| 亚洲亚洲精品在线观看| 欧美精品久久一区二区三区| 天堂一区二区在线| 欧美大片国产精品| 国产中文一区二区三区| 亚洲国产经典视频| 99在线精品视频| 亚洲一区二区精品久久av| 欧美精品在线视频| 日本va欧美va瓶| www激情久久| 成人国产一区二区三区精品| 亚洲免费在线看| 欧美一区二区在线免费观看| 久久国产福利国产秒拍| 国产日韩精品视频一区| 一本大道久久精品懂色aⅴ| 亚洲图片一区二区| 欧美videos中文字幕| 国产成人av福利| 亚洲精品视频在线观看网站| 欧美精品在线观看一区二区| 国产剧情av麻豆香蕉精品| 成人欧美一区二区三区视频网页| 欧美私人免费视频| 麻豆91在线播放| 一区视频在线播放| 337p亚洲精品色噜噜狠狠|