📄 serverview.cpp
字号:
// ServerView.cpp : implementation of the CServerView class
//
#include "stdafx.h"
#include "Server.h"
#include "ServerDoc.h"
#include "ServerView.h"
#include "MainFrm.h"
#include "DlgBar.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CServerView
IMPLEMENT_DYNCREATE(CServerView, CListView)
BEGIN_MESSAGE_MAP(CServerView, CListView)
//{{AFX_MSG_MAP(CServerView)
ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
ON_WM_CREATE()
ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, OnItemChanged)
ON_WM_LBUTTONDBLCLK()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CListView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CListView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CListView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CServerView construction/destruction
CServerView::CServerView()
{
// TODO: add construction code here
m_bUpdate = FALSE;
}
CServerView::~CServerView()
{
}
BOOL CServerView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CListView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CServerView drawing
void CServerView::OnDraw(CDC* pDC)
{
CServerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CServerView printing
BOOL CServerView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CServerView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CServerView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CServerView diagnostics
#ifdef _DEBUG
void CServerView::AssertValid() const
{
CListView::AssertValid();
}
void CServerView::Dump(CDumpContext& dc) const
{
CListView::Dump(dc);
}
CServerDoc* CServerView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CServerDoc)));
return (CServerDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CServerView message handlers
//初始化视图
void CServerView::OnInitialUpdate()
{
char * ItemName[] ={ "计算机名", "开始时间", "预交金额", "限时(分钟)",
"会员卡号", "已用时间", "费 用", "附加费用", "状 态", "异常情况", "备 注" };
LV_COLUMN lv;
m_pDaoRecord = &GetDocument()->m_daoRecord;
m_pDaoRecordFree = &GetDocument()->m_daoHistoryFree;
CListCtrl & clc = GetListCtrl();
clc.ModifyStyle(NULL, LVS_REPORT);
int nColumnCount = clc.GetHeaderCtrl()->GetItemCount();
// Delete all of the columns.
for (int i=0;i < nColumnCount;i++)
{
clc.DeleteColumn(0);
}
CImageList ImageList;
ImageList.Create(IDB_STATUS_SMALL_BITMAP, 16, 0, RGB(255,255,255));
clc.SetImageList(&ImageList, LVSIL_SMALL);
ImageList.Detach();
ImageList.Create(IDB_STATUS_BIG_BITMAP, 32, 0, RGB(255,255,255));
clc.SetImageList(&ImageList, LVSIL_NORMAL);
ImageList.Detach();
lv.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH ;
lv.fmt = LVCFMT_LEFT ;
for (i = 0; i <= 10; i++)
{
lv.cx = 4 * clc.GetStringWidth(ItemName[i]) / 3;
lv.pszText = ItemName[i];
clc.InsertColumn(i, &lv);
}
clc.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);//|LVS_EX_HEADERDRAGDROP);
clc.ModifyStyleEx(0, WS_EX_CLIENTEDGE);
bool bReCover = false;
m_pDaoRecord = &GetDocument()->m_daoRecord;
if (!(m_pDaoRecord->IsBOF() && m_pDaoRecord->IsEOF()))
{
m_pDaoRecord->MoveLast();
int nCount = m_pDaoRecord->GetRecordCount();
m_pDaoRecord->MoveFirst();
for(int i = 0; i < nCount; i++)
{
if (m_pDaoRecord->m_nStatus == CLIENT_WORKING)
{
if(AfxMessageBox("上次系统意外关闭,是否恢复数据?", MB_OKCANCEL) == IDOK)
bReCover = true;
break;
}
m_pDaoRecord->MoveNext();
}
}
if(!bReCover)
{
int recordCount;
if(m_pDaoRecord->GetRecordCount() == 0)
return;
m_pDaoRecord->MoveLast();
recordCount = m_pDaoRecord->GetRecordCount();
m_pDaoRecord->MoveFirst();
for (int i = 0; i < recordCount; i++)
{
m_pDaoRecord->Edit();
m_pDaoRecord->m_timeStart.SetTime(0,0,0);
m_pDaoRecord->m_fPrepay = 0.0;
m_pDaoRecord->m_nLimitTime = 0;
m_pDaoRecord->m_strCardNum.Empty();
m_pDaoRecord->m_nWorkTime = 0;
m_pDaoRecord->m_fFree = 0.0;
m_pDaoRecord->m_fAddtionalFree = 0.0;
m_pDaoRecord->m_strBak.Empty();
m_pDaoRecord->m_nStatus = CLIENT_UNKNOW;
m_pDaoRecord->m_SOCKET = 0;
m_pDaoRecord->Update();
m_pDaoRecord->MoveNext();
}
}
CListView::OnInitialUpdate();
}
//更新视图
void CServerView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
CListCtrl & clc = GetListCtrl();
CString str;
int recordCount;
m_pDaoRecord->MoveLast();
recordCount = m_pDaoRecord->GetRecordCount();
m_pDaoRecord->MoveFirst();
clc.DeleteAllItems();
for (int i = 0; i < recordCount; i++)
{
clc.InsertItem(i, m_pDaoRecord->m_strName, m_pDaoRecord->m_nStatus);
clc.SetItemText(i, 1, m_pDaoRecord->m_timeStart.Format(VAR_TIMEVALUEONLY));
str.Format("%.1f", m_pDaoRecord->m_fPrepay);
clc.SetItemText(i, 2, str);
str.Format("%d", m_pDaoRecord->m_nLimitTime);
clc.SetItemText(i, 3, str);
clc.SetItemText(i, 4, m_pDaoRecord->m_strCardNum);
if(m_pDaoRecord->m_nStatus == CLIENT_WORKING)
{
CTime time;
time = CTime::GetCurrentTime();
int nHour = time.GetHour() - m_pDaoRecord->m_timeStart.GetHour();
if (nHour < 0)
nHour = 24 + nHour;
int nMinute = time.GetMinute() - m_pDaoRecord->m_timeStart.GetMinute();
int nSecond = time.GetSecond() - m_pDaoRecord->m_timeStart.GetSecond();
m_pDaoRecord->Edit();
m_pDaoRecord->m_nWorkTime = nHour * 3600 + nMinute * 60 + nSecond;
m_pDaoRecord->Update();
}
str = ConvertString(m_pDaoRecord->m_nWorkTime/3600);
str +=":";
int ntemp = m_pDaoRecord->m_nWorkTime % 3600;
str += ConvertString(m_pDaoRecord->m_nWorkTime/60);
str +=":";
str += ConvertString(m_pDaoRecord->m_nWorkTime%60);
clc.SetItemText(i, 5, str);
str.Format("%3.1f", m_pDaoRecord->m_fFree);
clc.SetItemText(i, 6, str);
switch(m_pDaoRecord->m_nStatus)
{
case CLIENT_UNKNOW:
str.LoadString(IDS_CLIENT_UNKNOW);
break;
case CLIENT_WORKING:
str.LoadString(IDS_CLIENT_WORKING);
break;
case CLIENT_LOCKING:
str.LoadString(IDS_CLIENT_LOCKING);
break;
case CLIENT_WAITING:
str.LoadString(IDS_CLIENT_WAITING);
}
clc.SetItemText(i, 8, str);
str.Format("%3.1f", m_pDaoRecord->m_fAddtionalFree);
clc.SetItemText(i, 7, str);
clc.SetItemText(i, 9, " ");
clc.SetItemText(i, 10, m_pDaoRecord->m_strBak);
m_pDaoRecord->MoveNext();
}
}
//接收新的客户端
void CServerView::ReceiveData(SMessage& msg, CCommSocket* pCommSocket)
{
switch(msg.IDCode)
{
case CLIENT_IP_SEND:
{
CString strFilter("[计算机名]=\"");
strFilter += pCommSocket->m_strClientName;
strFilter += '\"';
if(m_pDaoRecord->FindFirst(strFilter))
{
m_pDaoRecord->Edit();
m_pDaoRecord->m_SOCKET = (long)pCommSocket;
ASSERT((CCommSocket*)m_pDaoRecord->m_SOCKET == pCommSocket);
m_pDaoRecord->Update();
if(m_pDaoRecord->m_nStatus == CLIENT_WORKING)
{
SMessage pMsg;
strcpy(pMsg.str,"Start Working!");
pMsg.IDCode = CLIENT_START_WORK;
pCommSocket->Send(&pMsg, sizeof(SMessage));
}
else
{
SMessage pMsg;
strcpy(pMsg.str,"Locking!");
pMsg.IDCode = CLIENT_LOCK;
m_pDaoRecord->Edit();
m_pDaoRecord->m_nStatus = CLIENT_LOCKING;
m_pDaoRecord->Update();
pCommSocket->Send(&pMsg, sizeof(SMessage));
}
}
else
{
m_pDaoRecord->AddNew();
m_pDaoRecord->m_strName = pCommSocket->m_strClientName;
pCommSocket->m_nRecordNum = m_pDaoRecord->GetAbsolutePosition();
m_pDaoRecord->m_nStatus = CLIENT_LOCKING;
m_pDaoRecord->m_timeStart.SetTime(0,0,0);
m_pDaoRecord->m_SOCKET = (long)pCommSocket;
ASSERT((CCommSocket*)m_pDaoRecord->m_SOCKET == pCommSocket);
m_pDaoRecord->Update();
SMessage pMsg;
strcpy(pMsg.str,"Lock Computer!");
pMsg.IDCode = CLIENT_LOCK;
pCommSocket->Send(&pMsg, sizeof(SMessage));
}
break;
}
case CLIENT_TIME_REPORT:
{
m_pDaoRecord->MoveFirst();
m_pDaoRecord->Move(pCommSocket->m_nRecordNum);
m_pDaoRecord->Edit();
m_pDaoRecord->m_nWorkTime ++;
m_pDaoRecord->Update();
Refurbish(m_pDaoRecord->GetAbsolutePosition());
}
}
Refurbish(pCommSocket->m_strClientName);
}
//刷新视图
void CServerView::Refurbish(CString strName)
{
LVFINDINFO info;
info.flags = LVFI_STRING;
info.psz = strName;
CString str;
CListCtrl & clc = GetListCtrl();
int iRecordNum = clc.FindItem(&info);
if(iRecordNum == -1)
{
iRecordNum = clc.GetItemCount();
clc.InsertItem(iRecordNum, strName, 0);
}
else
{
LVITEM lvi;
//lvi.mask = LVIF_STATE;
lvi.iItem = iRecordNum;
lvi.iSubItem = 0;
//lvi.stateMask = LVIS_STATEIMAGEMASK;
clc.GetItem( &lvi );
lvi.mask |= LVIF_IMAGE;
//lvi.stateMask = LVIS_STATEIMAGEMASK;
lvi.iImage = m_pDaoRecord->m_nStatus;
if (m_pDaoRecord->m_nStatus == CLIENT_ALL_NIGHT)
lvi.iImage = 2;
clc.SetItem(&lvi);
}
CString strFilter("[计算机名]=\"");
strFilter += strName;
strFilter += '\"';
if(m_pDaoRecord->FindFirst(strFilter))
{
clc.SetItemText(iRecordNum, 1, m_pDaoRecord->m_timeStart.Format(VAR_TIMEVALUEONLY));
str.Format("%3.1f", m_pDaoRecord->m_fPrepay);
clc.SetItemText(iRecordNum, 2, str);
str.Format("%d", m_pDaoRecord->m_nLimitTime);
clc.SetItemText(iRecordNum, 3, str);
clc.SetItemText(iRecordNum, 4, m_pDaoRecord->m_strCardNum);
if(m_pDaoRecord->m_nStatus == CLIENT_WORKING)
{
CTime time;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -