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

📄 rtllefttopview.cpp

📁 一个串口通信的程序
💻 CPP
字号:
// RtlLeftTopView.cpp : implementation file
//

#include "stdafx.h"
#include "DataSvr.h"
#include "RtlLeftTopView.h"
#include "glovar.h"

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

static _TCHAR* szColumnHead[COLUMN_NUMBER] = {	_T("测点名称"), _T("参数名称"), _T("数据值"), _T("单位") };
static int nColumnFmt[COLUMN_NUMBER] = { LVCFMT_LEFT, LVCFMT_LEFT, LVCFMT_LEFT, LVCFMT_LEFT }; 
static int nColumnWidth[COLUMN_NUMBER];

/////////////////////////////////////////////////////////////////////////////
// CRtlLeftTopView

IMPLEMENT_DYNCREATE(CRtlLeftTopView, CListView)

CRtlLeftTopView::CRtlLeftTopView()
{
	m_nHeaderCurOrderColumn=3;
}

CRtlLeftTopView::~CRtlLeftTopView()
{
}


BEGIN_MESSAGE_MAP(CRtlLeftTopView, CListView)
	ON_MESSAGE(WM_INITITEM,InitItem)
	ON_MESSAGE(WM_SHOWVALUE,ShowValue)
	//{{AFX_MSG_MAP(CRtlLeftTopView)
	ON_WM_CREATE()
	ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick)
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRtlLeftTopView drawing

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

/////////////////////////////////////////////////////////////////////////////
// CRtlLeftTopView diagnostics

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

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

/////////////////////////////////////////////////////////////////////////////
// CRtlLeftTopView message handlers



int CRtlLeftTopView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CListView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if( InitListCtrl() == -1 )
		return -1;
	return 0;
}

BOOL CRtlLeftTopView::PreCreateWindow(CREATESTRUCT& cs) 
{
//	cs.style |= (LVS_SHOWSELALWAYS | LVS_REPORT | 
//               /*LVS_SINGLESEL | */LVS_NOSORTHEADER);
	cs.style = (cs.style & ~LVS_TYPEMASK) | LVS_REPORT;
	cs.style |= LVS_SHOWSELALWAYS | LVS_SINGLESEL;
	
	return CListView::PreCreateWindow(cs);
}

void CRtlLeftTopView::SetOrderColumn(int nCol)
{
	CListCtrl& ListCtrl = GetListCtrl();;

	HDITEM hi;
	CHeaderCtrl* pHC = ListCtrl.GetHeaderCtrl();
//	if(nCol >= COLUMN_DWMC) nCol = COLUMN_DWMC;
	ASSERT( nCol >= COLUMN_CDNAME && nCol <= COLUMN_WARN );

	// 如是同一列, 则只更改排序方向
	if( m_nHeaderCurOrderColumn == nCol )
		m_bHeaderCurOrderOrg[nCol] = !m_bHeaderCurOrderOrg[nCol];
	// 否则要先将前一列的排序标志去掉
	else {
		hi.mask = HDI_FORMAT | HDI_WIDTH;
		pHC->GetItem( m_nHeaderCurOrderColumn, &hi );
		hi.mask |= HDI_IMAGE;
		hi.fmt |= HDF_IMAGE | HDF_STRING;
		hi.iImage = -1;
		pHC->SetItem( m_nHeaderCurOrderColumn, &hi );

		m_nHeaderCurOrderColumn = nCol;
		m_bHeaderCurOrderOrg[nCol] = !m_bHeaderCurOrderOrg[nCol];
	}

	// 给该列加上排序标志
	hi.mask = HDI_FORMAT | HDI_WIDTH;
	pHC->GetItem( nCol, &hi );
	hi.mask |= HDI_IMAGE;
	hi.fmt |= HDF_IMAGE | HDF_STRING;
	hi.iImage = m_bHeaderCurOrderOrg[nCol] ? 0 : 1;
	pHC->SetItem( nCol, &hi );

}

void CRtlLeftTopView::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	int nCol = pNMListView->iSubItem;
	LPARAM lParamSort = MAKELPARAM( m_bHeaderCurOrderOrg[nCol], nCol );

	CListCtrl& ListCtrl = GetListCtrl();
	SetOrderColumn( nCol );
	// lParamSort : 低16位 = 排序方向 高16位 = 排序列
	ListCtrl.SortItems( CRtlLeftTopView::CompareHelper, lParamSort );

	ListCtrl.EnsureVisible( GetCurrentItem(), FALSE );
	
	*pResult = 0;
}

int CRtlLeftTopView::InitListCtrl()
{
	int iWidth, i;
	
	CListCtrl& ListCtrl = GetListCtrl();

	// 设置 ListCtrl 的扩展风格
	DWORD dwStyleEx;
	dwStyleEx = LVS_EX_FULLROWSELECT | LVS_EX_SUBITEMIMAGES | LVS_EX_HEADERDRAGDROP;// | LVS_EX_ONECLICKACTIVATE;//| LVS_EX_TRACKSELECT;// | LVS_EX_CHECKBOXES ;// | LVS_EX_HEADERDRAGDROP;
	ListCtrl.SetExtendedStyle( dwStyleEx );

	// 建立图像列表
	m_ImageListSmall.Create(IDB_LISTVIEW_SMALL, 16, 1, RGB(128, 128, 128));		// 小图标
	m_ImageListState.Create(IDB_LISTVIEW_STATE, 16, 1, RGB(255, 255, 255));		// 状态图标
	ListCtrl.SetImageList(&m_ImageListSmall, LVSIL_SMALL);
	ListCtrl.SetImageList(&m_ImageListState, LVSIL_STATE);

	// 建立 HeaderCtrl 排序标志图像列表
	CHeaderCtrl* pHC = ListCtrl.GetHeaderCtrl();
	m_ImageListHeaderOrder.Create(IDB_HEADER_ORDER, 16, 1, RGB(128, 128, 128));	// HeaderCtrl 排序标志图标
	pHC->SetImageList( &m_ImageListHeaderOrder );

	// 添加列
	LVCOLUMN lvc;
	lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_SUBITEM;
	for( i = 0; i < COLUMN_NUMBER; i++ ) {
		lvc.fmt = nColumnFmt[i];
		lvc.iSubItem = i;
		lvc.pszText = szColumnHead[i];
		ListCtrl.InsertColumn( i, &lvc );
	}
	lvc.fmt = nColumnFmt[1];
	lvc.iSubItem = i;
	lvc.pszText = "";
	ListCtrl.InsertColumn( i, &lvc );

	// 设置各列缺省宽度
	CRect rc;
	ListCtrl.GetClientRect( &rc );
	iWidth = rc.Width();
	nColumnWidth[0] = ListCtrl.GetStringWidth( _T("测点名称" ) ) + 16*3;
	nColumnWidth[1] = nColumnWidth[0];
	nColumnWidth[2] = ListCtrl.GetStringWidth( _T("1234567.90" ) )+16*3;
	nColumnWidth[3] = 80;

	for( i = 0; i < COLUMN_NUMBER; i++ )
		ListCtrl.SetColumnWidth( i, nColumnWidth[i] );
	ListCtrl.SetColumnWidth( i, 500 );

	// 设置第 1 列(测点名称)为排序列
	SetOrderColumn( m_nHeaderCurOrderColumn );

	// 设置各种颜色
	ListCtrl.SetBkColor( grgbArray[15] );
	ListCtrl.SetTextBkColor( grgbArray[15] );
	ListCtrl.SetTextColor( grgbArray[0] );

/*	// insert rows
	ListCtrl.InsertItem(0,"送宁煤气");
	ListCtrl.SetItemText(0,1,"温度");
	ListCtrl.SetItemText(0,2,"23");
	ListCtrl.SetItemText(0,3,"度");
	ListCtrl.SetItemData(0,0);
	SetReadedState(0,READ_YES);

	ListCtrl.InsertItem(1,"送宁煤气");
	ListCtrl.SetItemText(1,1,"温度1");
	ListCtrl.SetItemText(1,2,"24");
	ListCtrl.SetItemText(1,3,"度");
	ListCtrl.SetItemData(1,1);
	ListCtrl.SetItemState(1,1,LVIF_STATE);

	ListCtrl.InsertItem(2,"送宁煤气");
	ListCtrl.SetItemText(2,1,"温度2");
	ListCtrl.SetItemText(2,2,"25");
	ListCtrl.SetItemText(2,3,"度");
	ListCtrl.SetItemData(2,2);

	ListCtrl.InsertItem(3,"送宁煤气");
	ListCtrl.SetItemText(3,1,"温度3");
	ListCtrl.SetItemText(3,2,"26");
	ListCtrl.SetItemText(3,3,"度");
	ListCtrl.SetItemData(3,3);
*/
	this->InitItem(0,0);
	return 0;

}
int CALLBACK CRtlLeftTopView::CompareHelper(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	int iRet;
	CString str1, str2;
	CTime time1, time2;
	
	long rtid1 = (long)lParam1;
	long rtid2 = (long)lParam2;

	NPRT nprt1;
	NPYB npyb1;
	NPCD npcd1;
	NPCS npcs1;
	NPRT nprt2;
	NPYB npyb2;
	NPCD npcd2;
	NPCS npcs2;
	for(int i=0;i<arrRT.GetSize();i++)
	{
		nprt1=arrRT.GetAt(i);
		if(nprt1->rtid==rtid1)break;
	}
	for(int j=0;j<arrCD.GetSize();j++)
	{
		npcd1=arrCD.GetAt(j);
		if(npcd1->cdid==nprt1->cdid)break;
	}
	for(j=0;j<arrCS.GetSize();j++)
	{
		npcs1=arrCS.GetAt(j);
		if(npcs1->csid==nprt1->csid)break;
	}
	for(j=0;j<arrYB.GetSize();j++)
	{
		npyb1=arrYB.GetAt(j);
		if(npyb1->ybid==npcd1->ybid)break;
	}

	for(i=0;i<arrRT.GetSize();i++)
	{
		nprt2=arrRT.GetAt(i);
		if(nprt2->rtid==rtid2)break;
	}
	for(j=0;j<arrCD.GetSize();j++)
	{
		npcd2=arrCD.GetAt(j);
		if(npcd2->cdid==nprt2->cdid)break;
	}
	for(j=0;j<arrCS.GetSize();j++)
	{
		npcs2=arrCS.GetAt(j);
		if(npcs2->csid==nprt2->csid)break;
	}
	for(j=0;j<arrYB.GetSize();j++)
	{
		npyb2=arrYB.GetAt(j);
		if(npyb2->ybid==npcd2->ybid)break;
	}

	BOOL bOrg = LOWORD( lParamSort );
	int nCol = HIWORD(lParamSort);

	switch( nCol )
	{
		case COLUMN_CDNAME:		// 按 "测点名称" 排序

			iRet = npcd1->cdname.CompareNoCase(npcd2->cdname);// item1>item2?1:(item1==item2?0:-1);
			break;
		case COLUMN_CSNAME:		// 按 "参数名称" 排序
			iRet = npcs1->csname.CompareNoCase(npcs2->csname);//item1>item2?1:(item1==item2?0:-1);
			break;
		case COLUMN_DATA:		// 按 "数据"   排序
			iRet = rtid1>rtid2?1:(rtid1==rtid2?0:-1);
			break;
		case COLUMN_DWMC:		// 按 "单位"排序 
			iRet = nprt1->dw.CompareNoCase(nprt2->dw);// item1>item2?1:(item1==item2?0:-1);
			break;
		case COLUMN_WARN:		// 按 "警告"排序 
			iRet = nprt1->warn>nprt2->warn?1:(nprt1->warn==nprt2->warn?0:-1);
			break;
		default:
			iRet = 0;
			break;
	}

	if( bOrg == FALSE )
		if( iRet < 0 )
			iRet = 1;
		else if( iRet > 0 )
			iRet = -1;
		else
			iRet = 0;

	return iRet;
}

int CRtlLeftTopView::GetCurrentItem()
{
	CListCtrl& ListCtrl = GetListCtrl();

	POSITION pos = ListCtrl.GetFirstSelectedItemPosition();
	if( pos == NULL )
		return -1;
	else
		return ListCtrl.GetNextSelectedItem( pos );

}

void CRtlLeftTopView::SetReadedState(int nItem, int nState)
{
	CListCtrl& ListCtrl = GetListCtrl();

	ASSERT( nState == READ_NO || nState == READ_YES );

	if( nItem == -1 )
		return;

	// 改变 state 图标
	LVITEM lvi;
	memset(&lvi, 0, sizeof(LVITEM));
	lvi.mask = LVIF_STATE;
	lvi.iItem = nItem;
	lvi.iSubItem = 0;
	lvi.stateMask = LVIS_STATEIMAGEMASK;
	ListCtrl.GetItem( &lvi );
	lvi.stateMask = LVIS_STATEIMAGEMASK;
	lvi.state = INDEXTOSTATEIMAGEMASK( nState );
	ListCtrl.SetItem(&lvi);

	// 若"未读",则在"数据"列设置一个图标
	lvi.mask = LVIF_IMAGE;
	lvi.iItem = nItem;
	lvi.iSubItem = COLUMN_DATA;
	if( nState == READ_NO ) {
		lvi.iImage = 3;
	}
	else {
		lvi.iImage = -1;
	}

	ListCtrl.SetItem( &lvi );

	return;

}

LRESULT CRtlLeftTopView::InitItem( WPARAM wParam, LPARAM lParam )
{
	CListCtrl& ListCtrl = GetListCtrl();
	ListCtrl.DeleteAllItems();
	for(int x=0;x<RTCount;x++)
	{
		NPRT nprt;
		NPYB npyb;
		NPCD npcd;
		NPCS npcs;
		for(int i=0;i<arrRT.GetSize();i++)
		{
			nprt=arrRT.GetAt(i);
			if(nprt->rtid==xlfdata[x].rtid)break;
		}
		for(int j=0;j<arrCD.GetSize();j++)
		{
			npcd=arrCD.GetAt(j);
			if(npcd->cdid==nprt->cdid)break;
		}
		for(j=0;j<arrCS.GetSize();j++)
		{
			npcs=arrCS.GetAt(j);
			if(npcs->csid==nprt->csid)break;
		}
		for(j=0;j<arrYB.GetSize();j++)
		{
			npyb=arrYB.GetAt(j);
			if(npyb->ybid==npcd->ybid)break;
		}

		ListCtrl.InsertItem(x,npcd->cdname);
		ListCtrl.SetItemText(x,1,npcs->csname);
		ListCtrl.SetItemText(x,2,"");
		ListCtrl.SetItemText(x,3,nprt->dw);
		ListCtrl.SetItemData(x,nprt->rtid);
		SetState(x,nprt->view?1:2);
	}
	return 0;
}

LRESULT CRtlLeftTopView::ShowValue( WPARAM wParam, LPARAM lParam )
{
	CListCtrl& ListCtrl = GetListCtrl();
	int count=ListCtrl.GetItemCount();
	for(int i=0;i<count;i++)
	{
		int rtid;
		rtid=ListCtrl.GetItemData(i);
		NPRT nprt;
		for(int j=0;j<arrRT.GetSize();j++)
		{
			nprt=arrRT.GetAt(j);
			if(nprt->rtid==rtid)break;
		}
		for(j=0;j<RTCount;j++)
		{
			if(xlfdata[j].rtid==rtid)
				break;
		}
		CString temp;
		double value;
		if(xlfdata[j].cstype==0){temp.Format("%ld",xlfdata[j].lval);value=xlfdata[j].lval;}
		else if(xlfdata[j].cstype==1){temp.Format("%ld",xlfdata[j].sval);value=xlfdata[j].sval;}
		else if(xlfdata[j].cstype==2){temp.Format("%f",xlfdata[j].dval);value=xlfdata[j].dval;}
		ListCtrl.SetItemText(i,2,temp);
		int n;
		if(xlfdata[j].valuestate==0)n=1;		//无效
		else if(xlfdata[j].valuestate==1)n=2;	//有效
		else if(xlfdata[j].valuestate==-1)n=3;	//超时
		SetItemIcon(i,COLUMN_DATA,n);

		if(nprt->warn_enble)
		{
			if(value>nprt->warn_hi)n=5;
			else if(value<nprt->warn_low)n=4;
			else n=-1;
		}
		else
		{
			n=-1;
		}
		if(n==-1)nprt->warn=false;
		else nprt->warn=true;

		SetItemIcon(i,COLUMN_WARN,n);
	}
	return 1;
}

void CRtlLeftTopView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	UINT uWhere = 0;
	BOOL bHit = FALSE;
	CListCtrl& ListCtrl = GetListCtrl();
	int nState, nHitItem = ListCtrl.HitTest( point, &uWhere );
	CRect rc;
		
	// 鼠标点击在某个项目上
	if( nHitItem != -1 ) {
	
		int rtid=ListCtrl.GetItemData(nHitItem);
		NPRT nprt;
		int foundid;
		int countview=0;
		for(int i=0;i<arrRT.GetSize();i++)
		{
			nprt=arrRT.GetAt(i);
			if(nprt->rtid==rtid)foundid=i;
			if(nprt->view)countview++;
		}
		nprt=arrRT.GetAt(foundid);
		if( uWhere == LVHT_ONITEMSTATEICON )
		{
			if((!nprt->view && countview<5)||nprt->view)
			{
				nprt->view=!nprt->view;
				if(nprt->view)nState=1;
				else nState=2;
				bHit = TRUE;
			}
		}
/*		if( zz == READ_NO ) {
		
			// 得到"数据" 列图标矩形
			ListCtrl.GetSubItemRect( nHitItem, COLUMN_DATA, LVIR_ICON, rc );
			
			// 点击项目和"数据"列的 stateicon 将导致项目状态变为 READED
//			if( uWhere == LVHT_ONITEMSTATEICON || rc.PtInRect( point ) ) {
			if( uWhere == LVHT_ONITEMSTATEICON ) {
				bHit = TRUE;	nState = READ_YES;
			}
		}
		else if( uWhere == LVHT_ONITEMSTATEICON ) {// READED 状态只能通过点击项目 stateicon 变为 NOREAD
			bHit = TRUE;	nState = READ_NO;
		}
*/	}

	if( bHit )
		// 设置项目的 "未读-已读-已回复" 状态
		SetState( nHitItem, nState );
	else
		CListView::OnLButtonDown(nFlags, point);
}

void CRtlLeftTopView::SetState(int nItem, int nState)
{
	CListCtrl& ListCtrl = GetListCtrl();

	if( nItem == -1 )
		return;

	// 改变 state 图标
	LVITEM lvi;
	memset(&lvi, 0, sizeof(LVITEM));
	lvi.mask = LVIF_STATE;
	lvi.iItem = nItem;
	lvi.iSubItem = 0;
	lvi.stateMask = LVIS_STATEIMAGEMASK;
	ListCtrl.GetItem( &lvi );
	lvi.stateMask = LVIS_STATEIMAGEMASK;
	lvi.state = INDEXTOSTATEIMAGEMASK( nState );
	ListCtrl.SetItem(&lvi);

	// 若"未读",则在"数据"列设置一个图标
	lvi.mask = LVIF_IMAGE;
	lvi.iItem = nItem;
	lvi.iSubItem = COLUMN_DATA;
	if( nState == READ_NO ) {
		lvi.iImage = 3;
	}
	else {
		lvi.iImage = -1;
	}

//	ListCtrl.SetItem( &lvi );

	return;

}

void CRtlLeftTopView::SetItemIcon(int nItem, int nSubItem, int nIcon)
{
	CListCtrl& ListCtrl = GetListCtrl();

	int nState = READ_NO;
	ASSERT( nState == READ_NO || nState == READ_YES );

	if( nItem == -1 )
		return;

	// 改变 state 图标
	LVITEM lvi;
	memset(&lvi, 0, sizeof(LVITEM));
	lvi.mask = LVIF_STATE;
	lvi.iItem = nItem;
	lvi.iSubItem = 0;
	lvi.stateMask = LVIS_STATEIMAGEMASK;
	ListCtrl.GetItem( &lvi );
	lvi.stateMask = LVIS_STATEIMAGEMASK;
	lvi.state = INDEXTOSTATEIMAGEMASK( nState );
//	ListCtrl.SetItem(&lvi);

	// 若"未读",则在"数据"列设置一个图标
	lvi.mask = LVIF_IMAGE;
	lvi.iItem = nItem;
	lvi.iSubItem = nSubItem;
	if( nState == READ_NO ) {
		lvi.iImage = nIcon;
	}
	else {
		lvi.iImage = -1;
	}

	ListCtrl.SetItem( &lvi );

	return;

}

⌨️ 快捷键说明

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