📄 digitalctl.cpp
字号:
{
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 + -