📄 democlientview.cpp
字号:
// DemoClientView.cpp : implementation of the CDemoClientView class
//
#include "stdafx.h"
#include "DemoClient.h"
#include "DemoClientDoc.h"
#include "DemoClientView.h"
#include "MainFrm.h"
#include "Item.h"
#include "ConnectDlg.h"
#include "GroupAddDlg.h"
#include "ItemAddDlg.h"
#include "ItemWriteDlg.h"
#include "opcda.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define OPCSHUTDOWN_MSG WM_USER+1
#define DISPLAY_TICK 1
void CALLBACK EXPORT ShutdownProc(HANDLE hConnect)
{
CMainFrame *pWnd;
pWnd = (CMainFrame *)AfxGetMainWnd();
PostMessage(pWnd->m_pView->m_hWnd, OPCSHUTDOWN_MSG, 0, 0);
}
void CALLBACK EXPORT DataChangeProc(HANDLE hServer,
HANDLE hGroup,
HANDLE hItem,
VARIANT *pVar,
FILETIME timestamp,
DWORD quality)
{
CMainFrame *pWnd;
pWnd = (CMainFrame *)AfxGetMainWnd();
CItem *pItem;
int i;
for (i=0;i<pWnd->m_pView->ItemList.GetSize();i++)
{
pItem = (CItem *)pWnd->m_pView->ItemList.GetAt(i);
if (pItem->hItem == hItem)
{
VariantClear(&(pItem->Value));
VariantCopy (&(pItem->Value), pVar);
pItem->TimeStamp = timestamp;
pItem->Quality = quality;
return;
}
}
}
void FormatOpcQuality(int nQuality, char *buf)
{
switch (nQuality)
{
case OPC_QUALITY_UNCERTAIN:
sprintf (buf, "%s", "OPC_QUALITY_UNCERTAIN" );
break;
case OPC_QUALITY_BAD:
sprintf (buf, "%s", "OPC_QUALITY_BAD" );
break;
case OPC_QUALITY_GOOD:
sprintf (buf, "%s", "OPC_QUALITY_GOOD" );
break;
default:
sprintf (buf, "%s", "Unknow" );
break;
}
}
void FormatVariant(VARIANT *pValue, char *buf)
{
switch(pValue->vt)
{
case VT_I1:
case VT_UI1: // BYTE
sprintf (buf, "%d", pValue->bVal );
break;
case VT_I2: // SHORT
sprintf (buf, "%d", pValue->iVal );
break;
case VT_UI2: // UNSIGNED SHORT
sprintf (buf, "%d", pValue->uiVal );
break;
case VT_I4: // LONG
sprintf (buf, "%ld", pValue->lVal );
break;
case VT_UI4: // UNSIGNED LONG
sprintf (buf, "%ld", pValue->ulVal );
break;
case VT_INT: // INTEGER
sprintf (buf, "%ld", pValue->intVal );
break;
case VT_UINT: // UNSIGNED INTEGER
sprintf (buf, "%u", pValue->uintVal );
break;
case VT_R4: // FLOAT
sprintf (buf, "%5.2f", pValue->fltVal );
break;
case VT_R8: // DOUBLE
sprintf (buf, "%9.4f", pValue->dblVal );
break;
case VT_BSTR: //BSTR
sprintf (buf, "%ls", pValue->bstrVal );
break;
case VT_BOOL:
if (pValue->boolVal)
strcpy (buf, "TRUE");
else
strcpy (buf, "FALSE");
break;
default:
sprintf (buf, "unknown type:%d", pValue->vt );
break;
}
}
void FormatDataType(VARIANT *pValue, char *buf)
{
switch(pValue->vt)
{
case VT_I1:
case VT_UI1: // BYTE
sprintf (buf, "BYTE");
break;
case VT_I2: // SHORT
sprintf (buf, "Short");
break;
case VT_UI2: // UNSIGNED SHORT / WORD
sprintf (buf, "Word");
break;
case VT_I4: // LONG
sprintf (buf, "Long");
break;
case VT_UI4: // UNSIGNED LONG
sprintf (buf, "DWord");
break;
case VT_INT: // INTEGER
sprintf (buf, "Int");
break;
case VT_UINT: // UNSIGNED INTEGER
sprintf (buf, "UINT");
break;
case VT_R4: // FLOAT
sprintf (buf, "Float");
break;
case VT_R8: // DOUBLE
sprintf (buf, "Double");
break;
case VT_BSTR: //BSTR
sprintf (buf, "String");
break;
case VT_BOOL:
strcpy (buf, "BOOL");
break;
default:
sprintf (buf, "Unknow");
break;
}
}
/////////////////////////////////////////////////////////////////////////////
// CDemoClientView
IMPLEMENT_DYNCREATE(CDemoClientView, CListView)
BEGIN_MESSAGE_MAP(CDemoClientView, CListView)
//{{AFX_MSG_MAP(CDemoClientView)
ON_UPDATE_COMMAND_UI(IDM_OPC_CONNECT, OnUpdateOpcConnect)
ON_UPDATE_COMMAND_UI(IDM_OPC_DISCONNECT, OnUpdateOpcDisconnect)
ON_COMMAND(IDM_OPC_DISCONNECT, OnOpcDisconnect)
ON_COMMAND(IDM_OPC_CONNECT, OnOpcConnect)
ON_COMMAND(IDM_OPC_GROUP_ADD, OnOpcGroupAdd)
ON_COMMAND(IDM_OPC_GROUP_Remove, OnOPCGROUPRemove)
ON_COMMAND(IDM_OPC_ITEM_ADD, OnOpcItemAdd)
ON_COMMAND(IDM_OPC_ITEM_REMOVE, OnOpcItemRemove)
ON_UPDATE_COMMAND_UI(IDM_OPC_GROUP_ADD, OnUpdateOpcGroupAdd)
ON_UPDATE_COMMAND_UI(IDM_OPC_GROUP_Remove, OnUpdateOPCGROUPRemove)
ON_UPDATE_COMMAND_UI(IDM_OPC_ITEM_ADD, OnUpdateOpcItemAdd)
ON_UPDATE_COMMAND_UI(IDM_OPC_ITEM_REMOVE, OnUpdateOpcItemRemove)
ON_WM_TIMER()
ON_WM_DESTROY()
ON_WM_LBUTTONDOWN()
ON_WM_RBUTTONDOWN()
ON_COMMAND(IDM_ITEM_READ, OnItemRead)
ON_COMMAND(IDM_ITEMWRITE, OnItemWrite)
ON_COMMAND(IDM_OPC_ITEM_ACTIVE, OnOpcItemActive)
ON_UPDATE_COMMAND_UI(IDM_OPC_ITEM_ACTIVE, OnUpdateOpcItemActive)
//}}AFX_MSG_MAP
ON_MESSAGE(OPCSHUTDOWN_MSG, OnServerShutdown)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDemoClientView construction/destruction
CDemoClientView::CDemoClientView()
{
// TODO: add construction code here
m_hGroup = NULL;
m_hConnect = NULL;
m_nSelectedIndex = -1;
m_pListImageList = NULL;
m_pListImageList = new CImageList();
ASSERT(m_pListImageList);
//m_pListImageList->Create(16, 16, NULL, 1, 1);
m_pListImageList->Create(IDB_ITEM,16,1,RGB(255,255,255) );
//HICON hItemIcon = AfxGetApp()->LoadIcon(IDI_ITEM);
//m_pListImageList->Add(hItemIcon);
}
CDemoClientView::~CDemoClientView()
{
if(NULL != m_pListImageList)
{
m_pListImageList->DeleteImageList();
delete m_pListImageList;
m_pListImageList = NULL;
}
}
BOOL CDemoClientView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CListView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CDemoClientView drawing
void CDemoClientView::OnDraw(CDC* pDC)
{
CDemoClientDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
void CDemoClientView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
CMainFrame *pWnd;
pWnd = (CMainFrame *)AfxGetMainWnd();
pWnd->m_pView = this;
CListCtrl& list = GetListCtrl();
list.ModifyStyle(NULL, LVS_REPORT | LVS_SORTASCENDING ,0);
list.SetExtendedStyle(LVS_EX_FULLROWSELECT);
// if(NULL == list.GetImageList(LVSIL_SMALL))
// VERIFY(list.SetImageList(m_pListImageList, LVSIL_SMALL) == NULL);
if(NULL == list.GetImageList(TVSIL_STATE ))
VERIFY(list.SetImageList(m_pListImageList, TVSIL_STATE ) == NULL);
while( list.DeleteColumn( 0 ) );
list.InsertColumn( 0, _T("Tag"), LVCFMT_LEFT , 140, 0 );
list.InsertColumn( 1, _T("DataType"), LVCFMT_LEFT, 70, 1 );
list.InsertColumn( 2, _T("Value"), LVCFMT_LEFT, 90, 1 );
list.InsertColumn( 3, _T("Time"), LVCFMT_LEFT, 120, 1 );
list.InsertColumn( 4, _T("Quality"), LVCFMT_LEFT, 150, 1 );
::SetTimer(this->m_hWnd,DISPLAY_TICK,250,NULL);
}
/////////////////////////////////////////////////////////////////////////////
// CDemoClientView diagnostics
#ifdef _DEBUG
void CDemoClientView::AssertValid() const
{
CListView::AssertValid();
}
void CDemoClientView::Dump(CDumpContext& dc) const
{
CListView::Dump(dc);
}
CDemoClientDoc* CDemoClientView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDemoClientDoc)));
return (CDemoClientDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDemoClientView message handlers
void CDemoClientView::OnOpcDisconnect()
{
// TODO: Add your command handler code here
if (m_hConnect == NULL) return;
KOC_Disconnect(m_hConnect);
CItem *pItem;
for (int i=0;i<ItemList.GetSize();i++)
{
pItem = (CItem *)ItemList.GetAt(i);
delete pItem;
}
ItemList.RemoveAll();
GetListCtrl().DeleteAllItems();
m_hGroup = NULL;
m_hConnect = NULL;
m_nSelectedIndex = -1;
AfxMessageBox("Disconnected from OPC Server!");
}
void CDemoClientView::OnOpcConnect()
{
// TODO: Add your command handler code here
CConnectDlg dlg;
if(dlg.DoModal() != IDOK) return;
CWaitCursor wait;
HANDLE hConnect;
hConnect = KOC_Connect( dlg.m_strNodeName,
dlg.m_strServerName,
!dlg.m_bVer1,
dlg.m_bUseRegistry);
//hConnect = KOC_Connect("192.168.1.2", "DllTestSvr", TRUE, TRUE);
if (hConnect==INVALID_HANDLE_VALUE)
{
AfxMessageBox("Connect to OPC Server Failed!");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -