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

📄 powerdc.cpp

📁 MDF监控源码2
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	//主路电压
	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 + -