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

📄 itemdlg.cpp

📁 opc 源码 opc 源码
💻 CPP
字号:
// ItemDlg.cpp : implementation file
//

#include "stdafx.h"
#include "VCOPCClient.h"
#include "ItemDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CItemDlg dialog


CItemDlg::CItemDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CItemDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CItemDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	m_pView = NULL;
	m_hCurItem = NULL;
}

CItemDlg::~CItemDlg()
{
	RemoveItemStr();	
}

void CItemDlg::RemoveItemStr()
{
	for( vector<CString*>::iterator iter = vItemID.begin();
	iter != vItemID.end();
	++iter)
	{
		delete *iter;
	}
	vItemID.clear();
}

void CItemDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CItemDlg)
	DDX_Control(pDX, IDC_TREE_TAG, m_tvTags);
	DDX_Control(pDX, IDC_COMBO_OPCSERVER, m_cmbOPCServer);
	DDX_Control(pDX, IDC_COMBO_GROUP, m_cmbGroup);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CItemDlg, CDialog)
	//{{AFX_MSG_MAP(CItemDlg)
	ON_CBN_SELCHANGE(IDC_COMBO_OPCSERVER, OnSelchangeComboOpcserver)
	ON_NOTIFY(TVN_ITEMEXPANDING, IDC_TREE_TAG, OnItemexpandingTreeTag)
	ON_NOTIFY(NM_DBLCLK, IDC_TREE_TAG, OnDblclkTreeTag)
	ON_BN_CLICKED(IDC_BUTTON_ADDTAG, OnButtonAddtag)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CItemDlg message handlers
void CItemDlg::PopulateGroup(CString& strServer)
{
	if ( ! strServer.IsEmpty() )
	{
		CConnection* pConn = m_pView->GetConnection(strServer);
		if ( NULL != pConn )
		{
			m_cmbGroup.ResetContent();
			
			for( vector<CGroup*>::iterator iter = pConn->m_Groups.begin();
			     iter != pConn->m_Groups.end();
				 ++iter)
			{
				m_cmbGroup.AddString((*iter)->m_Name);
			}
		}
	}
}

void CItemDlg::BrowseTags(HANDLE hServer)
{
	vector<CString> vParent;
	
	//先将浏览的位置移动到相应的位置
	if ((m_hCurItem != NULL) )
	{
		if ( !m_tvTags.GetItemText(m_tvTags.GetChildItem(m_hCurItem)).IsEmpty() )
			return;
		
		HTREEITEM TempHItem = m_hCurItem;
		do
		{
			vParent.push_back(m_tvTags.GetItemText(TempHItem));
		} while( TempHItem = m_tvTags.GetParentItem(TempHItem) );
		
		for( vector<CString>::reverse_iterator iter = vParent.rbegin();
			iter != vParent.rend();
			++iter )
		{
			ChangeBrowsePosition(hServer, OPC_BROWSE_DOWN, (*iter));
		}
	}

	//显示当前位置的分支标签
	int nCount = BrowseItems(hServer, OPC_BRANCH);
	for( int i = 0; i < nCount; ++i)
	{
		char buf[255];
		if ( GetItemName(hServer, i, buf, 255) )
		{
			HTREEITEM treeNode = m_tvTags.InsertItem(buf, m_hCurItem);

			TVITEM tvItem;
			tvItem.mask = TVIF_CHILDREN;
			tvItem.hItem = treeNode;
			tvItem.cChildren = 1;
			m_tvTags.SetItem(&tvItem);

			if (GetItemFullName(hServer, i, buf, 255))
			{
				CString* pStr = new CString(buf);
				m_tvTags.SetItemData(treeNode, DWORD(pStr));
				vItemID.push_back(pStr);
			} 			
		}
	}

	//显示当前位置的叶子标签
	nCount = BrowseItems(hServer, OPC_LEAF);
	for( i = 0; i < nCount; ++i)
	{
		char buf[255];
		if ( GetItemName(hServer, i, buf, 255) )
		{
			HTREEITEM treeNode = m_tvTags.InsertItem(buf, m_hCurItem);
			if (GetItemFullName(hServer, i, buf, 255))
			{
				CString* pStr = new CString(buf);
				m_tvTags.SetItemData(treeNode, DWORD(pStr));
				vItemID.push_back(pStr);
			} 			
		}
	}	

	//再将位置移回到初始位置
	if ( (m_hCurItem != NULL) )
	{
		for( UINT j = 0; j < vParent.size(); ++j)
		{
			ChangeBrowsePosition(hServer, OPC_BROWSE_UP, "");
		}
	}
}

void CItemDlg::ListTags()
{
	int nIndex = m_cmbOPCServer.GetCurSel();
	CString strServer;
	m_cmbOPCServer.GetLBText(nIndex, strServer);
	CConnection* pConn = m_pView->GetConnection(strServer);

	if ( NULL == pConn ) 
		return;

	nIndex = m_cmbGroup.GetCurSel();
	CGroup* pGroup = NULL;
	if ( nIndex >= 0 )
	{
		CString strGroup;
		m_cmbGroup.GetLBText(nIndex, strGroup);
		pGroup = pConn->GetGroup(strGroup);		
	}
	if ( NULL == pGroup )
	{
		MessageBox("请为此服务器至少添加一个组!");
		return;
	}

	WORD wNameSpace;
	int nCount = 0;
	if ( GetNameSpace(pConn->m_hServer, &wNameSpace) )
	{
		if ( wNameSpace == OPC_NS_HIERARCHIAL )
		{
			BrowseTags(pConn->m_hServer);
		}
		else if ( wNameSpace == OPC_NS_FLAT )
		{
			nCount = BrowseItems(pConn->m_hServer, OPC_FLAT);
			for( int i = 0; i < nCount; ++i )
			{
				char buf[255];
				HTREEITEM treeNode;
				if ( GetItemName(pConn->m_hServer, i, buf, 255) )
				{
					treeNode = m_tvTags.InsertItem(buf);
				}
				if (GetItemFullName(pConn->m_hServer, i, buf, 255))
				{
					CString* pStr = new CString(buf);
					m_tvTags.SetItemData(treeNode, DWORD(pStr));
					vItemID.push_back(pStr);
				} 
			}
		}
	}
}

BOOL CItemDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	for( vector<CConnection*>::iterator iter = m_pView->m_Connections.begin();
		 iter != m_pView->m_Connections.end(); 
		 ++iter)
	{
		m_cmbOPCServer.AddString((*iter)->m_ServerName);
	}
	m_cmbOPCServer.SetCurSel(0);

	CString strServer;
	m_cmbOPCServer.GetLBText(0, strServer);

	PopulateGroup(strServer);	
	m_cmbGroup.SetCurSel(0);

	ListTags();

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CItemDlg::OnSelchangeComboOpcserver() 
{
	int nIndex = m_cmbOPCServer.GetCurSel();
	CString strServer;
	m_cmbOPCServer.GetLBText(nIndex, strServer);

	PopulateGroup(strServer);
	m_cmbGroup.SetCurSel(0);

	m_tvTags.DeleteAllItems();
	RemoveItemStr();
	m_hCurItem = NULL;
	
	ListTags();		
}

void CItemDlg::OnItemexpandingTreeTag(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	
	m_hCurItem = pNMTreeView->itemNew.hItem;
	ListTags();
	
	*pResult = 0;
}

void CItemDlg::OnDblclkTreeTag(NMHDR* pNMHDR, LRESULT* pResult) 
{
	OnButtonAddtag(); 
	
	*pResult = 0;
}

void CItemDlg::AddTag(CString strItemID)
{
	int nIndex = m_cmbOPCServer.GetCurSel();
	CString strServer;
	m_cmbOPCServer.GetLBText(nIndex, strServer);
	CConnection* pConn = m_pView->GetConnection(strServer);
	
	if ( NULL == pConn ) 
		return;
	
	nIndex = m_cmbGroup.GetCurSel();
	CString strGroup;
	m_cmbGroup.GetLBText(nIndex, strGroup);
	CGroup* pGroup = pConn->GetGroup(strGroup);
	
	if ( NULL == pGroup )
		return;

	m_pView->AddTagtoList(pConn, pGroup, strItemID);
}

void CItemDlg::OnButtonAddtag() 
{
	HTREEITEM hSelectedItem = m_tvTags.GetSelectedItem();
	if ( m_tvTags.ItemHasChildren(hSelectedItem) )
		return;
	
	CString strItem = m_tvTags.GetItemText(hSelectedItem);
	CString strItemID = *((CString*)m_tvTags.GetItemData(hSelectedItem));
	
	AddTag(strItemID);
	
}

⌨️ 快捷键说明

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