📄 contentview.cpp
字号:
default:
sValue = _T("?");
}
if( ((*item)->GetQuality() & OPC_QUALITY_MASK) != OPC_QUALITY_GOOD )
{
if( ((*item)->GetQuality() & OPC_QUALITY_MASK) == OPC_QUALITY_UNCERTAIN )
sValue += _T(" (uncertain)");
else if( ((*item)->GetQuality() & OPC_QUALITY_MASK) == OPC_QUALITY_BAD )
sValue = _T("Bad");
}
list.SetItem(index,COLUMN_VALUE,LVIF_TEXT,(LPTSTR)(LPCTSTR)sValue,0,0,0,0);
FILETIME timeStamp = (*item)->GetTimeStamp();
if( timeStamp.dwHighDateTime != 0 )
{
CTime time(timeStamp);
list.SetItem(index,COLUMN_TIME,LVIF_TEXT, time.Format(_T("%c")),0,0,0,0);
}
}
}
void CContentView::AddItem(CListCtrl& list, CItem** item, int index)
{
LV_ITEM lv_item;
lv_item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
lv_item.iSubItem = COLUMN_NAME;
lv_item.iImage = 0;
lv_item.iItem = index;
lv_item.pszText = (LPTSTR)(LPCTSTR)(*item)->GetName();
lv_item.lParam = (LPARAM)*item;
int iPos = list.InsertItem(&lv_item);
CString sValue;
/*
if the item was not in the content view after a COV it
still could have the changed attribute set. We reset it now.
It is safe to do it now and not earlier after the DeleteAllItems().
*/
if((*item)->IsChanged()) (*item)->SetChanged(FALSE);
if((*item)->GetValue().vt != (*item)->GetDataType())
TRACE(_T("item datatype inconsistency !\n"));
switch((*item)->GetValue().vt)
{
case VT_BOOL:
// COM BOOL: -1(TRUE) or 0 (FALSE)
sValue.Format( _T("%i"), -1 * (*item)->GetValue().boolVal );
break;
case VT_I2:
sValue.Format( _T("%hd"), (*item)->GetValue().iVal );
break;
case VT_I4:
sValue.Format( _T("%d"), (*item)->GetValue().lVal );
break;
case VT_R4:
sValue.Format( _T("%f"), (*item)->GetValue().fltVal );
break;
case VT_R8:
sValue.Format( _T("%g"), (*item)->GetValue().dblVal );
break;
case VT_BSTR:
sValue = (*item)->GetValue().bstrVal;
break;
default:
sValue = _T("?");
}
if( ((*item)->GetQuality() & OPC_QUALITY_MASK) != OPC_QUALITY_GOOD )
{
if( ((*item)->GetQuality() & OPC_QUALITY_MASK) == OPC_QUALITY_UNCERTAIN )
sValue += _T(" (uncertain)");
else if( ((*item)->GetQuality() & OPC_QUALITY_MASK) == OPC_QUALITY_BAD )
sValue = _T("Bad");
}
list.SetItem(iPos,COLUMN_VALUE,LVIF_TEXT,(LPTSTR)(LPCTSTR)sValue,0,0,0,0);
FILETIME timeStamp = (*item)->GetTimeStamp();
if( timeStamp.dwHighDateTime != 0 )
{
CTime time(timeStamp);
list.SetItem(iPos,COLUMN_TIME,LVIF_TEXT, time.Format(_T("%c")),0,0,0,0);
}
}
void CContentView::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
UINT flags;
int iPos = -1;
CPoint test_point = point;
CMenu menu;
CListCtrl& list = GetListCtrl();
CWnd::ScreenToClient(&test_point);
try
{
iPos = list.HitTest(test_point,&flags);
if((iPos != -1)) //popup only available if any item
{ //is selectable
//list.SelectItem(iPos);
VERIFY(menu.LoadMenu(IDR_CONTENT_POPUP));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, AfxGetMainWnd());
menu.DestroyMenu();
//popup workaround: tree.SetItemState(hTarget, 0, TVIS_DROPHILITED);
}
else
{
CListView::OnContextMenu(pWnd, point);
}
}
catch(...)
{
}
}
void CContentView::OnOpcCommanditem()
{
// TODO: Add your command handler code here
CCommandItemDlg dlg;
int iPos = -1;
int nSelectedItems;
CListCtrl& list = GetListCtrl();
CItem* pItem = NULL;
CGroup* pGroup = NULL;
int i = 0;
nSelectedItems = list.GetSelectedCount();
if(IDOK == dlg.DoModal())
{
CWaitCursor wait;
OPCHANDLE* phServer = new OPCHANDLE[nSelectedItems];
CComVariant* pItemValues = new CComVariant[nSelectedItems];
//fill in the server handles
while(i < nSelectedItems)
{
iPos = list.GetNextItem(iPos, LVNI_SELECTED);
if(iPos != -1)
{
pItem = (CItem*) list.GetItemData(iPos);
if(pItem != NULL)
{
phServer[i] = pItem->GetHandle();
CComVariant command_value(dlg.m_sCommandValue);
command_value.ChangeType(pItem->GetDataType(), NULL);
pItemValues[i] = command_value;
}
i++;
}
}
if(pItem != NULL) pGroup = pItem->GetGroup();
if(pGroup != NULL)
{
if(0 == dlg.m_iCommand) //sync
{
pGroup->CommandItemsSync(nSelectedItems, phServer, pItemValues);
}
else if(1 == dlg.m_iCommand) //async
{
pGroup->CommandItemsAsync(nSelectedItems, phServer, pItemValues);
}
}
delete[] phServer;
delete[] pItemValues;
}
}
void CContentView::OnUpdateOpcCommanditem(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CContentView::OnOpcEdititem()
{
// TODO: Add your command handler code here
int iPos = -1;
CListCtrl& list = GetListCtrl();
iPos = list.GetNextItem(-1, LVNI_FOCUSED | LVNI_SELECTED);
if(iPos != -1)
{
CItem* pItem = (CItem*) list.GetItemData(iPos);
pItem->EditItem();
OnUpdate(NULL, CONTENT_UPDATE_ONLY, NULL);
}
}
void CContentView::OnUpdateOpcEdititem(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
CListCtrl& list = GetListCtrl();
if(list.GetSelectedCount() > 1)
pCmdUI->Enable(FALSE);
else
pCmdUI->Enable(TRUE);
}
void CContentView::OnOpcReaditem()
{
// TODO: Add your command handler code here
CReadItemDlg dlg;
int iPos = -1;
int nSelectedItems;
CListCtrl& list = GetListCtrl();
CItem* pItem = NULL;
CGroup* pGroup = NULL;
int i = 0;
nSelectedItems = list.GetSelectedCount();
if(IDOK == dlg.DoModal())
{
OPCHANDLE* phServer = new OPCHANDLE[nSelectedItems];
//fill in the server handles
while(i < nSelectedItems)
{
iPos = list.GetNextItem(iPos, LVNI_SELECTED);
if(iPos != -1)
{
pItem = (CItem*) list.GetItemData(iPos);
if(pItem != NULL)
{
phServer[i] = pItem->GetHandle();
}
i++;
}
}
if(pItem != NULL) pGroup = pItem->GetGroup();
if(pGroup != NULL)
{
if(0 == dlg.m_iRead)
{
//sync
if(1 == dlg.m_iFrom)
pGroup->ReadItemsSync(OPC_DS_DEVICE, nSelectedItems, phServer);
else
pGroup->ReadItemsSync(OPC_DS_CACHE, nSelectedItems, phServer);
}
else if(1 == dlg.m_iRead)
{
//async
if(1 == dlg.m_iFrom)
pGroup->ReadItemsAsync(OPC_DS_DEVICE, nSelectedItems, phServer);
else
pGroup->ReadItemsAsync(OPC_DS_CACHE, nSelectedItems, phServer);
}
}
delete[] phServer;
OnUpdate(NULL, CONTENT_UPDATE_ONLY, NULL);
}
}
void CContentView::OnUpdateOpcReaditem(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CContentView::OnOpcRemoveitem()
{
// TODO: Add your command handler code here
int iPos = -1;
CListCtrl& list = GetListCtrl();
CArray<CItem*, CItem*> RemoveItems;
int i = 0;
int nSelectedItems = 0;
CItem* pItem = NULL;
RemoveItems.RemoveAll();
nSelectedItems = list.GetSelectedCount();
//fill in the server handles
while(i < nSelectedItems)
{
iPos = list.GetNextItem(iPos, LVNI_SELECTED);
if(iPos != -1)
{
pItem = (CItem*) list.GetItemData(iPos);
RemoveItems.Add(pItem);
}
i++;
}
CGroup* pGroup = pItem->GetGroup(); //take last item for getting the group
if(pGroup->RemoveItems(&RemoveItems))
{
OnUpdate(NULL,0,NULL);
}
}
void CContentView::OnUpdateOpcRemoveitem(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -