additem.cpp

来自「一个opc服务器」· C++ 代码 · 共 474 行

CPP
474
字号
// AddItem.cpp : implementation file
//

#include "stdafx.h"
#include "mexOPC.h"
#include "AddItem.h"
#include "SetItems.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
LPCWSTR empty1 = {L""};
CONST ULONG NEXT = 100;
CString allitems[100]= {""};
int itemcount;
/////////////////////////////////////////////////////////////////////////////
// CAddItem dialog

CAddItem::CAddItem(OPCClientDoc* parent, IOPCServer* pServer, CWnd* pParent/*=NULL*/)
   : CDialog(CAddItem::IDD, pParent), pDoc( parent )
{
   browse.Attach( pServer );  // Get a Browse interface
   m_vt = VT_EMPTY;
   nameSpaceType = OPC_NS_HIERARCHIAL;
   itemcount =0;
   //{{AFX_DATA_INIT(AddItemDlg)
   m_accessPath = _T("");
   m_itemID = _T("");
   //}}AFX_DATA_INIT
}
HRESULT CAddItem::BrowseHere( HTREEITEM item )
{
   USES_CONVERSION;
   if( !browse.IsOk() )
      return E_FAIL;

   HRESULT hr = S_OK;
   if( item != NULL )
   {
      HTREEITEM parent = m_tree.GetParentItem( item );
      hr = BrowseHere( parent );
      if( SUCCEEDED( hr ) )
      {
         CString node( m_tree.GetItemText( item ) );
         if( node != _T("Root") )
         {
            hr = browse.ChangeBrowsePosition( OPC_BROWSE_DOWN, T2OLE(node.GetBuffer(0)) );
         }
      }
   }
   return hr;
}
void CAddItem::UpdateFlat()
{
USES_CONVERSION;
   if( !browse.IsOk() )
      return;

   CWaitCursor wait;
   // get the tags
   CString  m_filter = "*";
   m_flat.ResetContent();
   IEnumString* pEnumString = NULL;
   HRESULT hr = browse.BrowseOPCItemIDs(OPC_FLAT,
                                      T2OLE(m_filter.GetBuffer(0)),
                                      m_vt,
                                      0,  // no filtering (or OPC_READABLE|OPC_WRITEABLE)
                                      &pEnumString);
   if( SUCCEEDED(hr) )
   {
      LPWSTR pName[NEXT];
      ULONG count = 0;
      do
      {
         hr = pEnumString->Next(NEXT, &pName[0], &count);
         // CString does translation from UNICODE to native type
         // (depends on the way the application is built)
         for( ULONG index=0; index<count; index++ )
         {
            CString name( pName[index] );
            m_flat.AddString( name );
            CoTaskMemFree( pName[index] );
         }
      }
      while( hr == S_OK );
      pEnumString->Release();
   }
   m_flat.SetCurSel( 0 );
}
void CAddItem::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAddItem)
	DDX_Control(pDX, IDC_OPC_TREE, m_tree);
	DDX_Control(pDX, IDC_OPC_TAGS, m_tags);
	DDX_Control(pDX, IDC_OPC_FLAT, m_flat);
	DDX_Text(pDX, IDC_OPC_ITEMNAME, m_itemID);
	DDX_Text(pDX, IDC_ITEM_ACCESSPATH, m_accessPath);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CAddItem, CDialog)
	//{{AFX_MSG_MAP(CAddItem)
	ON_LBN_DBLCLK(IDC_OPC_TAGS, OnDblclkOpcTags)
	ON_LBN_DBLCLK(IDC_OPC_FLAT, OnDblclkOpcFlat)
	ON_BN_CLICKED(IDC_ITEM_PRO, OnItemPro)
	ON_BN_CLICKED(IDC_OPC_ADDITEM, OnOpcAdditem)
	ON_BN_CLICKED(IDC_OPC_BOOL, OnOpcBool)
	ON_BN_CLICKED(IDC_OPC_DOUBLE, OnOpcDouble)
	ON_BN_CLICKED(IDC_OPC_LONG, OnOpcLong)
	ON_BN_CLICKED(IDC_OPC_NATIVE, OnOpcNative)
	ON_BN_CLICKED(IDC_OPC_SHORT, OnOpcShort)
	ON_BN_CLICKED(IDC_OPC_STRING, OnOpcString)
	ON_NOTIFY(TVN_SELCHANGED, IDC_OPC_TREE, OnSelchangedOpcTree)
	ON_NOTIFY(TVN_ITEMEXPANDING, IDC_OPC_TREE, OnItemexpandingOpcTree)
	ON_LBN_SELCHANGE(IDC_OPC_TAGS, OnSelchangeOpcTags)
	ON_LBN_SELCHANGE(IDC_OPC_FLAT, OnSelchangeOpcFlat)
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAddItem message handlers

void CAddItem::OnDblclkOpcFlat() 
{
	// TODO: Add your control notification handler code here
	OnOpcAdditem();
}

void CAddItem::OnSelchangeOpcFlat() 
{
	// TODO: Add your control notification handler code here
	USES_CONVERSION;
   if( !browse.IsOk() )
      return;

   CWaitCursor wait;
   m_itemID.Empty();
   
   int nSel = m_flat.GetCurSel();
   if ( nSel != LB_ERR )
   {
      m_flat.GetText(nSel,m_itemID);
   }
   else
      return;

   // Ask the server for the itemID
   LPWSTR pName = NULL;
   HRESULT hr = browse.GetItemID( T2OLE(m_itemID.GetBuffer(0)), &pName );
   if( SUCCEEDED(hr) )
   {
      m_itemID = pName;
      CoTaskMemFree( pName );
   }

   UpdateData( FALSE );
}

void CAddItem::OnSelchangeOpcTags() 
{
	// TODO: Add your control notification handler code here
	USES_CONVERSION;
   if( !browse.IsOk() )
      return;

   CWaitCursor wait;
   HTREEITEM item = m_tree.GetSelectedItem( );
   HRESULT hr = BrowseHere( item );    // move browse position here

   m_itemID.Empty();
   int nSel;
   if ((nSel = m_tags.GetCurSel()) != LB_ERR)
   {
      m_tags.GetText(nSel,m_itemID);
   }
   else
      return;

   // Ask the server for the itemID
   LPWSTR pName = NULL;
   hr = browse.GetItemID( T2OLE(m_itemID.GetBuffer(0)), &pName );
   if( SUCCEEDED(hr) )
   {
      m_itemID = pName;
      CoTaskMemFree( pName );
   }

   UpdateData( FALSE );

   // return browse position to root
   hr = S_OK;
   for( int i=0; i<10 && SUCCEEDED(hr); i++ )
      hr = browse.ChangeBrowsePosition( OPC_BROWSE_UP, empty1 );
}

void CAddItem::OnDblclkOpcTags() 
{
	// TODO: Add your control notification handler code here
	OnOpcAdditem();
}

void CAddItem::OnItemexpandingOpcTree(NMHDR* pNMHDR, LRESULT* pResult) 
{
	USES_CONVERSION;
   if( !browse.IsOk() )
      return;

   CWaitCursor wait;
   NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
   HTREEITEM start = pNMTreeView->itemNew.hItem;
   DWORD expanded = m_tree.GetItemData( start );
   if( !expanded )
   {
      m_tree.SetItemData( start, 1 );  // mark this item expanded
      // remove existing children
      HTREEITEM hItem = m_tree.GetNextItem (start, TVGN_CHILD);
      while (hItem)
      {
         m_tree.DeleteItem( hItem );
         hItem = m_tree.GetNextItem(start, TVGN_CHILD);
      }
      // browse new children
      HRESULT hr = BrowseHere( start );    // move browse position here
      if( SUCCEEDED(hr) )
      {
         IEnumString* pEnumString = NULL;
         hr = browse.BrowseOPCItemIDs( OPC_BRANCH,
                                       L"*",
                                       VT_EMPTY,
                                       0,  // no filtering (or OPC_READABLE|OPC_WRITEABLE)
                                       &pEnumString);
         if( SUCCEEDED(hr) )
         {
            LPWSTR pName[NEXT];
            ULONG count = 0;
            do
            {
               hr = pEnumString->Next(NEXT, &pName[0], &count);
               // CString does translation from UNICODE to native type
               // (depends on the way the application is built)
               for( ULONG index=0; index<count; index++ )
               {
                   CString name( pName[index] );
                   HTREEITEM item = m_tree.InsertItem( name, start );
                   m_tree.SetItemData( item, 0 );
                   m_tree.InsertItem( _T("Dummy"), item );
                   CoTaskMemFree( pName[index] );
               }
            }
            while( hr == S_OK );
            pEnumString->Release();
         }
      }
      // return browse position to root
      hr = S_OK;
      for( int i=0; i<10 && SUCCEEDED(hr); i++ )
         hr = browse.ChangeBrowsePosition( OPC_BROWSE_UP, empty1 );
   }
   *pResult = 0;
}

void CAddItem::OnSelchangedOpcTree(NMHDR* pNMHDR, LRESULT* pResult) 
{
	USES_CONVERSION;
   if( !browse.IsOk() )
      return;
   CString  m_filter="*";
   CWaitCursor wait;
   HTREEITEM item = m_tree.GetSelectedItem( );
   HRESULT hr = BrowseHere( item );    // move browse position here
   if( SUCCEEDED(hr) )
   {
      // get the tags
      m_tags.ResetContent();
      IEnumString* pEnumString = NULL;
      hr = browse.BrowseOPCItemIDs(OPC_LEAF,
                                   T2OLE(m_filter.GetBuffer(0)),
                                   m_vt,
                                   0,  // no filtering (or OPC_READABLE|OPC_WRITEABLE)
                                   &pEnumString);
      if( hr == S_OK )
      {
         LPWSTR pName[NEXT];
         ULONG count = 0;
         do
         {
            hr = pEnumString->Next(NEXT, &pName[0], &count);
            // CString does translation from UNICODE to native type
            // (depends on the way the application is built)
            for( ULONG index=0; index<count; index++ )
            {
               CString name( pName[index] );
               m_tags.AddString( name );
               CoTaskMemFree( pName[index] );
            }
         }
         while( hr == S_OK );
         pEnumString->Release();
      }
   }
   hr = S_OK;
   for( int i=0; i<10 && SUCCEEDED(hr); i++ )
      hr = browse.ChangeBrowsePosition( OPC_BROWSE_UP, empty1 );

   if( pResult )
      *pResult = 0;
}

void CAddItem::OnOpcString() 
{
	// TODO: Add your control notification handler code here
	m_vt = VT_BSTR;
   if( nameSpaceType == OPC_NS_HIERARCHIAL )
      OnSelchangedOpcTree( NULL, NULL );
   else
      UpdateFlat();
}

void CAddItem::OnOpcShort() 
{
	// TODO: Add your control notification handler code here
	 m_vt = VT_I2;
   if( nameSpaceType == OPC_NS_HIERARCHIAL )
      OnSelchangedOpcTree( NULL, NULL );
   else
      UpdateFlat();
}

void CAddItem::OnOpcNative() 
{
	// TODO: Add your control notification handler code here
	m_vt = VT_EMPTY;
   if( nameSpaceType == OPC_NS_HIERARCHIAL )
      OnSelchangedOpcTree( NULL, NULL );
   else
      UpdateFlat();
}

void CAddItem::OnOpcLong() 
{
	// TODO: Add your control notification handler code here
	m_vt = VT_I4;
   if( nameSpaceType == OPC_NS_HIERARCHIAL )
      OnSelchangedOpcTree( NULL, NULL );
   else
      UpdateFlat();
}

void CAddItem::OnOpcDouble() 
{
	// TODO: Add your control notification handler code here
	m_vt = VT_R8;
   if( nameSpaceType == OPC_NS_HIERARCHIAL )
      OnSelchangedOpcTree( NULL, NULL );
   else
      UpdateFlat();
}

void CAddItem::OnOpcBool() 
{
	// TODO: Add your control notification handler code here
	m_vt = VT_EMPTY;
   if( nameSpaceType == OPC_NS_HIERARCHIAL )
      OnSelchangedOpcTree( NULL, NULL );
   else
      UpdateFlat();
}

void CAddItem::OnOpcAdditem() 
{
	// TODO: Add your control notification handler code here
	CWaitCursor wait;
    UpdateData();
	allitems[itemcount] = m_itemID;
	itemcount++;

}

void CAddItem::OnCancel() 
{
	// TODO: Add extra cleanup here
	
	CDialog::OnCancel();
}

BOOL CAddItem::OnInitDialog() 
{	
	// TODO: Add extra initialization here
   USES_CONVERSION;
   CWaitCursor wait;
   CDialog::OnInitDialog();

   CheckRadioButton( IDC_OPC_NATIVE, IDC_OPC_STRING, IDC_OPC_NATIVE );

   // Fill the tree with the server's hierarchy
   if( !browse.IsOk() )
   {
      m_tree.ShowWindow( FALSE );
      m_tags.ShowWindow( FALSE );
      m_flat.ShowWindow( TRUE );
      m_flat.AddString( _T("Browsing not supported") );
      return TRUE;
   }

   HRESULT hr = browse.QueryOrganization(&nameSpaceType);
   if( FAILED(hr) )
   {
      browse.Detach();
      return TRUE;
   }

   if( nameSpaceType == OPC_NS_HIERARCHIAL ) // show a tree
   {
      HTREEITEM Root = m_tree.InsertItem( _T("Root") );
      m_tree.SetItemData( Root, 1 );
      IEnumString* pEnumString = NULL;
      hr = browse.BrowseOPCItemIDs(OPC_BRANCH,
                                  L"*",
                                  m_vt,
                                  0,  // no filtering (or OPC_READABLE|OPC_WRITEABLE)
                                  &pEnumString);
      if( SUCCEEDED(hr) )
      {
         LPWSTR pName[NEXT];
         ULONG count = 0;
         do
         {
            hr = pEnumString->Next(NEXT, &pName[0], &count);
            // CString does translation from UNICODE to native type
            // (depends on the way the application is built)
            for( ULONG index=0; index<count; index++ )
            {
                CString name( pName[index] );
                HTREEITEM item = m_tree.InsertItem( name, Root );
                m_tree.SetItemData( item, 0 );
                m_tree.InsertItem( _T("Dummy"), item );
                CoTaskMemFree( pName[index] );
            }
         }
         while( hr == S_OK );
         pEnumString->Release();
      }
      m_tree.SelectItem( Root );
      m_tree.Expand( Root, TVE_EXPAND );
   }
   else  // namespace must be flat, only display in one listbox
   {
      m_tree.ShowWindow( FALSE );
      m_tags.ShowWindow( FALSE );
      m_flat.ShowWindow( TRUE );
      UpdateFlat();
   }
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CAddItem::OnItemPro() 
{
	// TODO: Add your control notification handler code here
	CSetItems dlg;
	dlg.Itemcount = itemcount;
	dlg.DoModal();
}

void CAddItem::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	CDialog::OnClose();
}

⌨️ 快捷键说明

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