?? itemdlg.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 + -