You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

629 lines
14 KiB
C++

//#include "stdafx.h"
#include "display.h"
#include "commport.h"
extern SIO_PARAM_DEF SioParam[];
extern int iCurDevIdx;
extern DEV_DEF DevParam[];
HWND hMainWnd;
int RealDataDispFlag;
int CurPort;
int DispType = 0;
int ListIndex = 0; // 显示序号索引起始
int ItemNumOfPage; // 页显示项目数
#ifdef _WIN32
COLORREF dwColorVal[16] = // 显示颜色定义
{
RGB(255,255,255), RGB(128,128,128),
RGB(255, 0, 0), RGB(255,255, 0),
RGB( 0,255, 0), RGB( 0,255,255),
RGB( 0, 0,255), RGB(255, 0,255),
RGB(192,192,192), RGB( 0, 0, 0),
RGB(128, 0, 0), RGB(128,128, 0),
RGB( 0,128, 0), RGB( 0,128,128),
RGB( 0, 0,128), RGB(128, 0,128)
};
void RealAiDataDisp( HDC hdc )
{
UINT xWd, yHg, lineh, tmp;
int i, j, total, idx, itemofline;
char szbuf[256];
RECT rc;
AI_DEF *aiptr;
float sp;
int pos[6];
GetClientRect( hMainWnd, &rc );
itemofline = 2;
CaculateWH( hdc, &xWd, &yHg, (char*)"行距" );
lineh = yHg + 5;
rc.top = 10;
SetTextColor( hdc, dwColorVal[BLUE] );
// 显示标题
sprintf( szbuf,"端口%02d 实时遥测数据信息", CurPort + 1 );
DrawText(hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_CENTER );
rc.top += (lineh + 5);
SetTextColor( hdc, dwColorVal[BLACK] );
// 计算显示位置
pos[0] = 0;
pos[3] = rc.right / 2;
tmp = 0;
CaculateWH( hdc, &xWd, &yHg, (char*)"序号" );
tmp += xWd;
pos[1] = pos[0] + xWd;
pos[4] = pos[3] + xWd;
CaculateWH( hdc, &xWd, &yHg, (char*)"测点名称" );
tmp += xWd;
pos[2] = pos[1] + xWd;
pos[5] = pos[4] + xWd;
CaculateWH( hdc, &xWd, &yHg, (char*)"测点原值" );
tmp += xWd;
sp = ((float)rc.right - (float)tmp*itemofline) / (itemofline*4);
pos[0] += (int)sp;
pos[1] += (int)(sp*2);
pos[2] += (int)(sp*3);
pos[3] += (int)(sp);
pos[4] += (int)(sp*2);
pos[5] += (int)(sp*3);
// 显示项目名称
for ( i = 0; i < itemofline; i++ )
{
sprintf( szbuf, (char*)"序号" );
rc.left = pos[i*3];
DrawText( hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_LEFT );
sprintf( szbuf, (char*)"测点名称" );
rc.left = pos[i*3+1];
DrawText( hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_LEFT );
sprintf( szbuf, (char*)"测点原值" );
rc.left = pos[i*3+2];
DrawText( hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_LEFT );
}
rc.top += lineh;
ItemNumOfPage = (rc.bottom - rc.top) / lineh;
if( !IsBaoHuPtr(CurPort) )
return;
// 计算总行数
total = (SioParam[CurPort].m_psBaoHu->AiNum + itemofline - 1) / itemofline;
// 调整显示的起始位置
if ( total < ItemNumOfPage )
ListIndex = 0;
if ( (ListIndex + ItemNumOfPage) > total )
ListIndex = total - ItemNumOfPage;
if ( ListIndex < 0 )
ListIndex = 0;
// 显示输出
idx = ListIndex * itemofline;
aiptr = (AI_DEF*)SioParam[CurPort].m_psBaoHu->AiPtr;
if( !aiptr )
return;
for ( i = 0; (i < ItemNumOfPage) && (idx < SioParam[CurPort].m_psBaoHu->AiNum); i++ )
{
for ( j = 0; j < itemofline; j++ )
{
if((idx + j) >= SioParam[CurPort].m_psBaoHu->AiNum)
break;
sprintf( szbuf, "%03d", idx + j + 1 );
rc.left = pos[j*3+0];
CaculateWH( hdc, &xWd, &yHg, (char*)"序号" );
rc.right = rc.left + xWd;
DrawText( hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_CENTER );
sprintf( szbuf, "遥测%03d", idx + j + 1 );
rc.left = pos[j*3+1];
CaculateWH( hdc, &xWd, &yHg, (char*)"测点名称" );
rc.right = rc.left + xWd;
DrawText( hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_CENTER );
sprintf( szbuf, "0x%04x", aiptr[idx+j].RawValue & 0xffff );
rc.left = pos[j*3+2];
CaculateWH( hdc, &xWd, &yHg, (char*)"测点原值" );
rc.right = rc.left + xWd;
DrawText( hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_CENTER );
}
idx += itemofline;
rc.top += lineh;
}
}
void RealDiDataDisp( HDC hdc )
{
UINT xWd, yHg, lineh, tmp;
int i, j, total, idx, itemofline;
char szbuf[256], stchar = 1;
RECT rc;
DI_DEF *diptr;
float sp;
int pos[6];
GetClientRect( hMainWnd, &rc );
CaculateWH( hdc, &xWd, &yHg, (char*)"行距" );
lineh = yHg + 5;
itemofline = 2;
rc.top = 10;
SetTextColor( hdc, dwColorVal[BLUE] );
// 显示标题
sprintf( szbuf,"端口%02d 实时遥信数据信息", CurPort + 1 );
DrawText(hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_CENTER );
rc.top += (lineh + 5);
SetTextColor( hdc, dwColorVal[BLACK] );
// 计算显示位置
pos[0] = 0;
pos[3] = rc.right / 2;
tmp = 0;
CaculateWH( hdc, &xWd, &yHg, (char*)"序号" );
tmp += xWd;
pos[1] = pos[0] + xWd;
pos[4] = pos[3] + xWd;
CaculateWH( hdc, &xWd, &yHg, (char*)"测点名称" );
tmp += xWd;
pos[2] = pos[1] + xWd;
pos[5] = pos[4] + xWd;
CaculateWH( hdc, &xWd, &yHg, (char*)"状态" );
tmp += xWd;
sp = ((float)rc.right - (float)tmp*itemofline) / (itemofline*4);
pos[0] += (int)sp;
pos[1] += (int)(sp*2);
pos[2] += (int)(sp*3);
pos[3] += (int)(sp);
pos[4] += (int)(sp*2);
pos[5] += (int)(sp*3);
// 显示项目名称
for ( i = 0; i < itemofline; i++ )
{
sprintf( szbuf, (char*)"序号" );
rc.left = pos[i*3+0];
DrawText( hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_LEFT );
sprintf( szbuf, (char*)"测点名称" );
rc.left = pos[i*3+1];
DrawText( hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_LEFT );
sprintf( szbuf, (char*)"状态" );
rc.left = pos[i*3+2];
DrawText( hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_LEFT );
}
rc.top += lineh;
ItemNumOfPage = (rc.bottom - rc.top) / lineh;
if( !IsBaoHuPtr(CurPort) )
return;
// 计算总行数
total = (SioParam[CurPort].m_psBaoHu->DiNum + itemofline - 1) / itemofline;
// 调整显示的起始位置
if ( total < ItemNumOfPage )
ListIndex = 0;
if ( (ListIndex + ItemNumOfPage) > total )
ListIndex = total - ItemNumOfPage;
if ( ListIndex < 0 )
ListIndex = 0;
// 显示输出
idx = ListIndex * itemofline;
diptr = (DI_DEF*)SioParam[CurPort].m_psBaoHu->DiPtr;
if( !diptr )
return;
for ( i = 0; (i < ItemNumOfPage) && (idx < SioParam[CurPort].m_psBaoHu->DiNum); i++ )
{
for ( j = 0; j < itemofline; j++ )
{
if((idx + j) >= SioParam[CurPort].m_psBaoHu->DiNum)
break;
sprintf( szbuf, "%03d", idx + j + 1 );
rc.left = pos[j*3+0];
CaculateWH( hdc, &xWd, &yHg, (char*)"序号" );
rc.right = rc.left + xWd;
DrawText( hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_CENTER );
sprintf( szbuf, "遥信%03d", idx + j + 1 );
rc.left = pos[j*3+1];
CaculateWH( hdc, &xWd, &yHg, (char*)"测点名称" );
rc.right = rc.left + xWd;
DrawText( hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_CENTER );
sprintf( szbuf, "%s", diptr[idx+j].Status ? (char*)"" : (char*)"" );
rc.left = pos[j*3+2];
CaculateWH( hdc, &xWd, &yHg, (char*)"状态" );
rc.right = rc.left + xWd;
DrawText( hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_CENTER );
}
idx += itemofline;
rc.top += lineh;
}
}
void RealPiDataDisp( HDC hdc )
{
UINT xWd, yHg, lineh, tmp;
int i, j, total, idx, itemofline;
char szbuf[256];
RECT rc;
PI_DEF *piptr;
float sp;
int pos[6];
GetClientRect( hMainWnd, &rc );
itemofline = 2;
CaculateWH( hdc, &xWd, &yHg, (char*)"行距" );
lineh = yHg + 5;
rc.top = 10;
SetTextColor( hdc, dwColorVal[BLUE] );
// 显示标题
sprintf( szbuf,"端口%02d 实时电度数据信息", CurPort + 1 );
DrawText(hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_CENTER );
rc.top += (lineh + 5);
SetTextColor( hdc, dwColorVal[BLACK] );
// 计算显示位置
pos[0] = 0;
pos[3] = rc.right / 2;
tmp = 0;
CaculateWH( hdc, &xWd, &yHg, (char*)"序号" );
tmp += xWd;
pos[1] = pos[0] + xWd;
pos[4] = pos[3] + xWd;
CaculateWH( hdc, &xWd, &yHg, (char*)"测点名称" );
tmp += xWd;
pos[2] = pos[1] + xWd;
pos[5] = pos[4] + xWd;
CaculateWH( hdc, &xWd, &yHg, (char*)"测点原值" );
tmp += xWd;
sp = ((float)rc.right - (float)tmp*itemofline) / (itemofline*4);
pos[0] += (int)sp;
pos[1] += (int)(sp*2);
pos[2] += (int)(sp*3);
pos[3] += (int)(sp);
pos[4] += (int)(sp*2);
pos[5] += (int)(sp*3);
// 显示项目名称
for ( i = 0; i < itemofline; i++ )
{
sprintf( szbuf, (char*)"序号" );
rc.left = pos[i*3+0];
DrawText( hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_LEFT );
sprintf( szbuf, (char*)"测点名称" );
rc.left = pos[i*3+1];
DrawText( hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_LEFT );
sprintf( szbuf, (char*)"测点原值" );
rc.left = pos[i*3+2];
DrawText( hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_LEFT );
}
rc.top += lineh;
ItemNumOfPage = (rc.bottom - rc.top) / lineh;
if( !IsBaoHuPtr(CurPort) )
return;
// 计算总行数
total = (SioParam[CurPort].m_psBaoHu->PiNum + itemofline - 1) / itemofline;
// 调整显示的起始位置
if ( total < ItemNumOfPage )
ListIndex = 0;
if ( (ListIndex + ItemNumOfPage) > total )
ListIndex = total - ItemNumOfPage;
if ( ListIndex < 0 )
ListIndex = 0;
// 显示输出
idx = ListIndex * itemofline;
piptr = (PI_DEF*)SioParam[CurPort].m_psBaoHu->PiPtr;
if( !piptr )
return;
for ( i = 0; (i < ItemNumOfPage) && (idx < SioParam[CurPort].m_psBaoHu->PiNum); i++ )
{
for ( j = 0; j < itemofline; j++ )
{
if((idx + j) >= SioParam[CurPort].m_psBaoHu->PiNum)
break;
sprintf( szbuf, "%03d", idx + j + 1 );
rc.left = pos[j*3+0];
CaculateWH( hdc, &xWd, &yHg, (char*)"序号" );
rc.right = rc.left + xWd;
DrawText( hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_CENTER );
sprintf( szbuf, "电度%03d", idx + j + 1);
rc.left = pos[j*3+1];
CaculateWH( hdc, &xWd, &yHg, (char*)"测点名称" );
rc.right = rc.left + xWd;
DrawText( hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_CENTER );
sprintf( szbuf, "0x%08x", piptr[idx+j].RawValue );
rc.left = pos[j*3+2];
CaculateWH( hdc, &xWd, &yHg, (char*)"测点原值" );
// wen 2004.11.19 显示的长度是名称的1.5倍
//rc.right = rc.left + xWd;
//DrawText( hdc, szbuf, strlen(szbuf), &rc, DT_CENTER );
rc.right = rc.left + xWd/4*6;
DrawText( hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_LEFT );
}
idx += itemofline;
rc.top += lineh;
}
}
void WatchDataDisp( HDC hdc )
{
UINT xWd, yHg, lineh;
int i, j, total, idx, type;
char szbuf[256];
RECT rc;
GetClientRect( hMainWnd, &rc );
CaculateWH( hdc, &xWd, &yHg, (char*)"行距" );
lineh = yHg + 5;
rc.top = 10;
if ( DevParam[iCurDevIdx].WatchDispLine.LineCnt == 0 )
{
sprintf( szbuf, "当前没有数据....." );
DrawText(hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_LEFT );
return;
}
ItemNumOfPage = (rc.bottom - rc.top) / lineh;
total = DevParam[iCurDevIdx].WatchDispLine.LineCnt;
if ( RealDataDispFlag )
ListIndex = 100000;
// 调整显示的起始位置
if ( total < ItemNumOfPage )
ListIndex = 0;
if ( (ListIndex + ItemNumOfPage) > total )
ListIndex = total - ItemNumOfPage;
if ( ListIndex < 0 )
ListIndex = 0;
// 寻找数据起始位置
idx = DevParam[iCurDevIdx].WatchDispLine.Rear - total;
if ( idx < 0 )
idx += MAX_DISP_LINE;
// 显示起始位置
idx += ListIndex;
for ( i = 0; i < min(ItemNumOfPage, total); i++ )
{
j = (idx + i) % MAX_DISP_LINE;
type = DevParam[iCurDevIdx].WatchDispLine.Line[j][0];
if ( type == 'R' ) // 接收数据
SetTextColor( hdc, dwColorVal[BLUE] );
else
SetTextColor( hdc, dwColorVal[MAGENTA] );
strcpy( szbuf, (char*)&DevParam[iCurDevIdx].WatchDispLine.Line[j][1] );
DrawText( hdc, (CONST WCHAR*)szbuf, strlen(szbuf), &rc, DT_LEFT );
rc.top += lineh;
}
}
//***************************************************************
//* 新字体函数? *
//***************************************************************
HFONT NewFont( int nFSize )
{
/*
WCHAR typeface[32] = (WCHAR *)"宋体";
LOGFONT LogFont = { 0, 0, 0, 0,
400,
0,
0,
0,
DEFAULT_CHARSET,
//OUT_STROKE_PRECIS,
OUT_STRING_PRECIS,
CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,
DEFAULT_PITCH,
typeface
//"新宋体"
//"黑体"
//"隶书"
//"幼圆"
//"仿宋_GB2312"
};
LogFont.lfWidth = (LONG)((float)nFSize*.618);
LogFont.lfHeight = (LONG)nFSize;
strcpy( LogFont.lfFaceName, "Lee宋体" );
return( CreateFontIndirect( &LogFont ));*/
return NULL;
}
void DataDisp( HWND hWnd )
{
HDC hdc;
HFONT hFont;
int nFSize;
hdc = GetDC( hWnd );
if( WATCH_DATA_DISP != DispType)
nFSize = 16;
else
nFSize = 12;
hFont = (HFONT)SelectObject( hdc, NewFont( nFSize ) );
if( !IsBaoHuPtr(CurPort) )
return;
switch( DispType )
{
case AI_DATA_DISP:
if(PROV_PROTOCOL != SioParam[CurPort].m_psBaoHu->PortType)
RealAiDataDisp( hdc );
break;
case DI_DATA_DISP:
if(PROV_PROTOCOL != SioParam[CurPort].m_psBaoHu->PortType)
RealDiDataDisp( hdc );
break;
case PI_DATA_DISP:
if(PROV_PROTOCOL != SioParam[CurPort].m_psBaoHu->PortType)
RealPiDataDisp( hdc );
break;
case WATCH_DATA_DISP:
WatchDataDisp( hdc );
break;
}
DeleteObject( SelectObject(hdc, hFont) );
ReleaseDC( hWnd, hdc );
}
//***************************************************************
//* 计算字串显示宽度和高度 *
//***************************************************************
void CaculateWH( HDC hdc, UINT *xWidth, UINT *yHeight, char *szStr )
{
RECT rc;
DrawText( hdc, (CONST WCHAR*)szStr, strlen(szStr), &rc, DT_CALCRECT );
*xWidth = rc.right - rc.left;
*yHeight = rc.bottom - rc.top;
}
#endif
//****************************************************************
//* 显示数据上页? *
//****************************************************************
void PageUp( void )
{
ListIndex -= ItemNumOfPage;
if ( ListIndex < 0 )
ListIndex = 0;
}
//***************************************************************
//* 显示数据下页? *
//***************************************************************
void PageDown( void )
{
ListIndex += ItemNumOfPage;
}
//***************************************************************
//* 显示端口最后一页数据 *
//***************************************************************
void PageEnd( void )
{
ListIndex = 100000;
}
//***************************************************************
//* 显示端口最前一页数据? *
//***************************************************************
void PageHome( void )
{
ListIndex = 0;
}
void LineUp( void )
{
ListIndex--;
if ( ListIndex < 0 )
ListIndex = 0;
}
//***************************************************************
//* 显示下移一行? *
//***************************************************************
void LineDown( void )
{
ListIndex++;
}
int GetCurPort()
{
return CurPort;
}
int IsRealDataDisp()
{
return RealDataDispFlag;
}