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

📄 digitalctl.cpp

📁 数码管控件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		{
			if(pInfo->m_ChannelType == 4) //遥控通道
			{
				pSubMenu->InsertMenu(0,MF_SEPARATOR|MF_BYPOSITION);
/*#ifdef _CH
				pSubMenu->InsertMenu(0,MF_BYPOSITION,IDM_CONTROL,"遥       控");
#else*/
				m_Dispstr.LoadString(IDS_REMOTE_CONTROL);
				pSubMenu->InsertMenu(0,MF_BYPOSITION,IDM_CONTROL,m_Dispstr);
//#endif
			}
			else if(pInfo->m_ChannelType == 7){ //遥调通道
				pSubMenu->InsertMenu(0,MF_SEPARATOR|MF_BYPOSITION);
/*#ifdef _CH
				pSubMenu->InsertMenu(0,MF_BYPOSITION,IDM_REGULATE,"遥       调");
#else*/
				m_Dispstr.LoadString(IDS_REMOTE_ADJUSTMENT);
				pSubMenu->InsertMenu(0,MF_BYPOSITION,IDM_REGULATE,m_Dispstr);
//#endif
				pSubMenu->RemoveMenu(IDM_DAYSTAT,MF_BYCOMMAND);
				pSubMenu->RemoveMenu(IDM_HOURSTAT,MF_BYCOMMAND);
				pSubMenu->RemoveMenu(IDM_HISTORYDATA,MF_BYCOMMAND);
			}
			if(m_nSetTime == 0)
				pSubMenu->RemoveMenu(IDM_CONFIRM,MF_BYCOMMAND);
		}
		
		::TrackPopupMenu(pSubMenu->m_hMenu, 0, point.x, point.y, 0,
			this->m_hWnd, NULL);
		
		return;
	}

	if (!menu.LoadMenu(IDR_MENU1))
		return ;
	CMenu* pSubMenu = menu.GetSubMenu(0);
	if (!pSubMenu) 
		return ;
	
	::TrackPopupMenu(pSubMenu->m_hMenu, 0, point.x, point.y, 0,
		this->m_hWnd, NULL);		
}

void CDigitalCtrl::OnProperty() 
{
	this->OnShowProperties();	
}
void CDigitalCtrl::OnShowProperties()
{
	CAUUID	caGUID;
	HRESULT	hr;
	LPDISPATCH pIDispatch = GetIDispatch(TRUE);
	LCID lcid = AmbientLocaleID();

	GetPages(&caGUID);

	hr = OleCreatePropertyFrame(
			m_hWnd,
			10,
			10,
			OLESTR(""),
			1,
			(IUnknown**) &pIDispatch,
			caGUID.cElems,
			caGUID.pElems,
			lcid,
			0L,
			NULL );
	CoTaskMemFree( (void*) caGUID.pElems );
}
STDMETHODIMP CDigitalCtrl::GetPages(CAUUID *pPages)
{
	GUID *pGUID;
    const unsigned CPROPPAGES = 3;
        
    pPages->cElems = 0;
    pPages->pElems = NULL;
 
    pGUID = (GUID*) CoTaskMemAlloc( CPROPPAGES * sizeof(GUID) );

    if( NULL == pGUID )
    {
        return ResultFromScode(E_OUTOFMEMORY);
    }

    // Fill the array of property pages now
    pGUID[0] = CDigitalPropPage::guid;


    //Fill the structure and return
    pPages->cElems = CPROPPAGES;
    pPages->pElems = pGUID;
    return NOERROR;

}

void CDigitalCtrl::OnNBitChanged() 
{
	InvalidateControl();
	SetModifiedFlag();
}


void CDigitalCtrl::OnChannel() 
{
/*#ifdef _CH
	FireChannelReq(m_id,"请设置浮点值类型的通道");"Please setup channel of float data type"
#else*/
	m_Dispstr.LoadString(IDS_MESSAGE1);
	FireChannelReq(m_id,m_Dispstr);
//#endif
}

void CDigitalCtrl::OnRegulate() 
{
	if(m_mapChannelInfo.GetCount() == 1){
		POSITION pos;
		CChannelInfo* pInfo;
		CString ChannelName;
		pos = m_mapChannelInfo.GetStartPosition();
		while (pos != NULL){ //only repeat once
			m_mapChannelInfo.GetNextAssoc(pos,ChannelName,(CObject*&)pInfo );
		}
		BYTE ChannelID = pInfo->m_ChannelID;
		FireRegulate(m_id,ChannelName);	
	}
	else
		FireRegulate(m_id,"0");
}

void CDigitalCtrl::OnControl() 
{
	if(m_mapChannelInfo.GetCount() == 1){
		POSITION pos;
		CChannelInfo* pInfo;
		CString ChannelName;
		pos = m_mapChannelInfo.GetStartPosition();
		while (pos != NULL){ //only repeat once
			m_mapChannelInfo.GetNextAssoc(pos,ChannelName,(CObject*&)pInfo );
		}
		BYTE ChannelID = pInfo->m_ChannelID;
		FireControl(m_id,ChannelName);	
	}
	else
		FireControl(m_id,"0");
	
}

void CDigitalCtrl::SetChannel(VARIANT FAR* pChannelParam) 
{
	//传入的可变类型的参数的类型应为安全数组类型
	if(pChannelParam->vt != (VT_SAFEARRAY | VT_ARRAY) )
		return;
	SAFEARRAY *pSA = pChannelParam->parray;
	//获得安全数组的数据指针
	VARIANT *pSAdata;
	SafeArrayAccessData(pSA,(void **)&pSAdata);

	//数组成员0:通道序号
	ASSERT(pSAdata[0].vt == VT_I2);
	int Number = pSAdata[0].intVal;

	//数组成员1:通道ID
	ASSERT(pSAdata[1].vt == VT_I2);
	int channelID = pSAdata[1].intVal;

	//数组成员2:通道名称
	ASSERT(pSAdata[2].vt == VT_BSTR);
	CString ChannelName(pSAdata[2].bstrVal);
	
	//数组成员3:通道所属设备
	ASSERT(pSAdata[3].vt == VT_BSTR);
	CString equipment(pSAdata[3].bstrVal);

	//数组成员4:通道数值单位
	ASSERT(pSAdata[4].vt == VT_BSTR);
	CString unit(pSAdata[4].bstrVal);

	//数组成员5:紧急高告警
	ASSERT(pSAdata[5].vt == VT_R4);
	float criHigh = pSAdata[5].fltVal;

	//数组成员6:重要高告警
	ASSERT(pSAdata[6].vt == VT_R4);
	float limHigh = pSAdata[6].fltVal;

	//数组成员7:一般高告警
	ASSERT(pSAdata[7].vt == VT_R4);
	float warnHigh = pSAdata[7].fltVal;

	//数组成员8:紧急低告警
	ASSERT(pSAdata[8].vt == VT_R4);
	float criLow = pSAdata[8].fltVal;

	//数组成员9:重要低告警
	ASSERT(pSAdata[9].vt == VT_R4);
	float limLow = pSAdata[9].fltVal;

	//数组成员10:一般低告警
	ASSERT(pSAdata[10].vt == VT_R4);
	float warnLow = pSAdata[10].fltVal ;

	//数组成员11:正常值
	ASSERT(pSAdata[11].vt == VT_R4);
	float normal = pSAdata[11].fltVal;
	
	//数组成员12:通道类型
	ASSERT(pSAdata[12].vt == VT_I2);
	short channelType = pSAdata[12].intVal;

	//数组成员13:通道显示参数1
	ASSERT(pSAdata[13].vt == VT_BSTR);
	CString DispParam1(pSAdata[13].bstrVal);
	m_Format = DispParam1;

	//数组成员14:通道显示参数2
	ASSERT(pSAdata[14].vt == VT_BSTR);
	CString DispParam2(pSAdata[14].bstrVal);

	//结束处理安全数组数据
	SafeArrayUnaccessData(pSA);
	CChannelInfo*  pChannelInfo = new CChannelInfo;
	pChannelInfo->m_ChannelID = (BYTE)channelID;
	pChannelInfo->m_Equipment = equipment;
	pChannelInfo->m_ChannelType = channelType;
	CString strProjectID = StrCut(ChannelName);
	pChannelInfo->m_ChannelName = ChannelName;
	m_mapChannelInfo.SetAt(strProjectID, (CObject*)pChannelInfo);

	if((pChannelInfo->m_ChannelType == 3)||
		(pChannelInfo->m_ChannelType == 4)||
		(pChannelInfo->m_ChannelType == 5)||
		(pChannelInfo->m_ChannelType == 6))
	{
/*#ifdef _CH
		CString str=ChannelName;
		str = str+"不属于模拟类型或遥调类型的通道!请重新选择通道!";"It does not belong to an analog channel or a remote adjustment channel! Please rechoose a new channel!";
		PreModalDialog();
		MessageBox(str,"警告",MB_ICONSTOP);"Warning!"
		PostModalDialog();
#else*/
		CString str=ChannelName;
		m_Dispstr.LoadString(IDS_MESSAGE2);
		str = str+m_Dispstr;
		PreModalDialog();
		m_Dispstr.LoadString(IDS_WARNING);
		MessageBox(str,m_Dispstr,MB_ICONSTOP);
		PostModalDialog();
//#endif
	}
}

void CDigitalCtrl::OnDaystat() 
{
	if(m_mapChannelInfo.GetCount() == 1){
		POSITION pos;
		CChannelInfo* pInfo;
		CString ChannelName;
		pos = m_mapChannelInfo.GetStartPosition();
		while (pos != NULL){ //only repeat once
			m_mapChannelInfo.GetNextAssoc(pos,ChannelName,(CObject*&)pInfo );
		}
		BYTE ChannelID = pInfo->m_ChannelID;
		FireChannelDayStat(m_id,ChannelName);	
	}
	else
		FireChannelDayStat(0,"0");	


}

void CDigitalCtrl::OnHourstat() 
{
	if(m_mapChannelInfo.GetCount() == 1){
		POSITION pos;
		CChannelInfo* pInfo;
		CString ChannelName;
		pos = m_mapChannelInfo.GetStartPosition();
		while (pos != NULL){ //only repeat once
			m_mapChannelInfo.GetNextAssoc(pos,ChannelName,(CObject*&)pInfo );
		}
		BYTE ChannelID = pInfo->m_ChannelID;
		FireChannelHourStat(m_id,ChannelName);
	}
	else
		FireChannelHourStat(0,"0");
}


void CDigitalCtrl::OnStatus() 
{
	if(m_mapChannelInfo.GetCount() == 1)
	{
		POSITION pos;
		CChannelInfo* pInfo;
		CString ChannelName;
		pos = m_mapChannelInfo.GetStartPosition();
		while (pos != NULL){ //only repeat once
			m_mapChannelInfo.GetNextAssoc(pos,ChannelName,(CObject*&)pInfo );
			
			CChannelInfoDlg dlg;
			//置告警状态
			switch(pInfo->m_AlarmLevel){
/*#ifdef _CH
			case 0:
				dlg.m_AlarmStat = "正常";"Normal state"
				break;
			case 1:
				dlg.m_AlarmStat = "一般告警";"Common alarm"
				break;
			case 2:
				dlg.m_AlarmStat = "重要告警"; "Important alarm"
				break;
			case 3:
				dlg.m_AlarmStat  = "紧急告警";"Urgent alarm"
				break;
			default:
				dlg.m_AlarmStat = "非法状态";"Illegal state"
#else*/
			case 0:
				m_Dispstr.LoadString(IDS_NORMAL);
				dlg.m_AlarmStat = m_Dispstr;
				break;
			case 1:
				m_Dispstr.LoadString(IDS_COMMON);
				dlg.m_AlarmStat = m_Dispstr;
				break;
			case 2:
				m_Dispstr.LoadString(IDS_IMPORTANT);
				dlg.m_AlarmStat = m_Dispstr;
				break;
			case 3:
				m_Dispstr.LoadString(IDS_URGENT);
				dlg.m_AlarmStat  = m_Dispstr;
				break;
			default:
				m_Dispstr.LoadString(IDS_ILLEGAL);
				dlg.m_AlarmStat = m_Dispstr;
//#endif
				
			}
			//置告警时间
			if(pInfo->m_AlarmTime != COleDateTime())
				dlg.m_AlarmTime = pInfo->m_AlarmTime.Format("%Y-%m-%d  %H:%M:%S");
			else
				dlg.m_AlarmTime = "";
			//
			dlg.m_ChannelID.Format("%d",pInfo->m_ChannelID);
			dlg.m_ChannelName = pInfo->m_ChannelName;
			dlg.m_ConfirmOp = pInfo->m_ConfirmOp;

			if(pInfo->m_ConfirmTime != COleDateTime())
				dlg.m_ConfirmTime = pInfo->m_ConfirmTime.Format("%Y-%m-%d  %H:%M:%S");
			else
				dlg.m_ConfirmTime = "";
			if(pInfo->m_ErrorString == "")
				dlg.m_CurrentValue.Format("%f", pInfo->m_CurrentValue);
			else
			{
				dlg.m_CurrentValue = pInfo->m_ErrorString;
				dlg.m_AlarmStat = "";
			}
			dlg.m_Equipment = pInfo->m_Equipment;
			dlg.m_ValueTime = pInfo->m_ValueTime.Format("%Y-%m-%d  %H:%M:%S ");

			if(COleDateTime()== (int)pInfo->m_ValueTime)
			{
				m_Dispstr.LoadString(IDS_INVALID);
				dlg.m_CurrentValue = m_Dispstr;
				dlg.m_AlarmStat = "";
				dlg.m_ValueTime = "";
			}

			PreModalDialog();
			dlg.DoModal();
			PostModalDialog();
		}
	}
	else {
		PreModalDialog();
/*#ifdef _CH
		AfxMessageBox("通道配置错误",MB_OK);"Channel setup error"
#else*/
		m_Dispstr.LoadString(IDS_MESSAGE3);
		AfxMessageBox(m_Dispstr,MB_OK);
//#endif
		PostModalDialog();	
	}
}
void CDigitalCtrl::OnAlarmsetting() 
{
	// TODO: Add your command handler code here
	if(m_mapChannelInfo.GetCount() == 1){
		POSITION pos;
		CChannelInfo* pInfo;
		CString ChannelName;
		pos = m_mapChannelInfo.GetStartPosition();
		while (pos != NULL){ //only repeat once
			m_mapChannelInfo.GetNextAssoc(pos,ChannelName,(CObject*&)pInfo );
		}
		BYTE ChannelID = pInfo->m_ChannelID;
		FireChannelInfo((short)m_id,ChannelName,1);	//通知视类显示通道告警信息
	}
	else
		FireChannelInfo(0,"0",1);	
}

void CDigitalCtrl::OnChannelinfo() 
{
	// TODO: Add your command handler code here
	if(m_mapChannelInfo.GetCount() == 1){
		POSITION pos;
		CChannelInfo* pInfo;
		CString ChannelName;
		pos = m_mapChannelInfo.GetStartPosition();
		while (pos != NULL){ //only repeat once
			m_mapChannelInfo.GetNextAssoc(pos,ChannelName,(CObject*&)pInfo );
		}
		BYTE ChannelID = pInfo->m_ChannelID;
		FireChannelInfo((short)m_id,ChannelName,0);	//通知视类显示通道编址信息
	}
	else
		FireChannelInfo(0,"0",0);	
}

void CDigitalCtrl::OnChannelsetting() 
{
	// TODO: Add your command handler code here
	if(m_mapChannelInfo.GetCount() == 1){
		POSITION pos;
		CChannelInfo* pInfo;
		CString ChannelName;
		pos = m_mapChannelInfo.GetStartPosition();
		while (pos != NULL){ //only repeat once
			m_mapChannelInfo.GetNextAssoc(pos,ChannelName,(CObject*&)pInfo );
		}
		BYTE ChannelID = pInfo->m_ChannelID;
		FireChannelInfo((short)m_id,ChannelName,2);	//通知视类显示通道参数
	}
	else
		FireChannelInfo(0,"0",2);	
}

void CDigitalCtrl::HaveLink(BOOL haveLink) 
{
	// TODO: Add your dispatch handler code here
	m_HaveLink = haveLink;
}

void CDigitalCtrl::OnMouseMove(UINT nFlags, CPoint point) 
{
//	if(m_HaveLink && !m_bEditMode){
//		::SetCursor(AfxGetApp()->LoadCursor(IDC_HAND));	
//	}
	if(!m_bEditMode && m_mapChannelInfo.GetCount())
	{
		::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR1));	
	}
	COleControl::OnMouseMove(nFlags, point);
}

void CDigitalCtrl::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if(m_bEditMode)
		return;
	FireDBClick(m_id);
	COleControl::OnLButtonUp(nFlags, point);
}

void CDigitalCtrl::OnConfirm() 
{
	// TODO: Add your command handler code here
	if(m_mapChannelInfo.GetCount() == 1){
		POSITION pos;
		CChannelInfo* pInfo;
		CString ChannelName;
		pos = m_mapChannelInfo.GetStartPosition();
		while (pos != NULL){ //only repeat once
			m_mapChannelInfo.GetNextAssoc(pos,ChannelName,(CObject*&)pInfo );
		}
		BYTE ChannelID = pInfo->m_ChannelID;
		FireConfirm((short)m_id,ChannelName);	
	}
	else
		FireConfirm(0,"0");
}

void CDigitalCtrl::SetError(DATE Time, LPCTSTR Channel, short Value, LPCTSTR strError) 
{
	CChannelInfo* pInfo ;
	if(m_mapChannelInfo.GetCount() == 1){

		CString temp = Channel;
		CString strtemp = StrCut(temp);
		if(m_mapChannelInfo.Lookup(strtemp,(CObject*&)pInfo))
		{			SetColor(4);
			CString str;
			str.Format("(%d)",Value);
			str = strError+str;
			pInfo->m_ErrorString = str; 
			pInfo->m_ValueTime = Time;
			SetFloat(-1000000);
		/*	if(m_nSetTime)
			{
				m_nSetTime = 3;
			}*/

			m_bError = true;
		}
	}
}

CString CDigitalCtrl::StrCut(CString &str)
{
	int index,lengh;
	index = str.ReverseFind('(');
	lengh=str.GetLength();
	CString strReturn = str.Right(lengh-index);
	str = str.Left(index);
	return strReturn;
}

void CDigitalCtrl::OnHistorydata() 
{
	// TODO: Add your command handler code here
	if(m_mapChannelInfo.GetCount() == 1){
		POSITION pos;
		CChannelInfo* pInfo;
		CString ChannelName;
		pos = m_mapChannelInfo.GetStartPosition();
		while (pos != NULL){ //only repeat once
			m_mapChannelInfo.GetNextAssoc(pos,ChannelName,(CObject*&)pInfo );
		}
		BYTE ChannelID = pInfo->m_ChannelID;
		FireChannelHistoryData(m_id,ChannelName);
	}
	else
		FireChannelHistoryData(0,"0");	
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -