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

📄 contentview.cpp

📁 此为Insight opc client InfoServerExplorer源程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////////
//
//  OPC DataAccess VC++ Client:	ContentView.CPP
//								(Source File)
//
/////////////////////////////////////////////////////////////////////////////
//
//          Author: Raphael Imhof
//    Initial Date: 11/04/98
//       $Workfile: ContentView.cpp $
//       $Revision: 1 $
//           $Date: 7/27/99 5:22p $
//   Target System: Microsoft Windows NT 4.0
//     Environment: Visual C++ 5.0 / OPC DataAccess 1.0/2.0
//         Remarks: 
//
/////////////////////////////////////////////////////////////////////////////
//
//     Description: implementation of the CContentView class.
//					right pane view: item list.
//					
//
/////////////////////////////////////////////////////////////////////////////
//
//  History of Changes     (Please remove very old comments and blank lines!)
//            $Log: /IDK/OPCServer/clients/VC++/InfoServerExplorer/ContentView.cpp $
// 
// 1     7/27/99 5:22p Imhof
// 
// 1     7/27/99 5:18p Imhof
// 
// 11    1/15/99 6:43p Imhof
// Updated legal notice.
// 
// 10    1/06/99 10:34a Imhof
// Added a changed attribute to the CItem class which is used to optimize
// the content view update.
// 
// 9     12/03/98 1:53p Imhof
// Removed read after additems
// 
// 8     11/12/98 2:39p Imhof
// Reenabled the remove item
// 
// 7     11/10/98 2:20p Imhof
// Added file header's.
// 
// 
//  $Nokeywords:$ (To avoid useless search while checking in.)
/////////////////////////////////////////////////////////////////////////////
//  Copyright (C) 1998, Siemens Building Technologies, Inc. Landis Division
//
// SIEMENS BUILDING TECHNOLOGIES, INC. IS PROVIDING THE FOLLOWING
// EXAMPLES OF CODE AS SAMPLE ONLY.
//
// SIEMENS BUILDING TECHNOLOGIES, INC.  MAKES NO REPRESENTATIONS
// OR WARRANTIES OF ANY KIND  WITH RESPECT TO THE VALIDTY OF THE 
// CODES   OR   DESIRED   RESULTS   AND   DISCLAIMS   ALL   SUCH 
// REPRESENTATIONS   AND   WARRANTIES,  INCLUDING  FOR  EXAMPLE, 
// WARRANTIES  OF  MERCHANTABILITY  AND FITNESS FOR A PARTICULAR 
// PURPOSE.    SIEMENS  BUILIDNG  TECHNOLOGIES,  INC.  DOES  NOT 
// REPRESENT  OR  WARRANT  THAT  THE  FOLLOWING CODE SAMPLES ARE 
// ACCURATE, VALID, COMPLETE OR CURRENT.
//
/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "InfoServerExplorer.h"
#include "ContentView.h"
#include "MainFrm.h"
#include "CommandItemDlg.h"
#include "ReadItemDlg.h"


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

enum 
{
	COLUMN_NAME = 0, 
	COLUMN_VALUE = 1, 
	COLUMN_TIME = 2
};

/////////////////////////////////////////////////////////////////////////////
// CContentView

IMPLEMENT_DYNCREATE(CContentView, CListView)

CContentView::CContentView()
{
	m_pListImageList = NULL;

	m_pListImageList = new CImageList();
	ASSERT(m_pListImageList);
	m_pListImageList->Create(16, 16, NULL, 1, 1);

	HICON hItemIcon = AfxGetApp()->LoadIcon(IDI_ITEM);
	
	// Note ! The order below is important ! Should map to the #defines at the top
	m_pListImageList->Add(hItemIcon);
}

CContentView::~CContentView()
{
	if(NULL != m_pListImageList)
	{
		m_pListImageList->DeleteImageList();
		delete m_pListImageList;
		m_pListImageList = NULL;
	}
}


BEGIN_MESSAGE_MAP(CContentView, CListView)
	//{{AFX_MSG_MAP(CContentView)
	ON_MESSAGE(WM_CONTENTVIEW_UPDATE, OnContentViewUpdate)
	ON_WM_CONTEXTMENU()
	ON_COMMAND(ID_OPC_COMMANDITEM, OnOpcCommanditem)
	ON_UPDATE_COMMAND_UI(ID_OPC_COMMANDITEM, OnUpdateOpcCommanditem)
	ON_COMMAND(ID_OPC_EDITITEM, OnOpcEdititem)
	ON_UPDATE_COMMAND_UI(ID_OPC_EDITITEM, OnUpdateOpcEdititem)
	ON_COMMAND(ID_OPC_READITEM, OnOpcReaditem)
	ON_UPDATE_COMMAND_UI(ID_OPC_READITEM, OnUpdateOpcReaditem)
	ON_COMMAND(ID_OPC_REMOVEITEM, OnOpcRemoveitem)
	ON_UPDATE_COMMAND_UI(ID_OPC_REMOVEITEM, OnUpdateOpcRemoveitem)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CContentView drawing

void CContentView::OnDraw(CDC* pDC)
{
	CDocument* pDoc = GetDocument();
	// TODO: add draw code here
}

/////////////////////////////////////////////////////////////////////////////
// User defined messages handlers

LONG CContentView::OnContentViewUpdate(UINT wparam ,LONG lparam)
{
	try
	{
		OnUpdate(NULL,wparam, (CObject*)lparam);
	}
	catch(...)
	{
		return -1L;
	}
	return 0L;
}

/////////////////////////////////////////////////////////////////////////////
// CContentView diagnostics

#ifdef _DEBUG
void CContentView::AssertValid() const
{
	CListView::AssertValid();
}

void CContentView::Dump(CDumpContext& dc) const
{
	CListView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CContentView message handlers

void CContentView::OnInitialUpdate() 
{
	CListView::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
	//GetDocument()->hView = GetSafeHwnd();  ??
	CListCtrl& list = GetListCtrl();

	list.ModifyStyle(NULL, LVS_REPORT | LVS_SORTASCENDING ,0);

	if(NULL == list.GetImageList(LVSIL_SMALL))
		VERIFY(list.SetImageList(m_pListImageList, LVSIL_SMALL) == NULL);



	while( list.DeleteColumn( 0 ) );

	list.InsertColumn( COLUMN_NAME,  _T("Tag"), LVCFMT_LEFT , 220, 0 );
	list.InsertColumn( COLUMN_VALUE,  _T("Value"), LVCFMT_LEFT, 150, 1 );
	list.InsertColumn( COLUMN_TIME,  _T("Time"), LVCFMT_LEFT, 150, 1 );
	
}

void CContentView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
{
	// TODO: Add your specialized code here and/or call the base class

	//retrieve the selected item in the browser
	int nImage, nSelectedImage;
	CListCtrl& list = GetListCtrl();
	list.SetRedraw( FALSE );

	HTREEITEM	browser_item;
	CMainFrame* pMainFrame = (CMainFrame*) AfxGetMainWnd();
	CTreeCtrl& tree = pMainFrame->GetBrowserView()->GetTreeCtrl();
	browser_item = tree.GetSelectedItem();
	tree.GetItemImage(browser_item, nImage, nSelectedImage);
	if(browser_item == tree.GetRootItem())
	{
		//delete all items
		list.DeleteAllItems();
		UpdateWindow();
	}
	else if(nImage == 1) //group
	{
		CGroup* group = (CGroup*) tree.GetItemData(browser_item);
		UpdateGroup(pSender, lHint, pHint, list, &group);
	}
	/* no items in the browser anymore !
	else if(nImage == 2) //item
	{
		CItem* item = (CItem*) tree.GetItemData(browser_item);
		UpdateItem(pSender, lHint, pHint, list, &item);
	}
	*/
	else
	{
		//delete all items
		list.DeleteAllItems();
		UpdateWindow();
	}

	list.SetRedraw( TRUE );
}

void CContentView::UpdateGroup(CView* pSender, LPARAM lHint, CObject* pHint, CListCtrl& list, CGroup** group)
{
	if( lHint == CONTENT_UPDATE_ONLY )   // update values only (a data advise)
	{
		//update all itmes for now
		for( int index=0; index < list.GetItemCount(); index++ )
        {
			CItem* pItem = (CItem*)list.GetItemData( index );
			UpdateItemValues(list,&pItem,index);
		}
	}
	else
	{
		CArray<CItem*, CItem*>*	pItems;
		unsigned int nItems = 0;

		list.DeleteAllItems();
		UpdateWindow();

		nItems = (*group)->GetItems(&pItems);
		for( unsigned int index=0; index < nItems; index++)
		{
			AddItem(list,&(*pItems)[index],index);
		}
	}
}

void CContentView::UpdateItem(CView* pSender, LPARAM lHint, CObject* pHint, CListCtrl& list, CItem** item)
{
	if( lHint == CONTENT_UPDATE_ONLY )   // update values only (a data advise)
	{
		for( int index=0; index < list.GetItemCount(); index++ )
        {
			CItem* pItem = (CItem*)list.GetItemData( index );
			UpdateItemValues(list,item,index);
		}		
	}
	else
	{
		int index = 0;

		list.DeleteAllItems();
		UpdateWindow();

		list.SetItemCount(1);

		AddItem(list,item,index);
		list.SetItem(index, COLUMN_NAME, LVIF_STATE, NULL, 0, LVIS_SELECTED, 0, 0 );
	}
}

void CContentView::UpdateItemValues(CListCtrl& list, CItem** item, int index)
{
	if((*item)->IsChanged())
	{
		//reset
		(*item)->SetChanged(FALSE);

		CString sValue;

		if((*item)->GetValue().vt != (*item)->GetDataType())
			TRACE(_T("item datatype inconsistency !\n"));

		switch( (*item)->GetValue().vt )
		{
			case VT_BOOL:
				// COM BOOL: -1(TRUE) or 0 (FALSE)
				sValue.Format( _T("%i"), -1 * (*item)->GetValue().boolVal );
				break;
			case VT_I2:
				sValue.Format( _T("%hd"), (*item)->GetValue().iVal );
				break;
			case VT_I4:
				sValue.Format( _T("%d"), (*item)->GetValue().lVal );
				break;
			case VT_R4:
				sValue.Format( _T("%f"), (*item)->GetValue().fltVal );			
				break;
			case VT_R8:
				 sValue.Format( _T("%g"), (*item)->GetValue().dblVal );
				break;
			case VT_BSTR:
				sValue = (*item)->GetValue().bstrVal;
				break;

⌨️ 快捷键说明

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