?? additem.cpp
字號:
// 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 + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -