📄 powerdc.cpp
字号:
//主路电压
memcpy(cData,&(cBuf[17]),4);
cData[4] = '\0';
sscanf((char *)cData,"%X",&(m_curData.m_majorPower));
//备路电压
memcpy(cData,&(cBuf[21]),4);
cData[4] = '\0';
sscanf((char *)cData,"%X",&(m_curData.m_minorPower));
//主路电流
memcpy(cData,&(cBuf[25]),4);
cData[4] = '\0';
sscanf((char *)cData,"%X",&(m_curData.m_majorCarrent));
//备路电流
memcpy(cData,&(cBuf[29]),4);
cData[4] = '\0';
sscanf((char *)cData,"%X",&(m_curData.m_minorCarrent));
m_curData.m_time = CTime::GetCurrentTime();
//送出告警信息
m_Power1.SetValue((float)m_curData.m_majorPower /1000);
m_Power2.SetValue((float)m_curData.m_minorPower /1000);
m_Power3.SetValue((float)m_curData.m_majorCarrent /100);
m_Power4.SetValue((float)m_curData.m_minorCarrent /100);
memset(m_curData.m_sub,0,sizeof(m_curData.m_sub));
if (m_curData.m_subAlarm == 0)
{
memset(m_subStatus,0,sizeof(m_subStatus));
}else
{
m_curData.m_sub[m_curData.m_subAlarm-1] = 1;
m_subStatus[m_curData.m_subAlarm - 1] = 1;
}
CWnd * m_wndSub = GetDlgItem(IDC_STASUB);
CRect rect;
m_wndSub->GetWindowRect(&rect);
ScreenToClient(&rect);
this->InvalidateRect(&rect,0);
SetDeviceStatus(m_curData);
//UpdateList(m_curData);
return 0;
}
CString CPowerDC::ToHexString(char * cBuf, int iLen)
{
CString sResult,strTemp;
BYTE bt;
sResult.Empty();
if (iLen > 0)
{
for(int i=0;i<iLen;i++)
{
bt = *cBuf++;
strTemp.Format("%0.2X ",bt);
sResult += strTemp;
}
}
return sResult;
}
// 绘制支路状态图
void CPowerDC::DrawSubstatus(int iSub)
{
const int CST_LINEWIDTH = 1; //边框线的宽度
bool blResult;
CWnd* m_wndSub = GetDlgItem(IDC_STASUB);
CPaintDC dc(m_wndSub);
//设置背景
CRect rect,lpRect;
ASSERT(dc != NULL);
//绘制显示背景
COLORREF clBackGD = RGB(120,0,0);
COLORREF clRed = RGB(255,50,50);
COLORREF clRedFrame = RGB(200,0,0);
CPen *pen = new CPen(PS_SOLID,CST_LINEWIDTH,clRedFrame);
CBrush *brush = new CBrush(clBackGD);
//dc.SetBkColor(clBackGD);
//dc.SetBkMode(OPAQUE);
m_wndSub->GetWindowRect(&rect);
ScreenToClient(rect);
lpRect = CRect(0,0,rect.Width(),rect.Height());
CBitmap memBitmap;
CBitmap *bmOld;
CBitmap *bmAct = new CBitmap();
CBitmap *bmNomal = new CBitmap();
CBitmap *bmMsk = new CBitmap();
CBitmap *bmGray = new CBitmap();
bmAct->LoadBitmap(IDB_BMPRED);
bmMsk->LoadBitmap(IDB_BMPMASK);
bmNomal->LoadBitmap(IDB_BMPGREEN);
bmGray->LoadBitmap(IDB_BMPGRAY);
CDC *dcMem = new CDC();
CDC *dcmTmp = new CDC();
blResult = dcmTmp->CreateCompatibleDC(&dc);
blResult = dcMem->CreateCompatibleDC(&dc);
/*
int m_width = dc.GetDeviceCaps(HORZRES);
int m_height = dc.GetDeviceCaps(VERTRES);
*/
int m_width = lpRect.right;
int m_height = lpRect.bottom;
memBitmap.CreateCompatibleBitmap(&dc,m_width,m_height);
bmOld = dcMem->SelectObject(&memBitmap);
CPen *penOld = dcMem->SelectObject(pen);
dcMem->Rectangle(lpRect);
dcMem->SelectObject(penOld);
int iCol = 0,iRow = 0;
for (int i = 0; i < CST_SUBCOUNT;i++)
{
iCol = i % 24;
iRow = i / 24;
lpRect = CRect(12 + iCol * 22 ,iRow * 40 + 20 ,16,16);
if (m_subStatus[i] == 1)
bmOld = dcmTmp->SelectObject(bmAct);
else
bmOld = dcmTmp->SelectObject(bmNomal);
dcMem->MaskBlt(lpRect.left ,lpRect.top,lpRect.right,lpRect.bottom,dcmTmp,0,0,*bmMsk,0,0,MAKEROP4(SRCCOPY,SRCAND));
dcmTmp->SelectObject(bmOld);
}
dcmTmp->DeleteDC();
CFont ftTitle;
CFont *fntOld;
CString strVal;
ftTitle.CreateFont(12,0,0,0,FW_NORMAL,0,0,0,GB2312_CHARSET,
OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,
VARIABLE_PITCH|FF_SWISS,_T("宋体"));
dcMem->SetTextColor(clRed);
//memBitmap.DeleteObject();
fntOld = dcMem->SelectObject(&ftTitle);
for (int i = 0; i < CST_SUBCOUNT;i++)
{
iCol = i % 24;
iRow = i / 24;
strVal.Format("%d",i + 1);
lpRect = CRect(10 + iCol * 22 ,(iRow+1) * 40 ,8 + (iCol+1) * 22,(iRow+2) * 40);
dcMem->DrawText(strVal,lpRect,DT_CENTER);
}
ftTitle.DeleteObject();
dcMem->SelectObject(fntOld);
ftTitle.DeleteObject();
dc.BitBlt(0,0,m_width,m_height,dcMem,0,0,SRCCOPY);
dcMem->DeleteDC();
}
void CPowerDC::OnPaint()
{
CPaintDC dc(this); // device context for painting
DrawSubstatus(0);
}
void CPowerDC::OnBnClickedBtnadd()
{
// TODO: 在此添加控件通知处理程序代码
CString strAddress,strTemp;
GetDlgItemText(IDC_EDTADD,strAddress);
if (strAddress.GetLength() > 0)
{
for(int i=0;i< m_lstAddress.GetCount();i++)
{
m_lstAddress.GetText(i,strTemp);
if (strTemp.Compare(strAddress) == 0)
return;
}
m_lstAddress.AddString(strAddress);
SetDlgItemText(IDC_EDTADD,_T(""));
}
}
void CPowerDC::OnBnClickedBtndelete()
{
// TODO: 在此添加控件通知处理程序代码
if (m_lstAddress.GetCurSel()>= 0)
{
int iCur = m_lstAddress.GetCurSel();
m_lstAddress.DeleteString(m_lstAddress.GetCurSel());
if (iCur > 0)
{
if (iCur >= m_lstAddress.GetCount() - 1)
m_lstAddress.SetCurSel(iCur - 1 );
else
m_lstAddress.SetCurSel(iCur);
}
}
}
void CPowerDC::OnBnClickedBtnsend()
{
// TODO: 在此添加控件通知处理程序代码
AskData();
}
void CPowerDC::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CloseMonitor();
CDialog::OnClose();
}
void CPowerDC::CloseMonitor(void)
{
DWORD dCode;
if (bAsking)
{
bAsking = FALSE;
if ( ::GetExitCodeThread(m_pThread->m_hThread,&dCode))
{
::TerminateThread(m_pThread->m_hThread,dCode);
m_pThread = NULL;
}
}
if (blOpen)
{
blOpen = m_Port.ClosePort();
}
}
void CPowerDC::UpdateList(const tyPowerDC m_curStatus)
{
CString strAddr,strBuf;
int iItem = 0;
bool blState = false;
for(int i=0;i< m_lstInfo.GetItemCount() ;i++)
{
strAddr = m_lstInfo.GetItemText(i,1);
blState = false;
if ((unsigned int)atoi(strAddr.GetBuffer()) == m_curStatus.m_Addr)
{
blState = true;
iItem = i;
}
}
if (!blState)
{
iItem = m_lstInfo.GetItemCount();
strBuf.Format("%d",iItem + 1);
if (m_curStatus.m_subAlarm >0 || m_curStatus.m_subAlarm > 0)
m_lstInfo.InsertItem(iItem,strBuf,0);
else
m_lstInfo.InsertItem(iItem,strBuf,3);
}
strBuf.Format("%d",m_curStatus.m_Addr);
m_lstInfo.SetItemText(iItem,1,strBuf.GetBuffer());
strBuf.Format("%4.1f",(float)m_curStatus.m_majorPower/1000);
m_lstInfo.SetItemText(iItem,2,strBuf.GetBuffer());
strBuf.Format("%4.1f",(float)m_curStatus.m_minorPower/1000);
m_lstInfo.SetItemText(iItem,3,strBuf.GetBuffer());
strBuf.Format("%4.1f",(float)m_curStatus.m_majorCarrent/100);
m_lstInfo.SetItemText(iItem,4,strBuf.GetBuffer());
strBuf.Format("%4.1f",(float)m_curStatus.m_minorCarrent/100);
m_lstInfo.SetItemText(iItem,5,strBuf.GetBuffer());
strBuf.Empty();
if ((m_curStatus.m_Alarm & (int)pow(2,8)) == pow(2,8))
strBuf = "主电压告警";
if ((m_curStatus.m_Alarm & (int)pow(2,7)) == pow(2,7))
strBuf += ";备电压告警";
m_lstInfo.SetItemText(iItem,6,strBuf);
strBuf.Empty();
if ((m_curStatus.m_Alarm & (int)pow(2,6)) == pow(2,6))
strBuf = "主电流告警";
if ((m_curStatus.m_Alarm & (int)pow(2,5)) == pow(2,5))
strBuf += ";备电流告警";
m_lstInfo.SetItemText(iItem,7,strBuf);
strBuf.Empty();
CString strNum;
if (m_curStatus.m_subAlarm > 0)
{
strBuf = "支路告警 ";
for(int i =0;i<CST_SUBCOUNT;i++)
{
if (m_curStatus.m_sub[i] == 1)
{
strNum.Format("%d",i+1);
strBuf += ":" ;
strBuf += strNum;
}
}
}
m_lstInfo.SetItemText(iItem,8,strBuf);
m_lstInfo.SetItemText(iItem,9,m_curStatus.m_time.Format("%Y-%m-%d %H:%M:%S"));
LVITEM lpItem;
lpItem.iItem = iItem ;
lpItem.mask = LVIF_IMAGE;
if (m_curStatus.m_subAlarm>0 || m_curStatus.m_Alarm >0 )
lpItem.iImage = 3;
else
lpItem.iImage = 0;
m_lstInfo.SetItem(&lpItem);
}
int CPowerDC::SetDeviceStatus(const tyPowerDC m_Status)
{
bool blExist = false;
int m_Array[CST_SUBCOUNT];
for(int i=0;i<m_arrayDevice.GetCount() ;i++)
{
blExist = false;
tyPowerDC m_powDC = (tyPowerDC)m_arrayDevice.GetAt(i);
if (m_powDC.m_Addr == m_Status.m_Addr)
{
m_powDC.m_Alarm = m_Status.m_Alarm;
m_powDC.m_majorCarrent = m_Status.m_majorCarrent;
m_powDC.m_majorPower = m_Status.m_majorPower;
m_powDC.m_minorCarrent = m_Status.m_minorCarrent;
m_powDC.m_minorPower = m_Status.m_minorPower;
m_powDC.m_subAlarm = m_Status.m_subAlarm;
m_powDC.m_time = m_Status.m_time;
//复制支路告警值
for(int j=0;j<CST_SUBCOUNT;j++)
{
if (m_Status.m_sub[j] == 1)
m_powDC.m_sub[j] = m_Status.m_sub[j] ;
}
m_arrayDevice.SetAt(i,m_powDC);
UpdateList(m_powDC);
blExist = true;
break;
}
}
if (!blExist)
{
m_arrayDevice.Add(m_Status);
UpdateList(m_Status);
}
return 0;
}
void CPowerDC::OnNMDblclkListalarm(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
m_lstInfo.DeleteAllItems();
*pResult = 0;
}
void CPowerDC::OnHdnItemclickListalarm(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
}
void CPowerDC::OnLvnItemchangedListalarm(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
int iPos = m_lstInfo.GetSelectionMark();
if (iPos >= 0)
{
tyPowerDC m_curData = (tyPowerDC)m_arrayDevice.GetAt(iPos);
//绘制图形
m_Power1.SetValue((float)m_curData.m_majorPower /1000);
m_Power2.SetValue((float)m_curData.m_minorPower /1000);
m_Power3.SetValue((float)m_curData.m_majorCarrent /100);
m_Power4.SetValue((float)m_curData.m_minorCarrent /100);
memcpy(m_subStatus,m_curData.m_sub,sizeof(m_curData.m_sub));
CWnd * m_wndSub = GetDlgItem(IDC_STASUB);
CRect rect;
m_wndSub->GetWindowRect(&rect);
ScreenToClient(&rect);
this->InvalidateRect(&rect,0);
}
*pResult = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -