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

📄 cdrawlineargauge.cpp

📁 一个标尺控件
💻 CPP
字号:
// CDrawLinearGauge.cpp: implementation of the CDrawLinearGauge class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "CDrawLinearGauge.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDrawLinearGauge::CDrawLinearGauge()
{
	m_Orientation=0;
	m_Style=0;
	m_rulerStyle=0;
	m_rect.left=0;
	m_rect.top=0;
	m_rect.bottom=0;
	m_rect.right=0;
	m_rulerRect=m_rect;
	m_frameRect=m_rect;
	m_iMax=0;
	m_iMin=0;
	m_imajortics=0;
	m_iminortics=0;

	//hIconLeft = LoadIcon(::AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_LEFT));
	//hIconLeft = LoadIcon(NULL,MAKEINTRESOURCE(IDI_LEFT));
}

CDrawLinearGauge::~CDrawLinearGauge()
{

}

void CDrawLinearGauge::SetStyle(long Style,long Orientation,long rulerStyle)
{
	m_Style = Style;
	m_Orientation = Orientation;
	m_rulerStyle = rulerStyle;
}

void CDrawLinearGauge::SetRect(RECT rc)
{
	m_rect = rc;
	/*m_rect.top = m_rect.top +30;
	m_rect.left = m_rect.left +30;
	m_rect.right = m_rect.right -30;
	m_rect.bottom = m_rect.bottom -30;*/

	m_frameRect=m_rect;
	m_rulerRect = m_frameRect;
	

	if(m_Orientation==0)//0:Horizontal,1:Vertical
	{
		//m_rect.left = m_rect.left+20;
		//m_rect.right = m_rect.right-20;
		switch(m_rulerStyle)//0不显示,1左/上,2右/下,3左右/上下,4,中/左,5,中/右
		{
		case 0:
			m_frameRect=m_rect;
			break;
		case 1:
			m_rulerRect=m_rect;
			m_rulerRect.bottom = (m_rect.bottom+m_rect.top)/2;
			
			m_frameRect=m_rect;
			m_frameRect.top = (m_rect.bottom+m_rect.top)/2;
			break;
		case 2:
			
			m_frameRect=m_rect;
			m_frameRect.bottom = (m_rect.bottom+m_rect.top)/2;
			
			m_rulerRect=m_rect;
			m_rulerRect.top = (m_rect.bottom+m_rect.top)/2;
			break;
		case 3:
			break;
		case 4:
		case 5:
			m_frameRect=m_rect;
			m_rulerRect=m_rect;
			break;
		}
	}
	else if(m_Orientation==1)//0:Horizontal,1:Vertical
	{
		m_rect.top = m_rect.top+20;
		m_rect.bottom = m_rect.bottom-20;
		switch(m_rulerStyle)//0不显示,1左/上,2右/下,3左右/上下,4,中/左,5,中/右
		{
		case 0:
			m_frameRect=m_rect;
			break;

		case 1:
			m_rulerRect=m_rect;
			m_rulerRect.right = (m_rect.left+m_rect.right)/2;
			
			m_frameRect=m_rect;
			m_frameRect.left = (m_rect.left+m_rect.right)/2;
			break;

		case 2:
			m_frameRect=m_rect;
			m_frameRect.right = (m_rect.left+m_rect.right)/2;

			m_rulerRect=m_rect;
			m_rulerRect.left = (m_rect.left+m_rect.right)/2;
			break;

		case 3:
			break;
		case 4:
		case 5:
			m_rulerRect=m_rect;
			m_frameRect=m_rect;
			break;
		}
	}
}

void CDrawLinearGauge::GetRect(RECT *rc)
{ 
	rc = &m_rect; 
}

void CDrawLinearGauge::Draw(HDC hdc)
{
	DrawFrame(hdc);
	DrawValueFrame(hdc);
	DrawRuler(hdc);
}

void CDrawLinearGauge::SetFrame(COLORREF frameColor,COLORREF bkColor)
{
	m_frameColor = frameColor;
	m_bkColor = bkColor;
}

void CDrawLinearGauge::DrawFrame(HDC hdc)
{
	RECT rect = m_frameRect;
	HPEN hPen = CreatePen(PS_SOLID,1,m_frameColor);
	HBRUSH hBrush = CreateSolidBrush(m_bkColor);
	SelectObject(hdc,hBrush);
	SelectObject(hdc,hPen);
	Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);
	DrawEdge(hdc, &rect,EDGE_RAISED,BF_RECT);
	DeleteObject (hBrush);
	DeleteObject (SelectObject (hdc, GetStockObject (BLACK_PEN))) ;
}

void CDrawLinearGauge::SetRuler(long iMax,long iMin,long imajortics,long iminortics,COLORREF majorticsColor,COLORREF minorticsColor,COLORREF rulerFontColor)
{
	m_iMax=iMax;
	m_iMin=iMin;
	m_imajortics=imajortics;
	m_iminortics=iminortics;
	m_majorticsColor=majorticsColor;
	m_minorticsColor=minorticsColor;
	m_rulerFontColor=rulerFontColor;
}

void CDrawLinearGauge::DrawRuler(HDC hdc)
{
	HPEN hPen;
	CString strimajorscale;
	int i=0;
	int y1=0;
	int y2=0;
	int n=0;
	int x1=0;
	int x2=0;
	
	CRect rect = m_rulerRect;

	if(m_iMax<=0) return;
	if(m_imajortics<=0) return;

	if(m_Orientation==0)//0:Horizontal,1:Vertical
	{
		n = m_imajortics * m_iminortics;
		y1 = rect.top + 1;
		y2 = rect.bottom - 2;
		int iTemp=0;
		int imajorscale = m_iMax / m_imajortics;

		for (i = 0; i <= n; i++)
		{
			int x = rect.left + i * rect.Width() / n;
			
			if ((i % m_iminortics) == 0)
			{
				hPen = CreatePen(PS_SOLID,1,m_majorticsColor);
				SelectObject(hdc,hPen);
				
				SetBkMode(hdc,TRANSPARENT);
				SetTextColor(hdc,m_rulerFontColor);
				strimajorscale.Format(_T("%d"),imajorscale*iTemp); 
				//DrawText(hdc,strimajorscale,strimajorscale.GetLength(),CRect(x, y1,x+20,y1+20), DT_LEFT | DT_SINGLELINE | DT_VCENTER);
				DrawText(hdc,strimajorscale,strimajorscale.GetLength(),CRect(x, y1,x+20,y2), DT_LEFT | DT_SINGLELINE | DT_VCENTER);
				//TextOut(*m_pDC,x, y1,strimajorscale,strimajorscale.GetLength());
				iTemp++;

				MoveToEx(hdc,x, y1,NULL);
				LineTo(hdc,x, y2);
			}
			else
			{
				//hPen = CreatePen(PS_SOLID,1,m_iminortics);
				//SelectObject(hdc,hPen);
			}
		}
	}
	else if(m_Orientation==1)
	{
		n = m_imajortics * m_iminortics;
		x1 = rect.left + 1;
		x2 = rect.right - 2;	
		int imajorscale = (m_iMax - m_iMin) / m_imajortics;
		int iTemp=m_iMin/imajorscale;
		for (i = 0; i <= n; i++)
		{
			int y = rect.bottom - i * rect.Height() / n;
			
			if ((i % m_iminortics) == 0)
			{
				hPen = CreatePen(PS_SOLID,1,m_majorticsColor);
				SelectObject(hdc,hPen);
				
				SetBkMode(hdc,TRANSPARENT);
				SetTextColor(hdc,m_rulerFontColor);
				strimajorscale.Format(_T("%d"),imajorscale*iTemp);
				DrawText(hdc,strimajorscale,strimajorscale.GetLength(),CRect(x1, y,x2,y+20), DT_LEFT | DT_SINGLELINE | DT_VCENTER);
				iTemp++;

				MoveToEx(hdc,x1, y,NULL);
				LineTo(hdc,x2, y);
			}
			else
			{
				//hPen = CreatePen(PS_SOLID,1,m_iminortics);
				//SelectObject(hdc,hPen);
			}
		}
	}
}

void CDrawLinearGauge::SetValueCount(int iCount)
{
	if(iCount < 0 ) return;
	m_ArraryValue.SetSize(iCount);
}

int CDrawLinearGauge::GetValueCount()
{
	return m_ArraryValue.GetSize();
}

void CDrawLinearGauge::SetValueFrame(int index,COLORREF valueframeColor,COLORREF valuebkColor,double value)
{
	m_valueframeColor = valueframeColor;
	m_valuebkColor = valuebkColor;
	m_ArraryValue[index]=value;
}

double CDrawLinearGauge::GetValue(int index)
{
	return m_ArraryValue[index];
}

/*void CDrawLinearGauge::SetValueFrame(COLORREF valueframeColor,COLORREF valuebkColor,long value)
{
	m_valueframeColor = valueframeColor;
	m_valuebkColor = valuebkColor;
	m_value = value;
}*/

void CDrawLinearGauge::DrawValueFrame(HDC hdc)
{
	CRect rect = m_frameRect;
	RECT rc= m_frameRect;
	
	
	if(m_Style == 1)//1标尺
	{
		/*if(m_Orientation == 0)//0:Horizontal
		{	
			int x = rect.left + (m_value) * rect.Width() / (m_iMax-m_iMin);

			HPEN hPen = CreatePen(PS_SOLID,1,m_valueframeColor);
			HBRUSH hBrush = CreateSolidBrush(m_valuebkColor);
			SelectObject(hdc,hPen);
			Rectangle(hdc, rect.left, rect.top, x, rect.bottom );
			
			SetBkMode(hdc,TRANSPARENT);
			SetTextColor(hdc,RGB(0,0,0));
			//DrawText(*m_pDC,strValue,strValue.GetLength(),rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
			DeleteObject (hBrush);
			DeleteObject (SelectObject (hdc, GetStockObject (BLACK_PEN))) ;

		}
		else*/ if(m_Orientation == 1)//1:Vertical
		{
			for(long i=0;i<m_ArraryValue.GetSize();i++)
			{
				//m_value = m_value-m_iMin;
				m_ArraryValue[i] = m_ArraryValue[i]-m_iMin;
				if(m_ArraryValue[i]<=0)
				{
					m_ArraryValue[i]=0;
				}
	//			int y = rect.bottom  - m_value * rect.Height() / (m_iMax-m_iMin);
				int y = rect.bottom  - (int)m_ArraryValue[i] * rect.Height() / (m_iMax-m_iMin);
				if(m_ArraryValue.GetSize()==1)
				{
					HPEN hPen = CreatePen(PS_SOLID,1,m_valueframeColor);
					HBRUSH hBrush = CreateSolidBrush(m_valuebkColor);
					SelectObject(hdc,hBrush);
					SelectObject(hdc,hPen);
					rc.left = rect.left;
					rc.top = y;
					rc.right = rect.right;
					rc.bottom = rect.bottom;
					//FillRect(hdc, &rc,hBrush);
					Rectangle(hdc, rect.left, y, rect.right, rect.bottom );
					//DrawIcon(hdc,rect.left,y,hIconLeft);
					//DrawIconEx(hdc, rect.left, y, hIconLeft, 20, 20, 0, NULL, DI_NORMAL);
					DeleteObject (hBrush);
					DeleteObject (SelectObject (hdc, GetStockObject (BLACK_PEN))) ;
				}
				else
				{
					rc.left = rect.left;
					rc.top = y;
					rc.right = rect.right;
					rc.bottom = rect.bottom;
					CString str;
					str.Format(_T("%d"),i);
					DrawText(hdc,str,str.GetLength(),CRect(rect.left,y,rect.left+20,y+20), DT_LEFT | DT_SINGLELINE | DT_VCENTER);
				}
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -