📄 contentview.cpp
字号:
/////////////////////////////////////////////////////////////////////////////
//
// 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 + -