📄 rtllefttopview.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 + -