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

📄 gridstatic.cpp

📁 RFID温度签的源码
💻 CPP
字号:
// GridStatic.cpp : 实现文件
//

#include "stdafx.h"
#include "Temperature.h"
#include "GridStatic.h"

#include "DynamicData.h"
#include "DeviceClient.h"

// CGridStatic
// #define GRID_WIDTH	30

#define COORDINATE_LEFT_WIDTH		25
#define COORDINATE_BOTTOM_HEIGHT	25

#define IGNORE_GRID_NUM				10
#define IGNORE_GRID_NUM_VERTICAL	1

IMPLEMENT_DYNAMIC(CGridStatic, CStatic)

UINT TestThread( void* pParam )
{
	CGridStatic* pStatic = (CGridStatic*)pParam;
	
	for( int i=0; i<30; i++ )
	{
		Sleep( 1000 );

		pStatic->UpdateGridData();

		if( IsWindow( pStatic->m_hWnd ) )
			pStatic->Invalidate( FALSE );
	}

	return 0;
}

CGridStatic::CGridStatic() :
	m_BKColor( RGB(0,0,0) ),
	m_GridColor( RGB(0,128,64) ),
	m_nStartPos( 0 ),
	m_nLineCount( 0 ),
	m_TemperatureLeft( -40 ),
	m_TemperatureRight( 80 ),
	m_TemperatureWidth( 20 ),
	m_DisplayMode( 0 ),
	m_TimeWidth( 1000 ),
	m_pTemperatureArray( NULL ),
	m_TemperatureCount( 0 ),
	m_StartTemperature( 0 ),
	m_Zero( 0 ),
	m_DynamicWidth( 1.0 ),
	m_pDynamicData( NULL ),
	m_WarnTemperature1( 35.0 ),
	m_WarnTemperature2( 10.0 ),
	m_LowerLimit( 25.0 ),
	m_UpperLimit( 0.0 ),
	m_Height(1)
{
	m_LineColor = RGB(0,255,0);
}

CGridStatic::~CGridStatic()
{
}


BEGIN_MESSAGE_MAP(CGridStatic, CStatic)
//	ON_WM_DRAWITEM()
	ON_WM_SIZE()
	ON_WM_PAINT()
	ON_WM_ERASEBKGND()
END_MESSAGE_MAP()


void CGridStatic::OnSize(UINT nType, int cx, int cy)
{
	CStatic::OnSize(nType, cx, cy);

	// TODO: 在此处添加消息处理程序代码
}

void CGridStatic::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	CRect rect;
	GetClientRect( &rect );

	CRect rcGrid;

	CDC		mem;
	CBitmap	memBmp;
	mem.CreateCompatibleDC( &dc );
	memBmp.CreateCompatibleBitmap( &dc, rect.Width(), rect.Height() );
	CBitmap	*pOldbmp = mem.SelectObject( &memBmp );
	mem.FillSolidRect( &rect, m_BKColor );
	mem.SetBkMode( TRANSPARENT );
	HBRUSH hOldBrush = (HBRUSH)SelectObject( mem.GetSafeHdc(), GetStockObject(NULL_BRUSH) );
	
	rcGrid.SetRect( COORDINATE_LEFT_WIDTH, 0, 
		rect.Width(), rect.Height() - COORDINATE_BOTTOM_HEIGHT );
	
	DrawCoordinate( mem.GetSafeHdc(), &rect );
	DrawGrid( mem.GetSafeHdc(), &rcGrid );

	if( m_DisplayMode == 0 )
	{
		DrawHistoryLine( mem.GetSafeHdc(), &rcGrid );
	}
	else if( m_DisplayMode == 1 )
	{
		DrawDynamicFrame( mem.GetSafeHdc(), m_pDynamicData, &rcGrid );
	}
	else
	{

	}
	
	SelectObject( mem.GetSafeHdc(), hOldBrush );

	dc.BitBlt( 
		rect.left,
		rect.top,
		rect.Width(),
		rect.Height(),
		&mem,
		rect.left,
		rect.top,
		SRCCOPY );

	mem.SelectObject( pOldbmp );
	memBmp.DeleteObject();
	mem.DeleteDC();

}

void CGridStatic::DrawGrid( HDC hDC, RECT* pRect )
{
	HBRUSH	hBrush = NULL;
	HPEN	hPenGrid = NULL;
	int		nVerticalOffSet = 0;
	int		nVal;
	if( m_DisplayMode == 0 )
	{
		nVerticalOffSet = COORDINATE_BOTTOM_HEIGHT/2;
	}

	int GridWidth = ( pRect->bottom - pRect->top ) / 6;
	do 
	{
		hBrush = CreateSolidBrush( m_BKColor );
		FillRect( hDC, pRect, hBrush );
		
		hPenGrid = ::CreatePen( PS_SOLID, 1, m_GridColor );

		HGDIOBJ hOldObj = SelectObject( hDC, hPenGrid );

		int nIndex = 0;

		// horizontal
		for( int i=pRect->bottom - pRect->top; i >0; i-=GridWidth, nIndex++ ) 
		{
			nVal = nIndex%IGNORE_GRID_NUM_VERTICAL == 0 ? COORDINATE_LEFT_WIDTH/4 : 0;
			MoveToEx( hDC, pRect->left - nVal, i, NULL );
			LineTo( hDC, pRect->right, i );
		}

		// vertical
		nIndex = 0;
		for( int i=m_nStartPos + COORDINATE_LEFT_WIDTH; 
			i < (pRect->right - pRect->left + COORDINATE_LEFT_WIDTH); 
			i+=GridWidth, nIndex++ )
		{
			nVal = nIndex%IGNORE_GRID_NUM == 0 ? nVerticalOffSet : 0;
			MoveToEx( hDC, i, pRect->bottom + nVal, NULL );
			LineTo( hDC, i, pRect->top );
		}

		SelectObject( hDC, hOldObj );

	} while(0);
	
	if( hBrush ) DeleteObject( hBrush );
	if( hPenGrid ) DeleteObject( hPenGrid );
}


BOOL CGridStatic::OnEraseBkgnd(CDC* pDC)
{
	//return CStatic::OnEraseBkgnd(pDC);
	return TRUE;
}

void CGridStatic::UpdateGridData()
{
/*	if( m_nStartPos >= GRID_WIDTH )
	{
		m_nStartPos = 0;
	}

	if( m_nStartPos <=0 )
	{
		m_nStartPos = GRID_WIDTH;
	}

	m_nStartPos--;
*/
}


void CGridStatic::SetDisplayMode(int DisplayMode )
{
	m_DisplayMode = DisplayMode;
}

void CGridStatic::SetTemperatureRange( int leftVal, int rightVal, int width )
{
	m_TemperatureLeft	= leftVal;
	m_TemperatureRight	= rightVal;
	m_TemperatureWidth	= width;
}

void CGridStatic::SetTimeRange( DWORD leftVal, DWORD rightVal )
{
	m_TimeLeft	= leftVal;
	m_TimeRight	= rightVal;
}

void CGridStatic::SetTimeWidth( DWORD dwVal )
{
	m_TimeWidth = dwVal;
}

#define TEXT_HEIGHT	20
#define TEXT_WIDTH  25

void CGridStatic::DrawCoordinate( HDC hDC, RECT* pRect )
{
	TCHAR ch[32];
	int nIndex = 0;
	RECT rect;
	rect.left = 0;
	rect.right = COORDINATE_LEFT_WIDTH - 2;
	int GridWidth = ( pRect->bottom - pRect->top - COORDINATE_BOTTOM_HEIGHT ) / 6;
	SetTextColor( hDC, RGB(255,255,0) );
	
	do 
	{
		CFont   font;   
		CFont*   pFont=NULL;   
		LOGFONT   logFont;   
		pFont = GetFont();//取当前字体   
		pFont->GetLogFont( &logFont );   
		//logFont.lfEscapement=-900;//旋转90度   
		font.CreateFontIndirect( &logFont );   
		HGDIOBJ hOld =  SelectObject( hDC, font.GetSafeHandle() );

		for( int i=0; i< pRect->bottom - pRect->top; i += GridWidth, nIndex++ )
		{
			if( nIndex%IGNORE_GRID_NUM_VERTICAL == 0 )
			{
				rect.bottom = pRect->bottom - COORDINATE_BOTTOM_HEIGHT - nIndex*GridWidth;
				rect.top	= rect.bottom - TEXT_HEIGHT;
				_stprintf( ch, _T("%d\0"), m_TemperatureLeft + nIndex*m_TemperatureWidth );
				if( m_TemperatureLeft + nIndex*m_TemperatureWidth == 0 )
				{
					m_Zero = rect.bottom;
				}
				DrawText( hDC, ch, _tcslen(ch), &rect, DT_BOTTOM | DT_RIGHT | DT_SINGLELINE );
			}
		}

		if( m_DisplayMode == 0 )
		{
			rect.bottom = pRect->bottom;
			rect.top	= rect.bottom - COORDINATE_BOTTOM_HEIGHT;

			nIndex = 0;
			for( int j=0; 
				 j < pRect->right - pRect->left - COORDINATE_LEFT_WIDTH; 
				 j += GridWidth, nIndex++ )
			{
				if( nIndex%IGNORE_GRID_NUM == 0 )
				{
					rect.left = COORDINATE_LEFT_WIDTH + nIndex*GridWidth + 5;
					rect.right = rect.left + GridWidth*IGNORE_GRID_NUM;
					//_tcscpy( ch, _T("2007/06/14 22:17") );
					//_stprintf( ch, _T("%d/%d/%d %d/%d"), m_StartTime[0] + 2000, 
					//	m_StartTime[1], m_StartTime[2], m_StartTime[3], m_StartTime[4] );
					//DrawText( hDC, ch, _tcslen(ch), &rect, DT_LEFT | DT_TOP | DT_SINGLELINE );
				}
			}
		}		

		SelectObject( hDC, hOld ); //复原 

	}while(0);
}

void CGridStatic::DrawHistoryLine( HDC hDC, RECT* pRect )
{
	HPEN hPen = NULL;
	HPEN hRedPen = NULL;
	HBRUSH hBrush = NULL; CreateSolidBrush( m_BKColor );

	do 
	{
		hPen = ::CreatePen( PS_SOLID, 1, m_LineColor );
		hRedPen = ::CreatePen( PS_SOLID, 1, RGB(255,0,0) );
		hBrush = ::CreateSolidBrush( RGB(255,255,255) );

		HGDIOBJ hOldObj = SelectObject( hDC, hRedPen );
		
		// 计算
		float Width = (float)(pRect->right - pRect->left) / m_TemperatureCount; 
		float Height = (float)(pRect->bottom - pRect->top) / (m_TemperatureRight - m_TemperatureLeft);

		m_Height = Height;
		// draw limit
		MoveToEx( hDC, pRect->left, m_Zero - (int)m_LowerLimit*Height, NULL );
		LineTo( hDC, pRect->right, m_Zero - (int)m_LowerLimit*Height );

		MoveToEx( hDC, pRect->left, m_Zero - (int)m_UpperLimit*Height, NULL );
		LineTo( hDC, pRect->right, m_Zero - (int)m_UpperLimit*Height );


		SelectObject( hDC, hPen );

		MoveToEx( hDC, pRect->left, m_Zero - (int)(m_pTemperatureArray[0]*Height), NULL );
		float CurPos = 0;
		int nXVal;

		POINT PtOld;
		PtOld.x = pRect->left;
		PtOld.y = (int)(m_pTemperatureArray[0]*Height);

		HPEN hCurrentPen = hPen;
		HPEN hDrawPen = NULL;

		for( unsigned int i=1; i< m_TemperatureCount - 1; i++ )
		{
			CurPos += Width;
			nXVal = (int)(CurPos + pRect->left);
			if( nXVal > pRect->right )	break;


			if( m_pTemperatureArray[i] > m_WarnTemperature1 || 
				m_pTemperatureArray[i] < m_WarnTemperature2 )
			{
				hDrawPen = hRedPen;
			}
			else
			{
				hDrawPen = hPen;
			}

			if( hCurrentPen != hDrawPen )
			{
				hCurrentPen = hDrawPen;
				SelectObject( hDC, hCurrentPen );
				MoveToEx( hDC, PtOld.x, PtOld.y, NULL );
			}

			PtOld.x = (int)(CurPos + pRect->left);
			PtOld.y = m_Zero - (int)(m_pTemperatureArray[i]*Height);
			LineTo( hDC, PtOld.x, PtOld.y );
		}

		RECT rcPoint;
		int nYVal;
		if( m_LowTempIndex >= 0 && m_LowTempIndex < m_TemperatureCount )
		{
			CurPos = Width*m_LowTempIndex;
			nXVal = (int)CurPos + pRect->left;
			nYVal = m_Zero - (int)(m_pTemperatureArray[m_LowTempIndex]*Height);
			rcPoint.left	= nXVal - 1;
			rcPoint.right	= nXVal + 1;
			rcPoint.top		= nYVal - 1;
			rcPoint.bottom	= nYVal + 1;
			FillRect( hDC, &rcPoint, hBrush );
		}

		if( m_HighTempIndex >= 0 && m_HighTempIndex < m_TemperatureCount )
		{
			CurPos = Width*m_HighTempIndex;
			nXVal = (int)CurPos + pRect->left;
			nYVal = m_Zero - (int)(m_pTemperatureArray[m_HighTempIndex]*Height);
			rcPoint.left	= nXVal - 1;
			rcPoint.right	= nXVal + 1;
			rcPoint.top		= nYVal - 1;
			rcPoint.bottom	= nYVal + 1;
			FillRect( hDC, &rcPoint, hBrush );
		}

		SelectObject( hDC, hOldObj );
	} while(0);

	if( hPen )	DeleteObject( hPen );
	if( hRedPen )	DeleteObject( hRedPen );
	if( hBrush )	DeleteObject( hBrush );
}


void CGridStatic::DrawDynamicFrame(HDC hDC, CDynamicData* pMainFrame, RECT* pRect )
{
	HPEN hPen = NULL;
	HPEN hRedPen = NULL;

	do 
	{
		hPen = ::CreatePen( PS_SOLID, 1, m_LineColor );
		hRedPen = ::CreatePen( PS_SOLID, 1, RGB(255,0,0) );

		HGDIOBJ hOldObj = SelectObject( hDC, hRedPen );

		if( pMainFrame->GetDynamicTemperatureCount() <= 0 )	break;
		// 计算
		float Height = (float)(pRect->bottom - pRect->top) / (m_TemperatureRight - m_TemperatureLeft);
		m_Height = Height;
		// draw limit
		MoveToEx( hDC, pRect->left, m_Zero - (int)m_LowerLimit*Height, NULL );
		LineTo( hDC, pRect->right, m_Zero - (int)m_LowerLimit*Height );

		MoveToEx( hDC, pRect->left, m_Zero - (int)m_UpperLimit*Height, NULL );
		LineTo( hDC, pRect->right, m_Zero - (int)m_UpperLimit*Height );

		SelectObject( hDC, hPen );
		float nCurTemperature;
		pMainFrame->GetDynamicTemperature( pMainFrame->GetDynamicTemperatureCount() - 1, &nCurTemperature );
		MoveToEx( hDC, pRect->right, m_Zero - (int)(nCurTemperature*Height), NULL );
		int i = 0;
		int CurPos = 0;
		int Width = 10;
		i = pMainFrame->GetDynamicTemperatureCount() - 2 ;
		int nXVal;
		while ( i >= 0  )
		{
			CurPos += Width;
			pMainFrame->GetDynamicTemperature( i, &nCurTemperature );
			nXVal = pRect->right - (int)CurPos;
			if( nXVal < pRect->left )	break;
			LineTo( hDC, pRect->right - (int)CurPos, m_Zero - (int)(nCurTemperature*Height) );
			i--;
		}
		SelectObject( hDC, hOldObj );
	} while(0);

	if( hPen )	DeleteObject( hPen );
	if( hRedPen )	DeleteObject( hRedPen );
}

⌨️ 快捷键说明

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