📄 alarmdynamicdisp.cpp
字号:
// AlarmDynamicDisp.cpp : implementation file
//
#include "stdafx.h"
#include "operat.h"
#include "AlarmDynamicDisp.h"
#include "math.h"
#include "Mmsystem.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAlarmDynamicDisp
CAlarmDynamicDisp::CAlarmDynamicDisp()
{
}
CAlarmDynamicDisp::~CAlarmDynamicDisp()
{
}
BEGIN_MESSAGE_MAP(CAlarmDynamicDisp, CWnd)
//{{AFX_MSG_MAP(CAlarmDynamicDisp)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAlarmDynamicDisp message handlers
void CAlarmDynamicDisp::InitData(CWnd *pWnd)
{
InitMsFlexGrid(pWnd);
}
void CAlarmDynamicDisp::InitMsFlexGrid(CWnd *pWnd)
{
CRect nRect,nGridRect;
pWnd->GetClientRect(&nRect);
nGridRect=nRect;
nGridRect.right=nRect.left+nRect.Width()/2;
nGridRect.bottom=65;
char sTitle[4][64]={" 名 称"," 报警时间"," 报警值"};
// m_nDynamicGrid.Create(NULL,WS_CHILD|WS_VISIBLE| WS_BORDER,nGridRect,pWnd,IDC_DYNAMICALARM_GRID,NULL,FALSE);
m_nDynamicGrid.Create(WS_CHILD|WS_VISIBLE|LVS_REPORT|WS_HSCROLL|WS_BORDER|LVS_NOCOLUMNHEADER,nGridRect,pWnd,IDC_DYNAMICALARM_GRID);
nGridRect.left=nGridRect.right+1;
nGridRect.right=nRect.right;
nGridRect.bottom=65;
m_nStaticGrid.Create(WS_CHILD|WS_VISIBLE|LVS_REPORT|WS_HSCROLL|WS_BORDER|LVS_NOCOLUMNHEADER,nGridRect,pWnd,IDC_STATICALARM_GRID);
LV_COLUMN pLvc;
pLvc.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;
pLvc.fmt=LVCFMT_CENTER;
// pLvc.cx=100;
pLvc.cchTextMax=40;
short nRange=(nGridRect.Width()-20)/13;
for(int i=0;i<3;i++)
{
switch(i)
{
case 0:
pLvc.cx=nRange*7;
break;
case 1:
pLvc.cx=nRange*4;
break;
case 2:
pLvc.cx=nRange*2;
break;
default :
break;
}
pLvc.fmt=LVCFMT_CENTER;
pLvc.iSubItem=i;
pLvc.pszText=sTitle[i];
m_nDynamicGrid.InsertColumn(i,&pLvc);
m_nStaticGrid.InsertColumn(i,&pLvc);
}
m_nDynamicGrid.DeleteAllItems();
CFont nFont;
nFont.CreatePointFont(180,"宋体");
m_nDynamicGrid.SetFont(&nFont);
m_nDynamicGrid.SetTextColor(RGB(255,0,0));
m_nDynamicGrid.ShowWindow(TRUE);
m_nStaticGrid.SetFont(&nFont);
m_nStaticGrid.SetTextColor(RGB(255,0,0));
m_nStaticGrid.ShowWindow(TRUE);
// m_nDynamicGrid.SetForeColorFixed(RGB(255,0,0));
}
void CAlarmDynamicDisp::DestoryData()
{
if (m_nDynamicGrid.GetSafeHwnd()!=NULL) m_nDynamicGrid.DestroyWindow();
if (m_nStaticGrid.GetSafeHwnd()!=NULL) m_nStaticGrid.DestroyWindow();
}
void CAlarmDynamicDisp::NewAlarm(short nNo)
{
short nAdd,nCh;
if (nNo<=0) return;
nAdd=nNo/100;nCh=nNo%100;
if ((nAdd>MAX_ADNUM)||(nCh>MAX_CHNUM)) return;
aps=aps1+nAdd*(MAX_CHNUM+1)+nCh;
code_name_tab=code_name_tab1+nAdd*(MAX_CHNUM+1)+nCh;
float nAlarmAnaval;
long nAlarmTime;
if (strstr(m_sPointCode,aps->psCode)!=NULL) //取反
{
nAlarmAnaval=-aps->anaVal;
}
else
{
nAlarmAnaval=aps->anaVal;
}
nAlarmTime=aps->alrmtime;
char sTitle[4][64];
char *sTitlePoint[4];
for(int i=0;i<4;i++) sTitlePoint[i]=&sTitle[i][0];
strcpy(sTitle[0],code_name_tab->psName);
CTime nTime=nAlarmTime;
sprintf(sTitle[1],"%2d/%2d/%2d:%2d",nTime.GetMonth(),nTime.GetDay(),nTime.GetHour(),nTime.GetMinute());
if (fabs(nAlarmAnaval)>=10.0) sprintf(sTitle[2],"%7.0f",nAlarmAnaval);
else sprintf(sTitle[2],"%7.2f",nAlarmAnaval);
InsertRows(&m_nDynamicGrid,sTitlePoint);
for (i=0;i<MAX_TOTAL;i++)
{
if (m_nDynamicRowNo[i]>0) m_nDynamicRowNo[i]++;
}
m_nDynamicRowNo[aps->AlarmNo]=1;
}
void CAlarmDynamicDisp::MaxAlarm(short nNo)
{
short nAdd,nCh;
if (nNo<=0) return;
nAdd=nNo/100;nCh=nNo%100;
if ((nAdd>MAX_ADNUM)||(nCh>MAX_CHNUM)) return;
aps=aps1+nAdd*(MAX_CHNUM+1)+nCh;
code_name_tab=code_name_tab1+nAdd*(MAX_CHNUM+1)+nCh;
float nAlarmAnaval;
long nAlarmTime;
CString nStr;
if (strstr(m_sPointCode,aps->psCode)!=NULL) //取反
{
nAlarmAnaval=-aps->anaVal;
}
else
{
nAlarmAnaval=aps->anaVal;
}
if (fabs(aps->anaVal)>=10.0) nStr.Format("%7.1f",nAlarmAnaval);
else nStr.Format("%7.2f",nAlarmAnaval);
if (m_nDynamicRowNo[aps->AlarmNo]>=1)
{
if (m_nDynamicGrid.GetItemCount()>=m_nDynamicRowNo[aps->AlarmNo])
{
m_nDynamicGrid.SetItemText(m_nDynamicRowNo[aps->AlarmNo]-1,2,nStr);
}
}
else
{
if (m_nStaticRowNo[aps->AlarmNo]>=1)
{
if (m_nStaticGrid.GetItemCount()>=m_nStaticRowNo[aps->AlarmNo])
{
m_nStaticGrid.SetItemText(m_nStaticRowNo[aps->AlarmNo]-1,2,nStr);
}
}
}
}
void CAlarmDynamicDisp::EndAlarm(short nNo)
{
if (nNo<=0) return;
short nAdd,nCh;
nAdd=nNo/100;nCh=nNo%100;
if ((nAdd>MAX_ADNUM)||(nCh>MAX_CHNUM)) return;
aps=aps1+nAdd*(MAX_CHNUM+1)+nCh;
if ((m_nDynamicRowNo[aps->AlarmNo]>=1)&&(m_nDynamicRowNo[aps->AlarmNo])<=m_nDynamicGrid.GetItemCount())
{
DeleteGrid(&m_nDynamicGrid,m_nDynamicRowNo[aps->AlarmNo]-1);
for (int i=0;i<MAX_TOTAL;i++)
{
if (m_nDynamicRowNo[i]>m_nDynamicRowNo[aps->AlarmNo]) m_nDynamicRowNo[i]--;
}
m_nDynamicRowNo[aps->AlarmNo]=0;
}
if ((m_nStaticRowNo[aps->AlarmNo]>=1)&&(m_nStaticRowNo[aps->AlarmNo])<=m_nStaticGrid.GetItemCount())
{
DeleteGrid(&m_nStaticGrid,m_nStaticRowNo[aps->AlarmNo]-1);
for (int i=0;i<MAX_TOTAL;i++)
{
if (m_nStaticRowNo[i]>m_nStaticRowNo[aps->AlarmNo]) m_nStaticRowNo[i]--;
}
m_nStaticRowNo[aps->AlarmNo]=0;
}
}
void CAlarmDynamicDisp::ConfirmAlarm()
{
if (m_nDynamicGrid.GetItemCount()<1) return;
short nRow;
POSITION pos;
pos = m_nDynamicGrid.GetFirstSelectedItemPosition();
// 得到项目索引
nRow = m_nDynamicGrid.GetNextSelectedItem(pos);
if (nRow==-1) return;
nRow+=1;
short nCodeNo=GetAlarmCodeNo(nRow);
if ((nRow>=1)&&(nCodeNo>0))
{
char sTitle[4][64];
char *sTitlePoint[4];
short adr,ch;
adr=nCodeNo/100;ch=nCodeNo%100;
if((adr<1)||(adr>(MAX_ADNUM+2))) return;
if((ch<1)||(ch>MAX_CHNUM)) return;
aps=aps1+adr*(MAX_CHNUM+1)+ch;
for(int i=0;i<4;i++) sTitlePoint[i]=&sTitle[i][0];
for(int j=0;j<3;j++)
{
strcpy(sTitle[j],(LPSTR)(LPCTSTR)m_nDynamicGrid.GetItemText(nRow-1,j));
}
DeleteGrid(&m_nDynamicGrid,nRow-1);
for (i=0;i<MAX_TOTAL;i++)
{
if (m_nDynamicRowNo[i]==nRow) //动态表格中对应的列清零
{
m_nDynamicRowNo[i]=0;
break;
}
}
for (i=0;i<MAX_TOTAL;i++)
{
if (m_nDynamicRowNo[i]>nRow) m_nDynamicRowNo[i]--;
}
//加入到静态显示的表格中
InsertRows(&m_nStaticGrid,sTitlePoint);
for (i=0;i<MAX_TOTAL;i++) if (m_nStaticRowNo[i]>0) m_nStaticRowNo[i]++;
m_nStaticRowNo[aps->AlarmNo]=1;
}
}
void CAlarmDynamicDisp::InsertRows(CListCtrl *pMsFlexGrid,char **pStr)
{
LVITEM pLitem;
pLitem.mask= LVCF_TEXT|LVCF_SUBITEM|LVIF_STATE;
pLitem.state=0;
pLitem.stateMask=0;
pLitem.iImage=0;
pLitem.iSubItem=0;
pLitem.iItem=0;
pMsFlexGrid->InsertItem(&pLitem);
for(int i=0;i<3;i++) pMsFlexGrid->SetItemText(0,i,*(pStr+i));
}
void CAlarmDynamicDisp::DeleteGrid(CListCtrl *pMsFlexGrid,short nRow)
{
pMsFlexGrid->DeleteItem(nRow);
}
BOOL CAlarmDynamicDisp::PlayResource(char* lpname)
{
BOOL brtn;
char* lpres;
HANDLE hres;
HRSRC hresinfo;
HINSTANCE nl=AfxGetInstanceHandle();
// find the wave resource */
hresinfo=FindResource(nl,lpname,"wave");
if (hresinfo==NULL) return false;
// load the wave resource. */
hres = LoadResource(nl,hresinfo);
if (hres==NULL) return false;
//lock the wave resource and play it. */
lpres=(LPSTR)LockResource(hres);
if(lpres==NULL)
return false;
brtn = sndPlaySound(lpres, SND_MEMORY|SND_ASYNC);
if(brtn == NULL) return false;
//free the wave resource and return success or failure.
FreeResource(hres);
return true;
}
short CAlarmDynamicDisp::GetAlarmCodeNo(short nRow)
{
for (int i=0;i<MAX_TOTAL;i++)
{
if (m_nDynamicRowNo[i]==nRow) break;
}
if (i<MAX_TOTAL)
{
for(int adr=1;adr<MAX_ADNUM;adr++)
{
for(int chi=1;chi<=20;chi++)
{
aps = aps1 + adr*(MAX_CHNUM+1)+chi;
if (aps->psNo<=0) continue;
if (aps->AlarmNo==i) return adr*100+chi;
}
}
}
return -1;
}
BOOL CAlarmDynamicDisp::HaveAlarm()
{
if (m_nDynamicGrid.GetItemCount()<1) return false;
else return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -