📄 gridstatic.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 + -