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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? graphiteview.cpp

?? 這是在wince下面可以跑的一個畫函數的軟件
?? CPP
字號:
//
//	Graphite For WinCE(Pocket PC)
//  Initially Written By Hyouck "Hawk" Kim, peakhunt@yahoo.com
//	2002, All Rights Reserved
//
//	This is GPLed, open source based, software development project.
//	For more question about GPL,
//	visit http://www.gnu.org/licenses/gpl.txt
//
//	
//	Revision History
//	Nov/30/2002,		Initial Release		hkim	
//
//

// graphiteView.cpp : implementation of the CGraphiteView class
//

//////////////////////////////////////////////////////////////////////
//
// This is View implementation of Graphite.
//
// If you are familiar with Win32 Memory DC and related stuffs,
// I guess to read this code would be pretty easy.
//
// But still, we have a few challenging, I guess, issues. 
//
// First of all,
// Because of limited screen resolution, it's impossible to map each and every
// unique logical position to an unique screen pixel point.
// Because of this, sometimes, an ugly effect happens.
//
// Second of all,
// We have a performance issue.
// For example, for X axis, if the range is 8
// and if you want to use 0.01 value level X delta,
// It takes quite a time to draw the graph.
// For this problem, I guess we have no easy solution.
// Use of thread might look like a solution. But wait a minute.
// It doesn't solve any problem, that is, it doesn't make things faster.
//
// I guess the wise solution is just accept the fact and
// show some progress dialog while drawing graph.
//
//
// But Don't be so frustrated. Here are some good news.
// If we don't update screen because of mathematical change, that is, document change
// then we don't have to write a new same graph.
// That's because of I save all graph image in a memory device context.
//
// Here are some improvements need to be done.
// 1>We need scroll function.
//   Currently, if an user scrolls left/right/up/down,
//   the code reclaculates all points with a new X/Y values.
//   But we don't have to do that.
//   Better way is to draw only newly added area as a side effect of scrolling.
//
// Happy Graphying!!!
// H.Kim
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "graphite.h"

#include "graphiteDoc.h"
#include "graphiteView.h"
#include <math.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CGraphiteView

IMPLEMENT_DYNCREATE(CGraphiteView, CView)

BEGIN_MESSAGE_MAP(CGraphiteView, CView)
	//{{AFX_MSG_MAP(CGraphiteView)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGraphiteView construction/destruction

CGraphiteView::CGraphiteView()
{
	// TODO: add construction code here
	m_crBack	= RGB(255, 255, 255);	//white
	m_crEdge	= RGB(  0,   0,   0);	//black
	m_crTitle	= RGB(  0,   0,   0);	//black
	m_crDotLine	= RGB(255, 255,   0);
	m_crPlot	= RGB(255,   0,   0);	//red
	m_crXY		= RGB(0  ,   0,   0);

	m_xTitle	=  L"X ";
	m_yTitle	=  L"Y ";

	m_brush.CreateSolidBrush(m_crBack);
}

CGraphiteView::~CGraphiteView()
{
}

BOOL CGraphiteView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CGraphiteView drawing

void CGraphiteView::OnDraw(CDC* pDC)
{
	CGraphiteDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	// TODO: add draw code for native data here
	CRect rect;
	GetClientRect(rect);

	if(m_backDC.GetSafeHdc() == NULL)
		DrawBackGround(pDC);

	if(m_xyTitleDC.GetSafeHdc() == NULL)
		DrawXYTitle(pDC);

	if(m_graphDC.GetSafeHdc() == NULL)
		DrawGraph(pDC);

	pDC->BitBlt(0,0, rect.Width(), rect.Height(),
		&m_graphDC, 0, 0, SRCCOPY);
}

/////////////////////////////////////////////////////////////////////////////
// CGraphiteView diagnostics

#ifdef _DEBUG
void CGraphiteView::AssertValid() const
{
	CView::AssertValid();
}

void CGraphiteView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CGraphiteDoc* CGraphiteView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGraphiteDoc)));
	return (CGraphiteDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CGraphiteView message handlers

void CGraphiteView::DrawBackGround(CDC *dc)
{
	CRect	rect;
	CPen	penDot;
	CPen	penNormal;
	CRect	edge;
	CPen	*oldPen;
	CGraphiteDoc* pDoc = GetDocument();

	GetClientRect(rect);

	if(m_backDC.GetSafeHdc() == NULL)
	{
		// first time
		m_backDC.CreateCompatibleDC(dc);
		m_backBitmap.CreateCompatibleBitmap(dc,
			rect.Width(), rect.Height());
		m_backDC.SelectObject(&m_backBitmap);
	}
	m_backDC.SetBkColor(m_crBack);
	m_backDC.FillRect(rect, &m_brush);

	//Draw Edge
	GetPlotRect(edge, rect);
	{
		CPen	penEdge;
		penEdge.CreatePen(PS_SOLID, 0, m_crEdge);
		oldPen = m_backDC.SelectObject(&penEdge);
		m_backDC.DrawFocusRect(edge);
		m_backDC.SelectObject(oldPen);
	}

	int cx, cy;
	cx = (edge.left + edge.right)/2;
	cy = (edge.top  + edge.bottom)/2;

	//draw dotted line
	{
		CPen penDot;
		int  pix_inc = edge.Width()/(NUM_MEASURE_PER_PAGE);

		penDot.CreatePen(PS_DASH, 0, m_crDotLine);
		oldPen = m_backDC.SelectObject(&penDot);
		for(int i = 1; i < NUM_MEASURE_PER_PAGE; i++)
		{
			m_backDC.MoveTo(edge.left + i*pix_inc, edge.top);
			m_backDC.LineTo(edge.left + i*pix_inc, edge.bottom);
			m_backDC.MoveTo(edge.left,  edge.top + i*pix_inc);
			m_backDC.LineTo(edge.right, edge.top + i*pix_inc);
		}
		m_backDC.SelectObject(oldPen);
	}
}

void CGraphiteView::GetPlotRect(CRect& edge, CRect& rect)
{
	edge = rect;

	edge.top	+= TOP_SPACE_IN_PIXEL;
	edge.left	+= SIDE_SPACE_IN_PIXEL;
	edge.right	-= SIDE_SPACE_IN_PIXEL;
	edge.bottom	-= BOTTOM_SPACE_IN_PIXEL;

	// practcally
	// on wince
	// it's impossible for width to be bigger than height.
	if(edge.Width() < edge.Height())
	{
		int diff = edge.Height() - edge.Width();
		edge.bottom -= diff;
	}
}

int CGraphiteView::physicalX(double vx)
{
	CGraphiteDoc* pDoc = GetDocument();
	int x;
	double range = (pDoc->m_maxX - pDoc->m_minX);
	double diff = (vx - pDoc->m_minX);
	double pct;
	CRect rect,edge;

	GetClientRect(rect);
	GetPlotRect(edge, rect);

	pct = (diff/range)*100;
	if(pct < 0 || pct > 100)
		return -1;

	if(pct == 100)
		x = edge.right;
	else
		x = edge.left + (int)((edge.Width())*pct/100);
	return x;
}

int CGraphiteView::physicalY(double vy)
{
	CGraphiteDoc* pDoc = GetDocument();
	int y;
	double range = (pDoc->m_maxY - pDoc->m_minY);
	double diff = (vy - pDoc->m_minY);
	double pct;
	CRect rect,edge;

	GetClientRect(rect);
	GetPlotRect(edge, rect);

	pct = (diff/range)*100;
	if(pct < 0 || pct > 100)
		return -1;
	if(pct == 100)
		y = edge.top;
	else
		y = edge.bottom - (int)((edge.Height())*pct/100);
	return y;
}

void CGraphiteView::addPoint(double x, double y)
{
	int px, py;

	px = physicalX(x);
	py = physicalY(y);
	if(px < 0 || py < 0)
		return;
}

void CGraphiteView::DrawXYTitle(CDC *pDC)
{
	CRect rect;
	CGraphiteDoc* pDoc = GetDocument();

	GetClientRect(rect);

	if(m_xyTitleDC.GetSafeHdc() == NULL)
	{
		// first time
		m_xyTitleDC.CreateCompatibleDC(pDC);
		m_xyTitleBitmap.CreateCompatibleBitmap(pDC,
			rect.Width(), rect.Height());
		m_xyTitleDC.SelectObject(&m_xyTitleBitmap);
	}
	m_xyTitleDC.SetBkColor(m_crBack);
	m_xyTitleDC.FillRect(rect, &m_brush);
	m_xyTitleDC.BitBlt(0, 0,
		rect.Width(), rect.Height(),
		&m_backDC, 0, 0, SRCCOPY);
	
	//draw XY axis
	CPen penXY, *oldPen;
	CRect edge;

	GetPlotRect(edge, rect);

	penXY.CreatePen(PS_SOLID, 0, m_crXY);
	oldPen = m_xyTitleDC.SelectObject(&penXY);
		
	if(physicalY(0) != -1)
	{
		m_xyTitleDC.MoveTo(edge.left, physicalY(0));
		m_xyTitleDC.LineTo(edge.right,physicalY(0));
	}
	
	if(physicalX(0) != -1)
	{
		m_xyTitleDC.MoveTo(physicalX(0), edge.top);
		m_xyTitleDC.LineTo(physicalX(0), edge.bottom);
	}

	m_xyTitleDC.SelectObject(oldPen);

	// draw title
	{
		CFont font, *oldFont;
		CRect txtRect;

		font.CreateFont(9,4,0, 0, 300,
			FALSE, FALSE, 0, ANSI_CHARSET,
			OUT_DEFAULT_PRECIS,
			CLIP_DEFAULT_PRECIS,
			DEFAULT_QUALITY,
			DEFAULT_PITCH, L"Arial");

		// draw title
		oldFont = m_xyTitleDC.SelectObject(&font);
		m_xyTitleDC.SetTextColor(m_crTitle);
		txtRect.top    = rect.top + 10;
		txtRect.bottom = edge.bottom ;
		txtRect.left   = edge.left;
		txtRect.right  = edge.right;
		m_xyTitleDC.DrawText(pDoc->m_plotTitle,
			txtRect, DT_CENTER | DT_TOP);

		// draw y title
		txtRect.top = edge.bottom + 1;
		txtRect.bottom = rect.bottom;
		m_xyTitleDC.DrawText(m_yTitle,
			txtRect, DT_CENTER | DT_TOP);

		// draw min, max X
		CString str;
		txtRect.left = edge.left;
		txtRect.right = edge.right;
		str.Format(L"%5.2f", pDoc->m_minX);
		m_xyTitleDC.DrawText(str,
			txtRect, DT_LEFT | DT_TOP);
		str.Format(L"%5.2f", pDoc->m_maxX);
		m_xyTitleDC.DrawText(str,
			txtRect, DT_RIGHT | DT_TOP);
		
		// draw x title and y values
		txtRect.top = edge.top;
		txtRect.left = rect.left;
		txtRect.right = edge.left;
		txtRect.bottom = edge.bottom;

		m_xyTitleDC.DrawText(m_xTitle,
			txtRect, 
			DT_LEFT | DT_VCENTER | DT_SINGLELINE);

		str.Format(L"%5.2f", pDoc->m_minY);
		m_xyTitleDC.DrawText(str,
			txtRect,  DT_LEFT | DT_BOTTOM | DT_SINGLELINE);

		str.Format(L"%5.2f", pDoc->m_maxY);
		m_xyTitleDC.DrawText(str,
			txtRect, DT_LEFT | DT_TOP | DT_SINGLELINE);

		m_xyTitleDC.SelectObject(oldFont);
	}
}

void CGraphiteView::DrawGraph(CDC *pDC)
{
	CRect rect;
	CGraphiteDoc* pDoc = GetDocument();

	GetClientRect(rect);

	if(m_graphDC.GetSafeHdc() == NULL)
	{
		// first time
		m_graphDC.CreateCompatibleDC(pDC);
		m_graphBitmap.CreateCompatibleBitmap(pDC,
			rect.Width(), rect.Height());
		m_graphDC.SelectObject(&m_graphBitmap);
	}
	m_graphDC.SetBkColor(m_crBack);
	m_graphDC.FillRect(rect, &m_brush);
	m_graphDC.BitBlt(0, 0,
		rect.Width(), rect.Height(),
		&m_xyTitleDC, 0, 0, SRCCOPY);

	if(pDoc->validDoc())
	{
		double x,y;
		int prevX, prevY;
		bool prevValid = false;
		CPen	penPlot, *oldPen;
		penPlot.CreatePen(PS_SOLID, 0, m_crPlot);
		oldPen = m_graphDC.SelectObject(&penPlot);

		for(x = pDoc->m_minX; x <= pDoc->m_maxX; x += pDoc->m_deltaX)
		{
			int px, py;

			y = pDoc->f(x);
			px = physicalX(x);
			py = physicalY(y);

			if(px < 0 || py < 0)
			{
				prevValid = false;
				continue;
			}
			else if(prevValid)
			{
				m_graphDC.MoveTo(prevX, prevY);
				m_graphDC.LineTo(px, py);

				prevX = px;
				prevY = py;
				prevValid = true;
			}
			else
			{
				//m_graphDC.MoveTo(px, py);
				//m_graphDC.LineTo(px, py);
				prevX = px;
				prevY = py;
				prevValid = true;
			}
		}
		m_graphDC.SelectObject(oldPen);
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品欧美一区二区在线观看| 一区二区三区在线视频免费| 日韩女优制服丝袜电影| 欧美三级视频在线观看| 欧美性三三影院| 欧美三级在线看| 欧美日韩国产123区| 欧美日韩一级片在线观看| 欧美日韩精品免费| 欧美精品123区| 91精品国产一区二区人妖| 91 com成人网| 久久综合九色综合97_久久久| 日韩精品最新网址| 久久久亚洲精品一区二区三区| 国产色产综合产在线视频 | 一区二区三区四区不卡在线| 亚洲欧美一区二区三区国产精品| 亚洲精品国久久99热| 一区二区三区欧美日韩| 亚洲午夜激情av| 日韩福利视频导航| 国内不卡的二区三区中文字幕| 精品在线一区二区三区| 国产精品主播直播| 成人av电影免费观看| 99re成人在线| 欧美男人的天堂一二区| 欧美电视剧在线看免费| 国产人久久人人人人爽| 亚洲美女视频一区| 天堂午夜影视日韩欧美一区二区| 九色porny丨国产精品| 国产999精品久久久久久绿帽| 色美美综合视频| 91超碰这里只有精品国产| 精品国产乱码久久久久久免费 | 中文字幕在线不卡视频| 有码一区二区三区| 捆绑调教一区二区三区| 国产999精品久久久久久| 欧美体内she精高潮| 日韩欧美二区三区| 国产精品你懂的在线欣赏| 偷偷要91色婷婷| 国产精品456| 欧美日韩美女一区二区| 国产午夜精品在线观看| 亚洲国产精品久久久久秋霞影院| 九一九一国产精品| 日本韩国视频一区二区| 日韩视频一区二区三区在线播放 | 另类综合日韩欧美亚洲| 97久久精品人人爽人人爽蜜臀| 欧美久久久久久久久中文字幕| 国产日韩av一区二区| 亚洲成人av免费| 成人一区二区视频| 日韩视频免费观看高清完整版| 国产精品国产三级国产三级人妇| 免费人成精品欧美精品| 色综合天天天天做夜夜夜夜做| 日韩美女视频在线| 有码一区二区三区| 成人高清免费观看| 欧美一区中文字幕| 亚洲摸摸操操av| 国产精品资源在线| 日韩欧美视频一区| 亚洲国产精品麻豆| 99在线精品视频| 久久久综合精品| 蜜桃视频在线观看一区| 91国偷自产一区二区使用方法| 久久精品欧美一区二区三区不卡| 日本va欧美va欧美va精品| 91福利在线观看| 国产精品久久久久aaaa| 国产美女精品在线| 欧美一区二区三区播放老司机| 有坂深雪av一区二区精品| 成人美女视频在线看| 久久这里只有精品首页| 五月天激情综合网| 欧美在线观看一区二区| 最新不卡av在线| 不卡视频在线观看| 国产日韩三级在线| 国产一区二区中文字幕| 日韩一级片在线观看| 亚洲sss视频在线视频| 在线影院国内精品| 亚洲欧美另类图片小说| av激情亚洲男人天堂| 日本一区二区动态图| 国产91精品精华液一区二区三区 | 国产精品系列在线| 国产在线视频精品一区| 精品人伦一区二区色婷婷| 老司机精品视频线观看86| 日韩亚洲电影在线| 奇米影视在线99精品| 91.成人天堂一区| 蜜臀久久99精品久久久久久9| 欧美高清www午色夜在线视频| 亚洲成精国产精品女| 欧美日韩国产成人在线91| 午夜精品久久久久久久久久| 欧美伦理视频网站| 免费成人小视频| 精品国产乱码久久久久久老虎| 六月丁香婷婷久久| 久久嫩草精品久久久精品| 成人午夜又粗又硬又大| 国产精品伦理一区二区| 99久久精品费精品国产一区二区| 成人欧美一区二区三区视频网页 | 日韩欧美国产麻豆| 精品一区二区三区在线观看国产| 精品理论电影在线| 国产高清精品久久久久| 国产农村妇女毛片精品久久麻豆| 成人性生交大片免费看中文网站 | a在线播放不卡| 亚洲卡通动漫在线| 欧美日韩一本到| 日本中文字幕不卡| 久久久三级国产网站| 成人精品gif动图一区| 亚洲美女在线国产| 在线不卡免费欧美| 国产麻豆精品视频| 国产精品久久福利| 欧美午夜电影网| 精品一区精品二区高清| 国产精品久久福利| 欧美日韩国产中文| 国产一区在线看| 亚洲欧美另类久久久精品2019| 69久久夜色精品国产69蝌蚪网| 国产一区二区三区免费看| 中文字幕一区二区三区不卡在线| 欧美日韩中字一区| 国产在线麻豆精品观看| 中文字幕一区二区不卡| 欧美老年两性高潮| 国产成人午夜视频| 午夜欧美视频在线观看| 国产午夜精品一区二区三区四区 | 一区二区三区在线观看视频| 欧美一区二区三区性视频| 成人精品一区二区三区四区 | 欧美日韩精品一区视频| 国产一区二区美女| 亚洲国产综合在线| 国产女主播在线一区二区| 欧美色电影在线| 成人爽a毛片一区二区免费| 亚洲高清中文字幕| 国产欧美精品一区aⅴ影院| 欧美日韩视频一区二区| 国产成人亚洲综合a∨婷婷图片 | 欧美在线观看禁18| 国内精品视频666| 亚洲伊人伊色伊影伊综合网| 久久综合九色综合97_久久久| 欧美午夜精品免费| 国产夫妻精品视频| 日韩国产精品91| 综合av第一页| 久久久国产精品麻豆| 欧美日韩三级一区| 97se亚洲国产综合自在线不卡| 久久99精品网久久| 日韩精品高清不卡| 亚洲精品水蜜桃| 国产精品女主播在线观看| 日韩一级免费一区| 欧美日韩国产电影| 91官网在线免费观看| 成人av网站在线观看| 国内精品久久久久影院薰衣草 | 丝袜美腿亚洲一区| 18涩涩午夜精品.www| 久久久久国色av免费看影院| 欧美丰满嫩嫩电影| 欧美三级日韩三级国产三级| 99久久久无码国产精品| 成人一级片在线观看| 国产麻豆一精品一av一免费| 免费高清视频精品| 日韩av在线发布| 午夜视频一区在线观看| 亚洲精品乱码久久久久久| 国产精品久久久久一区二区三区| 久久新电视剧免费观看| 精品国产一区二区亚洲人成毛片| 9191久久久久久久久久久| 欧美日韩一区二区三区在线看| 一本色道a无线码一区v|