📄 testsvrview.cpp
字号:
// TestSvrView.cpp : implementation of the CTestSvrView class
//
#include "stdafx.h"
#include "TestSvr.h"
#include "TestSvrDoc.h"
#include "TestSvrView.h"
#include "MainFrm.h"
#include "DlgAddItem.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTestSvrView
IMPLEMENT_DYNCREATE(CTestSvrView, CListView)
BEGIN_MESSAGE_MAP(CTestSvrView, CListView)
//{{AFX_MSG_MAP(CTestSvrView)
ON_UPDATE_COMMAND_UI(ID_Menu_AddItem, OnUpdateMenuAddItem)
ON_COMMAND(ID_Menu_AddItem, OnMenuAddItem)
ON_UPDATE_COMMAND_UI(ID_Menu_DelItem, OnUpdateMenuDelItem)
ON_COMMAND(ID_Menu_DelItem, OnMenuDelItem)
ON_COMMAND(ID_Menu_Register, OnMenuRegister)
ON_UPDATE_COMMAND_UI(ID_Menu_Register, OnUpdateMenuRegister)
ON_COMMAND(ID_Menu_SvrStatus, OnMenuSvrStatus)
ON_UPDATE_COMMAND_UI(ID_Menu_SvrStatus, OnUpdateMenuSvrStatus)
ON_COMMAND(ID_Menu_UnRegister, OnMenuUnRegister)
ON_UPDATE_COMMAND_UI(ID_Menu_UnRegister, OnUpdateMenuUnRegister)
ON_WM_LBUTTONDOWN()
ON_COMMAND(ID_APP_EXIT, OnAppExit)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CListView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CListView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CListView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTestSvrView construction/destruction
CTestSvrView::CTestSvrView()
{
// TODO: add construction code here
//Init
OnInitOpcServer ();
//刷新的数据指针
iRefreshIndex=0;
iCurRow=-1;
}
CTestSvrView::~CTestSvrView()
{
//Clean Memory
int iTagCounts =m_TagList.GetSize ();
for (int i =0;i<iTagCounts;i++){
delete m_TagList[i];
}
m_TagList.RemoveAll ();
//UnInit
OnUnInitOpcServer();
}
BOOL CTestSvrView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CListView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CTestSvrView drawing
void CTestSvrView::OnDraw(CDC* pDC)
{
CTestSvrDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
void CTestSvrView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
CListCtrl& m_ListCtrl=GetListCtrl ();
ModifyStyle(NULL, LVS_REPORT, 0);
m_ListCtrl.SetExtendedStyle (LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_GRIDLINES);
m_ListCtrl.InsertColumn(0, "tagname", LVCFMT_LEFT, 100);
m_ListCtrl.InsertColumn(1, "Handle", LVCFMT_LEFT, 80);
m_ListCtrl.InsertColumn(2, "Value", LVCFMT_LEFT, 120);
m_ListCtrl.InsertColumn(3, "Type", LVCFMT_LEFT, 60);
m_ListCtrl.InsertColumn(4, "Quality", LVCFMT_LEFT, 130);
m_ListCtrl.InsertColumn(5, "TimeStamp", LVCFMT_LEFT, 200);
m_ListCtrl.InsertColumn(6, "Description", LVCFMT_LEFT, 160);
CMainFrame *pMainWnd;
pMainWnd=(CMainFrame *)(AfxGetApp()->m_pMainWnd);
pMainWnd->OnMenuStart ();
//新增一些固定点
CString m_name;
VARIANT m_value;
CString m_sValue;
CString m_description;
int m_type;
int i;
for (i =1 ;i<=12;i++){
m_name.Format ("tag%d",i);
m_description=m_name+"注解";
m_type = div(i ,4).rem ;
m_sValue= "1" ;
BOOL bResult =FormatStringToVARIANT(m_type,&m_value,m_sValue);
if (bResult==TRUE)
if ( OnAddItem(m_name,m_type,m_value,m_description)==TRUE){
AddItemToListCtrl();//Add To ListCtrl
}
VariantClear (&m_value);
}
// TODO: You may populate your ListView with items by directly accessing
// its list control through a call to GetListCtrl().
}
/////////////////////////////////////////////////////////////////////////////
// CTestSvrView printing
BOOL CTestSvrView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CTestSvrView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CTestSvrView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CTestSvrView diagnostics
#ifdef _DEBUG
void CTestSvrView::AssertValid() const
{
CListView::AssertValid();
}
void CTestSvrView::Dump(CDumpContext& dc) const
{
CListView::Dump(dc);
}
CTestSvrDoc* CTestSvrView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTestSvrDoc)));
return (CTestSvrDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CTestSvrView message handlers
void CTestSvrView::OnUpdateMenuAddItem(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CTestSvrView::OnMenuAddItem()
{
// TODO: Add your command handler code here
CDlgAddItem m_DlgAddItem;
CString m_name;
VARIANT m_value;
CString m_sValue;
CString m_description;
int m_type;
if (m_DlgAddItem.DoModal ()!=IDOK) return;
m_name =m_DlgAddItem.m_TagName;
m_description=m_DlgAddItem.m_Descr;
m_type = m_DlgAddItem.m_iType;
m_sValue= m_DlgAddItem.m_Value ;
BOOL bResult =FormatStringToVARIANT(m_type,&m_value,m_sValue);
if (bResult==TRUE)
if ( OnAddItem(m_name,m_type,m_value,m_description)==TRUE){
AddItemToListCtrl();//Add To ListCtrl
}
VariantClear (&m_value);
}
void CTestSvrView::OnUpdateMenuDelItem(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CTestSvrView::OnMenuDelItem()
{
// TODO: Add your command handler code here
int iIndex;
CListCtrl& m_ListCtrl = GetListCtrl();
int iItemCounts = m_ListCtrl.GetItemCount ();
if (iItemCounts<1) {
AfxMessageBox("No Item!");
return ;
}
iIndex =iCurRow;
OnDelItem(iIndex);
RemoveItemFromListCtrl(iIndex);
}
void CTestSvrView::OnMenuSvrStatus()
{
// TODO: Add your command handler code here
//typedef enum tagOPCSERVERSTATE
//{ OPC_STATUS_RUNNING = 1,
//OPC_STATUS_FAILED = OPC_STATUS_RUNNING + 1,
//OPC_STATUS_NOCONFIG = OPC_STATUS_FAILED + 1,
//OPC_STATUS_SUSPENDED = OPC_STATUS_NOCONFIG + 1,
//OPC_STATUS_TEST = OPC_STATUS_SUSPENDED + 1
//} OPCSERVERSTATE ;
TL_AsNTService(lpOPCProgID);
TL_SetServerState( OPC_STATUS_RUNNING);
TL_SetMajorVersion(1);
TL_SetMinorVersion(2);
TL_SetBuildNumber(3);
TL_SetVendorInfo("TuoLin");
TL_SetBandWidth(50);
}
void CTestSvrView::OnUpdateMenuSvrStatus(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable (TRUE);
}
void CTestSvrView::OnUpdateMenuRegister(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CTestSvrView::OnMenuRegister()
{
// TODO: Add your command handler code here
if (OnRegister()){
AfxMessageBox("Register Ok!");
}
else {
AfxMessageBox("Register Fail!");
}
}
void CTestSvrView::OnUpdateMenuUnRegister(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable (TRUE);
}
void CTestSvrView::OnMenuUnRegister()
{
// TODO: Add your command handler code here
if (OnUnRegister()){
AfxMessageBox("Uninstall Register Ok!");
}
else {
AfxMessageBox("Uninstall Register Fail!");
}
}
void CTestSvrView::OnLButtonDown(UINT nFlags, CPoint point)
{
CListCtrl& m_ListCtrl = GetListCtrl();
iCurRow =m_ListCtrl.HitTest(point, NULL);
CListView::OnLButtonDown(nFlags, point);
}
BOOL CTestSvrView::AddItemToListCtrl()
{ //把最后加入的点放入ListCtrl中
CTagName * pTagItem;
CTime m_time;
int iTagCounts =m_TagList.GetSize ();
if (iTagCounts<=0) return FALSE;
pTagItem=(CTagName *)m_TagList.GetAt (iTagCounts-1);
CListCtrl& m_ListCtrl = GetListCtrl();
char buf[50];
LV_ITEM lvi;
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
lvi.iSubItem = 0;
lvi.iImage = 0;
strncpy (buf, pTagItem->m_sTagName, 50);
lvi.pszText = buf;
lvi.iItem = m_ListCtrl.GetItemCount() +1;
lvi.lParam = (LPARAM) lvi.iItem;//存放第几项
m_ListCtrl.InsertItem(&lvi);
//fill ListCtrl
sprintf(buf,"0x%x",pTagItem->m_hHWND);
m_ListCtrl.SetItemText (lvi.iItem -1,1,buf);
FormatVARIANTToString(pTagItem->m_vValue,buf);
m_ListCtrl.SetItemText (lvi.iItem -1 ,2,buf);
FormatTypeToString(pTagItem->m_vType, buf);
m_ListCtrl.SetItemText (lvi.iItem -1 ,3,buf);
FormatQualityToString(pTagItem->m_lQuality,buf);
m_ListCtrl.SetItemText (lvi.iItem -1 ,4,buf);
m_time= CTime(pTagItem->m_ft);
sprintf(buf,m_time.Format("%A, %B %d, %Y %H:%M:%S"));
m_ListCtrl.SetItemText(lvi.iItem -1,5,buf);
strncpy (buf, pTagItem->m_sDescr, 50);
m_ListCtrl.SetItemText (lvi.iItem -1 ,6,buf);
return TRUE;
}
BOOL CTestSvrView::RemoveItemFromListCtrl(int iIndex)
{
BOOL bResult;
CListCtrl& m_ListCtrl = GetListCtrl();
//从 0 开始
int iItemCounts = m_ListCtrl.GetItemCount ();
if ((iIndex >iItemCounts -1) || (iIndex <0))
{
AfxMessageBox("Error Range!");
bResult=FALSE;
} else {
m_ListCtrl.DeleteItem (iIndex);
bResult=TRUE;
}
return bResult;
}
BOOL CTestSvrView::UpdateArrayToListCtrl()
{
CTagName * pTagItem;
CTime m_time;
int i;
char buf[50];
int iTagCounts =m_TagList.GetSize ();
CListCtrl& m_ListCtrl = GetListCtrl();
if (iTagCounts<=0) return FALSE;
for (i= iRefreshIndex;(i<iTagCounts) &(i<iRefreshIndex +10);i++){
//取出指针
pTagItem=(CTagName *)m_TagList.GetAt (i);
//刷新值
FormatVARIANTToString(pTagItem->m_vValue,buf);
m_ListCtrl.SetItemText (i ,2,buf);
FormatQualityToString(pTagItem->m_lQuality,buf);
m_ListCtrl.SetItemText (i,4,buf);
m_time= CTime(pTagItem->m_ft);
sprintf(buf,m_time.Format("%A, %B %d, %Y %H:%M:%S"));
m_ListCtrl.SetItemText(i,5,buf);
strncpy (buf, pTagItem->m_sDescr, 50);
m_ListCtrl.SetItemText (i ,6,buf);
OnUpdateItem(pTagItem); //修改到OPC中
}
//主要用于限定一次刷新的量(10)
iRefreshIndex =i;
if (iRefreshIndex >=iTagCounts) iRefreshIndex =0;
return TRUE;
}
BOOL CTestSvrView::RandomDataToArray()
{
CTagName * pTagItem;
CTime m_time;
int i;
FILETIME ft;
SYSTEMTIME sysTime;
GetSystemTime(&sysTime);
SystemTimeToFileTime(&sysTime,&ft);
//GetSystemTimeAsFileTime(&ft);
int iTagCounts =m_TagList.GetSize ();
if (iTagCounts<=0) return FALSE;
for (i= iRefreshIndex;(i<iTagCounts) & (i<iRefreshIndex +10);i++){
//取出指针
pTagItem=(CTagName *)m_TagList.GetAt (i);
//刷新值
RandomVARIANT(&pTagItem->m_vValue);
RandomQuality(&pTagItem->m_lQuality);
pTagItem->m_ft = ft;
// strncpy (buf, pTagItem->m_sDescr, 50);
}
return TRUE;
}
void CTestSvrView::OnAppExit()
{
int iclientcounts =TL_GetClientCounts();
char buf[50];
sprintf(buf,"Client Connect counts = %d,DisConnect?",iclientcounts );
if (AfxMessageBox(buf,MB_YESNO|MB_ICONQUESTION)==IDYES){
//exit app;
AfxGetMainWnd()->PostMessage(WM_CLOSE, 0, 0);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -