📄 mainfrm.cpp
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "Server.h"
#include "IdleUI.h"
#include "htmlhelp.h"
#include "MainFrm.h"
#include "ServerView.h"
#include "RegisterDlg.h"
#include "CheckOutDialog.h"
#include "LockDeskWindow.h"
#include "SetPayDlg.h"
#include "SendMsgDlg.h"
#include "ViewMsgDlg.h"
#include "SaleFoodDlg.h"
#include "SetPassWordDlg.h"
#include "SetAutoTimeDlg.h"
#include "DaoPayProperty.h"
#include "Splash.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
#define LLKHF_ALTDOWN 0x00000020
#define WH_KEYBOARD_LL 13
typedef struct tagKBDLLHOOKSTRUCT {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
DWORD dwExtraInfo;
} KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
HHOOK glhHook;
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_WM_MEASUREITEM()
ON_WM_DRAWITEM()
ON_WM_SIZE()
ON_COMMAND(IDM_START_TIMING, OnStartTiming)
ON_COMMAND(IDM_VIEW_STYLE, OnViewStyle)
ON_COMMAND(IDM_VIEW_BIGICON, OnViewBigIcon)
ON_COMMAND(IDM_VIEW_DETAIL, OnViewDetail)
ON_COMMAND(IDM_VIEW_LIST, OnViewList)
ON_COMMAND(IDM_VIEW_SMALLICON, OnViewSmallIcon)
ON_COMMAND(ID_VIEW_MESSAGEDLG, OnViewMessageDlg)
ON_UPDATE_COMMAND_UI(ID_VIEW_MESSAGEDLG, OnUpdateViewMessageDlg)
ON_COMMAND(IDM_DLGBAR_PROMPT, OnDlgbarPrompt)
ON_COMMAND(IDM_DLGBAR_TREE, OnDlgbarTree)
ON_COMMAND(IDM_LOCKING, OnLockClient)
ON_COMMAND(IDM_CHECK_OUT, OnCheckOut)
ON_COMMAND(IDM_SWITCH, OnSwitchClient)
ON_COMMAND(IDM_UNLOCK, OnUnlockClient)
ON_MESSAGE(WM_START_WORK, OnStartWork)
ON_MESSAGE(WM_TIME_REPORT, OnTimeReport)
ON_MESSAGE(WM_DISPLAY_MESSAGE, OnReceiveMsg)
ON_MESSAGE(WM_LEAGUER_CHECK_OUT, OnLeaguerCheckOut)
ON_MESSAGE(WM_LEAGUER_INFORMATION, OnSendLeaguerInformation)
ON_MESSAGE(WM_CLIENT_CONFIRM, OnAcceptClientConfirmInformation)
ON_COMMAND(IDM_RESET, OnReset)
ON_COMMAND(IDM_SHUTDOWN, OnShutdown)
ON_COMMAND(IDM_LOCK_DESKWINDOW, OnLockDeskwindow)
ON_COMMAND(IDM_SET_PAY, OnSetPay)
ON_COMMAND(IDM_SEND_MESSAGE, OnSendMessage)
ON_COMMAND(ID_MANAGE_FOOD, OnManageFood)
ON_COMMAND(ID_APP_EXIT, OnAppExit)
ON_COMMAND(IDM_SALE_FOOD, OnSaleFood)
ON_COMMAND(ID_MANAGE_LEAGUER, OnManageLeaguer)
ON_COMMAND(IDM_ALL_NIGHT_WORK, OnAllNightWork)
ON_COMMAND(IDM_SET_PASSWORD, OnSetPassword)
ON_COMMAND(IDM_AUTO_LOCK, OnAutoLock)
ON_COMMAND(ID_FREE_RECORD,OnHistoryFreeDisplay)
ON_COMMAND(ID_HELP, OnHelp)
ON_WM_CLOSE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_SEPARATOR,
ID_SEPARATOR,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
m_daoPayProperty.Open();
m_daoPayProperty.MoveFirst();
LeaguerModelessDlg = NULL;
FoodModelessDlg = NULL;
HistoryFreedlg = NULL;
}
CMainFrame::~CMainFrame()
{
m_daoPayProperty.Close();
}
BOOL CMainFrame::CreateToolBar()
{
CImageList ImageList;
char* ImageText[] = { "查 看", "计 时", "结 账", "换 机", "锁 定", "解 锁", "重 启" , "关 机", "商品出售", "锁定桌面", "会员管理", "计费统计"};
UINT ImageID[] = {IDM_VIEW_STYLE,IDM_START_TIMING, IDM_CHECK_OUT, IDM_SWITCH, IDM_LOCKING, IDM_UNLOCK, IDM_RESET, IDM_SHUTDOWN, IDM_SALE_FOOD, IDM_LOCK_DESKWINDOW, ID_MANAGE_LEAGUER, ID_FREE_RECORD};
if( !m_wndToolBar.CreateEx(this))
{
TRACE0("Failed to create toolbar\n");
return -1;
}
if( !m_wndReBar.Create(this) ) {
TRACE0("Failed to create rebar\n");
return -1;
}
m_wndToolBar.GetToolBarCtrl().SetButtonWidth(40, 50);
m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
ImageList.Create(IDB_TOOLBAR_HOT, 32, 0, RGB(255, 255, 255));
m_wndToolBar.GetToolBarCtrl().SetHotImageList(&ImageList);
ImageList.Detach();
ImageList.Create(IDB_TOOLBAR_HOT, 32, 0, RGB(255,255,255));
m_wndToolBar.GetToolBarCtrl().SetImageList(&ImageList);
ImageList.Detach();
m_wndToolBar.SetButtons(NULL, 12);
for( int i=0; i < 12; i++ )
{
if( i == 0 )
{
m_wndToolBar.SetButtonInfo(i, ImageID[i], TBSTYLE_BUTTON | TBSTYLE_DROPDOWN, i);
}
else
m_wndToolBar.SetButtonInfo(i, ImageID[i], TBSTYLE_BUTTON, i);
m_wndToolBar.SetButtonText(i, ImageText[i]);
}
CRect rectToolBar;
m_wndToolBar.GetItemRect(0, &rectToolBar);
m_wndToolBar.SetSizes(rectToolBar.Size(), CSize(32, 32));
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |CBRS_ALIGN_TOP
|CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_FIXED );
m_wndReBar.AddBar( &m_wndToolBar );
REBARBANDINFO rbbi;
rbbi.cbSize = sizeof(rbbi);
rbbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE | RBBIM_SIZE | RBBIM_STYLE;
rbbi.cxMinChild = rectToolBar.Width();
rbbi.cyMinChild = rectToolBar.Height();
rbbi.cx = rbbi.cxIdeal = rectToolBar.Width()*7;
rbbi.fStyle = RBBS_FIXEDSIZE | RBBS_FIXEDBMP;
m_wndReBar.GetReBarCtrl().SetBandInfo(0, &rbbi);
EnableDocking(CBRS_ALIGN_ANY);
return 0;
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
//glhHook=SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)LowLevelKeyboardProc,(HINSTANCE)AfxGetApp()->m_hInstance,0);
if (!m_menu.Initialize(IDR_MAINFRAME,this))
return -1;
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if(CreateToolBar())
return -1;
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
m_wndStatusBar.SetPaneInfo(1, ID_SEPARATOR, SBPS_NORMAL, 400);
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
if (!m_wndDlgBar.Create(this, IDD_DIALOGBAR, WS_CHILD | WS_VISIBLE
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC | CBRS_ALIGN_LEFT, IDD_DIALOGBAR))
{
TRACE0("Failed to create dialogbar\n");
return -1;
}
CImageList ImageList;
ImageList.Create (IDB_TREE_BITMAP, 16, 1, RGB(0,255,0));
ImageList.Detach();
OnDlgbarPrompt();
BOOL bBroadcast = TRUE;
CHAR name[255];
PHOSTENT hostinfo;
CString strLocalip;
//Get local ip address
gethostname( name, sizeof(name));
hostinfo = gethostbyname(name);
strLocalip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
strcpy(m_Msg.str, strLocalip);
int Position = strLocalip.ReverseFind('.');
ServerIP = strLocalip.Mid(0, Position + 1);
ServerIP += "255";
m_Msg.IDCode = BROADCAST_SERVER_IP;
//Create a UDP socket,so can send local ip address to whole network
m_sockBroadcast.Create(6820, SOCK_DGRAM, NULL);
m_sockBroadcast.SetSockOpt(SO_BROADCAST, (char*) &bBroadcast, sizeof(BOOL));
CountIntervals();
SetTimer(BROADCAST_SERVER_IP,2000,NULL);
SetTimer(2,1000,NULL);
SetTimer(3,600000,NULL); //10分钟
SetTimer(4,5000,NULL); //20秒 20000
//SetTimer(5,60000,NULL);
//Create a socket that can accept connection
m_pListenSocket = new CListenSocket(this);
m_pListenSocket->Create(6810);
m_pListenSocket->Listen();
if(!IdleUIInit())
{
AfxMessageBox(IDS_INIT_IDLE_ERROR, MB_ICONWARNING);
}
AfxGetApp()->WriteProfileInt("LockWindow","Status",0);
CMenu* pMenu = this->GetSystemMenu(FALSE);
pMenu->ModifyMenu(SC_CLOSE,MF_BYCOMMAND | MF_GRAYED);
// CG: The following line was added by the Splash Screen component. CSplashWnd::ShowSplashScreen(this);
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
//cs.style &= ~WS_MAXIMIZEBOX;
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
// MENUEX_ADD - Mainframe menu is ready to measure prior to drawing
m_menu.MeasureItem(this,lpMeasureItemStruct);
CFrameWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}
void CMainFrame::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// MENUEX_ADD - Mainframe menu is ready to draw
m_menu.DrawItem(lpDrawItemStruct);
CFrameWnd::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
void CMainFrame::OnTimer(UINT nIDEvent)
{
static int nCount = 0;
CRecMsg m_daoRecMsg;
int RecMsgCount = 0;
int nmin;
int IdleMin = 1;
int LockStatus = AfxGetApp()->GetProfileInt("LockWindow","Status",0);
if (LockStatus != 1) //锁定控制台
{
m_IdleMin = AfxGetApp()->GetProfileInt("LockWindow","idlemin",0);
if (m_IdleMin == 0)
m_IdleMin = 1;
nmin = (GetTickCount() - IdleUIGetLastInputTime())/1000/60;
if(nmin == IdleMin && IdleMin != 0)
{
AfxGetApp()->WriteProfileInt("LockWindow","Status",1);
CString str;
LockStatus = AfxGetApp()->GetProfileInt("LockWindow","Status",0);
str.Format("%d",LockStatus);
CUnlockDeskWindow UnlockDeskWindowdlg;
UnlockDeskWindowdlg.DoModal();
}
}
if (nIDEvent == 1) //给局域网中所有客户端发送消息
{
int iSend= m_sockBroadcast.SendTo(&m_Msg, sizeof(SMessage), 6830, ServerIP, 0);
if(nCount == 2)
{
KillTimer(1);
m_sockBroadcast.Close();
}
nCount++;
}
if(nIDEvent == 2) //计费
{
SetStatusText();
CString strTime;
CString str;
static int Status = 2;
long nWorkTime;
CListCtrl & clc = ((CServerView*)GetActiveView())->GetListCtrl();
int nCount = clc.GetItemCount();
str.Format("%d",nCount);
if (Status == 1)
Status = 2;
else
Status = 1;
for(int i = 0; i < nCount; i++) //检测客户端是否给服务器发送消息
{
CString strTemp = clc.GetItemText(i, 8);
if(strTemp.Compare("工作中") == 0)
{
CString strName = clc.GetItemText(i, 0);
m_daoRecMsg.m_strFilter = "[Name]=\"" + strName + '\"';
m_daoRecMsg.Open();
if(!(m_daoRecMsg.IsBOF() && m_daoRecMsg.IsEOF()))
{
RecMsgCount++;
LVITEM lvi;
lvi.iItem = i;
lvi.iSubItem = 0;
clc.GetItem( &lvi );
lvi.mask |= LVIF_IMAGE;
lvi.iImage = Status;
clc.SetItem(&lvi);
MessageBeep(MB_OK);
}
else
{
LVITEM lvi;
lvi.iItem = i;
lvi.iSubItem = 0;
clc.GetItem( &lvi );
lvi.mask |= LVIF_IMAGE;
lvi.iImage = 2;
clc.SetItem(&lvi);
}
m_daoRecMsg.Close();
}
strTemp = clc.GetItemText(i, 8);
if(strTemp.Compare("工作中") == 0)
{
bool IsLeaguer = true;
if (clc.GetItemText(i,4) == "")
IsLeaguer = false;
strTime = clc.GetItemText(i,5);
nWorkTime = atoi(strTime.Mid(0,2)) * 3600 + atoi(strTime.Mid(3,2)) * 60 + atoi(strTime.Mid(6,2));
nWorkTime++;
CDaoRecord& DaoRecordFree = ((CServerDoc*)GetActiveDocument())->m_daoRecord;
//大于最小计费时间
if (nWorkTime % (m_daoPayProperty.m_MiniSecond * 60) == 0 && nWorkTime == (m_daoPayProperty.m_MiniSecond * 60))
{
clc.SetItemText(i,6,"0.5");
CString strFilter("[计算机名]=\"");
strFilter += clc.GetItemText(i,0);
strFilter += '\"';
if(DaoRecordFree.FindFirst(strFilter))
{
DaoRecordFree.Edit();
DaoRecordFree.m_fFree = 0.5;
DaoRecordFree.Update();
}
}
str = ConvertString(nWorkTime/3600);
int ntemp = nWorkTime % 3600;
str +=":";
str += ConvertString(ntemp/60);
str +=":";
str += ConvertString(ntemp%60);
clc.SetItemText(i,5,str);
CString strLimitTime = clc.GetItemText(i, 3);
CString strWorkTime = clc.GetItemText(i, 5);
int nWorkTime = atoi(strWorkTime.Mid(0,2)) * 3600 + atoi(strWorkTime.Mid(3,2)) * 60 + atoi(strWorkTime.Mid(6,2));
CString str;
str.Format("%d", nWorkTime);
//限时已到
if((atoi(strLimitTime) * 60) <= nWorkTime && atoi(strLimitTime) != 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -