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

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

?? barline.h

?? 圖像編程的參考資料
?? H
?? 第 1 頁 / 共 2 頁
字號:
#if !defined(__BARLINE_H__)
#define __BARLINE_H__

#include "graphics.h"
#include <string>
using namespace std;

//////////////////////////////////////////////////////////////////////////////////
////// class CBarLine
template <class T>
class CBarLine : public CGraphics
{
public:
	CBarLine();

	virtual bool SetRange(double, double, double, double) { return true; }

	enum TicksType { TICKS_NONE, TICKS_VERT, TICKS_HORZ, TICKS_BOTH };
    void SetData(T* pData, int Rows, int Cols, string* RowLables, string* ColLables);                 
	T GetMaxValue();
	void Line(bool HasGrid = true, int LineStyle = PS_SOLID, int LineWidth = 0);
	void Bar(bool HasGrid = true, bool bVert = true);
	void Bar3D(bool HasGrid = true, bool bVert = true);
	void GanttBar(bool HasGrid = true, bool bVert = true);

protected: 
	virtual void Legend(COLORREF cr, int Index, const char* Name);
	double GetTickValue(T nMaxValue, int nNumDiv);
	int GetBarLineMetrics(int nHDiv, int nVDiv, SIZE& sizeGraph, 
						  SIZE& sizePixelsPerTick, POINT& ptOrigin);
	void AxesTicks(POINT ptOrigin, SIZE sizePixelsPerTick,
			  int nHorzTicks, int nVertTicks, int nDrawTicks);
	void PlotCaptions(POINT ptOrigin, SIZE sizePixelsPerTick, T nValue, double nValuePerTick, 
					  int nNumTicks, int nCharHeight, bool bVert = true);
	void PlotGanttCaptions(POINT ptOrigin, SIZE sizePixelsPerTick, double nValuePerTick, 
					  int nNumTicks, int nCharHeight, bool bVert = true);
	void PlotCaptions(POINT ptOrigin, SIZE sizePixelsPerTick, int nNumTicks, 
					  int nCharHeight, BOOL bVert);
    
	bool	m_bHasGrid;
	T*		m_pData;
	int		m_nDataRows;
	int		m_nDataCols;
	int		m_nStartRow;
	int		m_nStartCol;
	string* m_pRowsLable;
	string* m_pColsLable; 
	double	Graduations[21];	
};

///////////////////////////////////////////////////////////////////////////////
// CBarLine operations
template<class T>
CBarLine<T>::CBarLine()
{                           
    m_nStartRow		= 1;
	m_nStartCol		= 1;
	m_bHasGrid		= false;
	m_pData			= NULL;
	m_pColsLable	= NULL;
	Graduations[0]	= 0.1;
	Graduations[1]	= 0.2;
	Graduations[2]	= 0.5;
	Graduations[3]	= 0.75;
	Graduations[4]	= 1;
	Graduations[5]	= 2;
	Graduations[6]	= 5;
	Graduations[7]	= 10;
	Graduations[8]	= 20;
	Graduations[9]	= 50;
	Graduations[10] = 100;
	Graduations[11] = 200;
	Graduations[12] = 500;
	Graduations[13] = 1000;
	Graduations[14] = 2000;
	Graduations[15] = 5000;
	Graduations[16] = 10000;
	Graduations[17] = 20000;
	Graduations[18] = 50000;
	Graduations[19] = 100000;
	Graduations[20] = 0;

	SetRange(0, 0, 0, 0);
} 

template<class T>
void CBarLine<T>::SetData(T *pData, int Rows, int Cols, string* RowsLable, string* ColsLable)
{        
	m_pData			= pData;
    m_nDataRows		= Rows;
	m_nDataCols		= Cols;
	m_pRowsLable	= RowsLable;
	m_pColsLable	= ColsLable;                      
}

template<class T>
T CBarLine<T>::GetMaxValue()
{                          
    T* pnData = m_pData;
    T nMax    = *pnData;

    for (int i = m_nDataRows * m_nDataCols - 1; i--;)
	{
		if (*pnData > nMax)
			nMax = *pnData;
		pnData++;
	}

    return nMax;
} 

template<class T>
double CBarLine<T>::GetTickValue(T nMaxValue, int nNumDiv)
{
	// Determine values for vertical ticks
	T nValuePerTick = (T)(((int)nMaxValue + nNumDiv - 1) / nNumDiv);
	for (int i = 0; Graduations[i] > 0.; i++)
	{
		if (Graduations[i] >= nValuePerTick)
		{
			return Graduations[i];
		}
	}
	return Graduations[i-1];
}

template<class T>
int CBarLine<T>::GetBarLineMetrics(int nHDiv, int nVDiv, SIZE& sizeGraph, 
								 SIZE& sizePixelsPerTick, POINT& ptOrigin)
{                       
	SIZE  sizeText;

	::GetTextExtentPoint32(m_hDC, "M", 1, &sizeText);

	sizeGraph.cx = PX;
	sizeGraph.cy = PY;
                                            
	sizePixelsPerTick.cx = sizeGraph.cx / nHDiv;
	sizePixelsPerTick.cy = sizeGraph.cy / nVDiv;

	ptOrigin.x = GL;
	ptOrigin.y = GB;

	return sizeText.cy;
}

template<class T>
void CBarLine<T>::AxesTicks(POINT ptOrigin, SIZE sizePixelsPerTick,
						   int nHorzTicks, int nVertTicks, int nDrawTicks)
{
	int nHeight = sizePixelsPerTick.cy * nVertTicks;
	int nWidth  = sizePixelsPerTick.cx * nHorzTicks;

	// Draw Axes
	if (m_bHasGrid)
		DrawRectangle(ptOrigin.x, ptOrigin.y - nHeight, ptOrigin.x + nWidth, ptOrigin.y);
	else
	{
		::MoveToEx(m_hDC, ptOrigin.x, ptOrigin.y - nHeight, NULL);
		::LineTo(m_hDC, ptOrigin.x, ptOrigin.y);
		::LineTo(m_hDC, ptOrigin.x + nWidth, ptOrigin.y);
	}
	
	int nTickSize = (sizePixelsPerTick.cx / 20);
	if (nTickSize < 6)
		nTickSize = 6;

	if (nDrawTicks & TICKS_VERT)
	{
		// Draw Vertical Ticks
		int nVPos = ptOrigin.y - sizePixelsPerTick.cy;
		int xLeft  = ptOrigin.x - nTickSize;
		int xRight = ptOrigin.x;

		for (int i = 1; i < nVertTicks; i++)
		{
			DrawLine(xLeft, nVPos, xRight, nVPos);
			nVPos -= sizePixelsPerTick.cy;
		}

		if (m_bHasGrid)
		{
			nVPos  = ptOrigin.y - sizePixelsPerTick.cy;
			HPEN  hPen, hOldPen;
			hPen = ::CreatePen(PS_DOT, 0, m_nGridColor);
			hOldPen = (HPEN)::SelectObject(m_hDC, hPen);
			for (i = 1; i < nVertTicks; i++)
			{
				DrawLine(ptOrigin.x + 1, nVPos, ptOrigin.x + nWidth - 1, nVPos);
				nVPos -= sizePixelsPerTick.cy;
			}
			::SelectObject(m_hDC, hOldPen);
			::DeleteObject(hPen);
		}
	}

	if (nDrawTicks & TICKS_HORZ)
	{
		// Draw Horizontal Ticks
		int nHPos   = ptOrigin.x + sizePixelsPerTick.cx;
		int yTop    = ptOrigin.y;
		int yBottom = ptOrigin.y + nTickSize + 1;
		for (int i = 1; i < nHorzTicks; i++)
		{
			DrawLine(nHPos, yTop, nHPos, yBottom);
			nHPos += sizePixelsPerTick.cx;
		}

		if (m_bHasGrid)
		{
			nHPos = ptOrigin.x + sizePixelsPerTick.cx;
			HPEN  hPen, hOldPen;
			hPen = ::CreatePen(PS_DOT, 0, m_nGridColor);
			hOldPen = (HPEN)::SelectObject(m_hDC, hPen);
			for (i = 1; i < nHorzTicks; i++)
			{
				DrawLine(nHPos, ptOrigin.y - nHeight + 1, nHPos, ptOrigin.y - 1);
				nHPos += sizePixelsPerTick.cx;
			}
			::SelectObject(m_hDC, hOldPen);
			::DeleteObject(hPen);
		}
	}
}

template<class T>
void CBarLine<T>::PlotCaptions(POINT ptOrigin, SIZE sizePixelsPerTick, T nValue, 
							   double nValuePerTick, int nNumTicks, int nCharHeight, bool bVert)
{                 
    char  buf[80];
    
	int nTickSize = (bVert ? sizePixelsPerTick.cx : sizePixelsPerTick.cy) / 30;
	if (nTickSize < 2)
		nTickSize = 2;

	int nPos  = bVert ? ptOrigin.y : ptOrigin.x;
	int nStep = bVert ? -sizePixelsPerTick.cy : sizePixelsPerTick.cx;

	int bm = ::SetBkMode(m_hDC, TRANSPARENT);
	SetStringAlign(bVert ? RIGHT : CENTER, TOP);
	m_LogFont.lfHeight = (int)(m_Size.cx / -30.0);
	if (m_LogFont.lfHeight > -10) m_LogFont.lfHeight = -10;
	m_LogFont.lfWeight     = 500;
	m_LogFont.lfOrientation= 0;
	m_LogFont.lfEscapement = 0;
	m_Font = ::CreateFontIndirect(&m_LogFont);
	if (m_Font)
	{
		HFONT hOldFont = (HFONT)::SelectObject(m_hDC, m_Font);
		SetTextColor(m_hDC, m_nTickColor); 
		for (int i = 0; i < nNumTicks; i++)
		{
			Format(3, buf, nValue);
			if (bVert)
				PrintString(GL - m_lM / 6, nPos - nCharHeight / 2, 0, buf);
			else
				PrintString(nPos, GB + m_bM / 5, 0, buf);

			nValue += nValuePerTick;
			nPos   += nStep;
		}
		::SelectObject(m_hDC, hOldFont);
		::DeleteObject(m_Font);
	}
	::SetBkMode(m_hDC, bm);
}

template<class T>
void CBarLine<T>::PlotCaptions(POINT ptOrigin, SIZE sizePixelsPerTick, 
		                       int nNumTicks, int nCharHeight, BOOL bVert)
{
	int nTickSize = (bVert ? sizePixelsPerTick.cx : sizePixelsPerTick.cy) / 30;
	if (nTickSize < 2)
		nTickSize = 2;

	int nPos  = bVert ? ptOrigin.y : ptOrigin.x;
	int nStep = bVert ? -sizePixelsPerTick.cy : sizePixelsPerTick.cx;

	int bm = ::SetBkMode(m_hDC, TRANSPARENT);
	SetStringAlign(bVert ? RIGHT : CENTER, TOP);
		m_LogFont.lfHeight = (int)(m_Size.cx / -30.0);
	if (m_LogFont.lfHeight > -10) m_LogFont.lfHeight = -10;
	m_LogFont.lfWeight     = 500;
	m_LogFont.lfOrientation= 0;
	m_LogFont.lfEscapement = 0;
	m_Font = ::CreateFontIndirect(&m_LogFont);
	if (m_Font)
	{
		HFONT hOldFont = (HFONT)::SelectObject(m_hDC, m_Font);
		SetTextColor(m_hDC, m_nTickColor); 
		for (int i = 0; i < nNumTicks; i++)
		{
			if (bVert)
				PrintString(GL - m_lM / 6, nPos - nCharHeight / 2, 0, m_pColsLable[i].c_str());
			else
				PrintString(nPos, GB + m_bM / 5, 0, m_pColsLable[i].c_str());
			nPos   += nStep;
		}
		::SelectObject(m_hDC, hOldFont);
		::DeleteObject(m_Font);
	}
	::SetBkMode(m_hDC, bm);
}

template<class T>
void CBarLine<T>::PlotGanttCaptions(POINT ptOrigin, SIZE sizePixelsPerTick, 
									double nValuePerTick, int nNumTicks, int nCharHeight, bool bVert)
{                 
	int nTickSize = (bVert ? sizePixelsPerTick.cx : sizePixelsPerTick.cy) / 30;
	if (nTickSize < 2)
		nTickSize = 2;

	int nPos  = bVert ? ptOrigin.y : ptOrigin.x;
	int nStep = bVert ? -sizePixelsPerTick.cy : sizePixelsPerTick.cx;

	int bm = ::SetBkMode(m_hDC, TRANSPARENT);
	SetStringAlign(bVert ? RIGHT : CENTER, TOP);
	m_LogFont.lfHeight = (int)(m_Size.cx / -30.0);
	if (m_LogFont.lfHeight > -10) m_LogFont.lfHeight = -10;
	m_LogFont.lfWeight     = 500;
	m_LogFont.lfOrientation= 0;
	m_LogFont.lfEscapement = 0;
	m_Font = ::CreateFontIndirect(&m_LogFont);
	if (m_Font)
	{
		HFONT hOldFont = (HFONT)::SelectObject(m_hDC, m_Font);
		SetTextColor(m_hDC, m_nTickColor); 
		for (int i = 0; i < nNumTicks; i++)
		{
			if (bVert)
				PrintString(GL - m_lM / 6, nPos - nCharHeight / 2, 0, m_pRowsLable[i].c_str());
			else
				PrintString(nPos, GB + m_bM / 5, 0, m_pRowsLable[i].c_str());
			nPos   += nStep;
		}
		::SelectObject(m_hDC, hOldFont);
		::DeleteObject(m_Font);
	}
	::SetBkMode(m_hDC, bm);
}

template<class T>
void CBarLine<T>::Line(bool HasGrid, int LineStyle, int LineWidth)
{                   
	m_bHasGrid			 = HasGrid;
	T nMaxValue			 = GetMaxValue();  
	double nValuePerTick = GetTickValue(nMaxValue, 5);
	
	SIZE  sizeGraph;
	SIZE  sizePixelsPerTick;
	POINT ptOrigin;
	int nCharHeight = GetBarLineMetrics(m_nDataCols - 1, 5, sizeGraph, sizePixelsPerTick, ptOrigin);
	AxesTicks(ptOrigin, sizePixelsPerTick, m_nDataCols - 1, 5, TICKS_BOTH);
                        
	PlotCaptions(ptOrigin, sizePixelsPerTick, (T)0, nValuePerTick, 6, nCharHeight, TRUE);					
	PlotCaptions(ptOrigin, sizePixelsPerTick, m_nDataCols, nCharHeight, FALSE);                 
		                          
	T* pData = m_pData;
	if (m_bLegendShadow && m_bEnableLegend)
		DrawShadow(m_nDataRows);

	for (int nRow = 0; nRow < m_nDataRows; nRow ++)
	{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
韩国av一区二区| 亚洲国产成人高清精品| 久久99精品国产麻豆婷婷| 日韩欧美一区电影| 免费在线观看成人| 精品福利在线导航| 国产精品一区在线观看乱码| 欧美精品一区二| 国产成人av一区二区三区在线观看| 久久久精品日韩欧美| www.欧美精品一二区| 一区二区三区影院| 日韩无一区二区| 国产一区二区精品久久| 国产精品嫩草99a| 在线欧美小视频| 日精品一区二区三区| 精品少妇一区二区三区日产乱码| 国产在线视频一区二区三区| 国产精品丝袜在线| 欧美日韩精品久久久| 精品影视av免费| 亚洲视频一区二区在线观看| 欧美日韩亚洲不卡| 国产精品一区二区久久精品爱涩| 中文字幕一区二区三区不卡在线| 欧美婷婷六月丁香综合色| 国产乱国产乱300精品| 一区二区在线观看免费| 欧美一区二区三区四区高清| 成人av在线播放网站| 亚洲国产成人av网| 国产欧美日韩视频在线观看| 在线免费观看日本一区| 国产精品一卡二| 天使萌一区二区三区免费观看| 久久久三级国产网站| 在线观看亚洲精品视频| 国产成人综合亚洲网站| 天天综合天天做天天综合| 国产精品天天看| 日韩午夜电影在线观看| 91国产福利在线| 国产成都精品91一区二区三| 亚洲一本大道在线| 国产精品久久久久久久久免费樱桃| 欧美色偷偷大香| 波多野结衣在线aⅴ中文字幕不卡| 午夜精品123| 亚洲男人天堂av| 国产日本一区二区| 日韩欧美美女一区二区三区| 色综合一个色综合亚洲| 成人激情开心网| 国产精品白丝jk黑袜喷水| 日本视频一区二区三区| 亚洲妇熟xx妇色黄| 亚洲黄色av一区| 国产精品美女久久久久aⅴ国产馆| 精品欧美乱码久久久久久1区2区| 88在线观看91蜜桃国自产| 色综合久久综合网97色综合| 丁香婷婷综合网| 理论片日本一区| 日本伊人色综合网| 夜夜嗨av一区二区三区| 亚洲视频一区在线观看| 久久亚洲私人国产精品va媚药| 日韩一区二区在线看| 欧美一区二区三区四区视频| 制服丝袜激情欧洲亚洲| 欧美三级在线视频| 欧美日本韩国一区| 欧美日韩三级一区| 欧美精品丝袜久久久中文字幕| 欧美日韩另类国产亚洲欧美一级| 欧美午夜一区二区三区 | 国产一区二区女| 久久精品久久精品| 美女视频黄久久| 韩国v欧美v日本v亚洲v| 国产一区啦啦啦在线观看| 激情都市一区二区| 高清不卡一区二区| 成人福利视频网站| 95精品视频在线| 在线观看亚洲a| 91精品国产综合久久久久久久久久| 欧美精品一二三区| 精品久久久久久无| 国产精品视频在线看| 亚洲色图欧美偷拍| 午夜精品久久久久久久久| 美女爽到高潮91| 国产成人在线视频网址| 99re8在线精品视频免费播放| 一本大道久久a久久综合| 欧美日韩五月天| 精品国产在天天线2019| 中文字幕视频一区| 午夜一区二区三区视频| 蜜臀久久99精品久久久久久9| 久久99国产精品久久99果冻传媒| 豆国产96在线|亚洲| 欧美午夜片在线看| 久久一区二区视频| 伊人开心综合网| 久久99精品久久久久久久久久久久 | 国产午夜精品理论片a级大结局| 国产精品伦理在线| 五月天丁香久久| 成人一区二区在线观看| 欧美性感一类影片在线播放| 精品国产乱码久久久久久蜜臀| 国产精品你懂的| 日本vs亚洲vs韩国一区三区 | 99久久久久久| 欧美一区二区三区在线观看视频| 久久精品夜夜夜夜久久| 亚洲黄色av一区| 国产精品一区二区在线播放| 欧美午夜在线一二页| 久久久国产精品不卡| 亚洲国产精品视频| 成人三级伦理片| 日韩一区二区视频| 一区二区三区在线视频观看58| 精品写真视频在线观看| 欧美在线免费播放| 中文字幕国产精品一区二区| 日韩综合在线视频| 91黄色免费观看| 国产喂奶挤奶一区二区三区| 午夜视频一区二区三区| 91在线免费播放| 久久精品免视看| 水蜜桃久久夜色精品一区的特点| 成人夜色视频网站在线观看| 日韩视频国产视频| 亚洲国产成人tv| 色综合久久久久综合体| 国产欧美日韩在线| 国产中文一区二区三区| 欧美一区二区三区免费| 夜夜嗨av一区二区三区| 99久久免费视频.com| 国产欧美一区二区精品性色超碰| 天堂va蜜桃一区二区三区 | 精品日本一线二线三线不卡| 亚洲一区在线视频| 色网站国产精品| 亚洲欧洲一区二区在线播放| 国产麻豆精品久久一二三| 日韩精品最新网址| 免费看精品久久片| 91麻豆精品国产91久久久使用方法 | 亚洲三级视频在线观看| 成人网在线播放| 久久综合五月天婷婷伊人| 男女激情视频一区| 欧美一区二区三区播放老司机| 亚洲国产精品久久人人爱蜜臀| 色综合中文综合网| 亚洲品质自拍视频| 国产成人精品影院| 国产网站一区二区| 国产九色精品成人porny| 精品国产乱码久久久久久久久 | 亚洲一区二区三区爽爽爽爽爽| 97se亚洲国产综合自在线观| 国产精品三级视频| 暴力调教一区二区三区| 中文字幕欧美三区| 91蜜桃免费观看视频| 亚洲视频在线观看一区| 在线观看亚洲a| 日韩av午夜在线观看| 欧美一级黄色片| 国产一区二区在线视频| 久久久久99精品一区| 成人成人成人在线视频| 亚洲色图.com| 欧美色图一区二区三区| 首页国产欧美日韩丝袜| 日韩精品一区二区三区四区| 精品写真视频在线观看| 国产精品美女久久久久久久网站| 99久久99久久精品免费看蜜桃| 尤物av一区二区| 欧美精品黑人性xxxx| 国产一区二区三区四| 国产精品精品国产色婷婷| 色婷婷综合久色| 日本一不卡视频| 国产亚洲欧美日韩在线一区| 91网站在线观看视频| 日本va欧美va精品| 中文字幕第一区| 欧美色倩网站大全免费| 国产一区二区久久|