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

📄 frmmain.cpp

📁 AutoNetFidelio酒店管理系统增加智能门锁进行入住发卡及退房收卡。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// FrmMain.cpp : implementation file

#include "stdafx.h"
#include "MyBox.h"
#include "AutoNetFdl.h"
#include "FrmMain.h"

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

#define BUFSIZE 128  //缓冲区大小
#define WM_MY_TRAY_NOTIFICATION  WM_USER+0   //定义托盘图标消息ID
#define WM_USER_THREAD           WM_USER+100 //定义用户消息ID

CFrmMain::CFrmMain(CWnd* pParent /*=NULL*/)
: CDialog(CFrmMain::IDD, pParent),m_trayIcon(IDR_TRAYMENU_EN)
{
	//{{AFX_DATA_INIT(CFrmMain)
	m_ServPort = 0;
	m_bShowTrayNotifications = TRUE;
	m_bShutdown = FALSE;
	m_IsTongxing = FALSE;
	m_RefCount=0;
	m_LastTongxingFlag = FALSE;
	//}}AFX_DATA_INIT
	for (int i=0;i<5;i++)
	{
		m_bufT1[i]=0;
		m_bufT2[i]=0;
	}
	
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CFrmMain::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CFrmMain)
	DDX_Control(pDX, IDC_ADDR_COMBO, m_wndIPAddress);
	DDX_Text(pDX, IDC_SERVPORT_EDIT, m_ServPort);
	DDX_Check(pDX, IDC_OS_CHECK2, m_IsTongxing);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CFrmMain, CDialog)
	//{{AFX_MSG_MAP(CFrmMain)
	ON_BN_CLICKED(IDC_0K, OnOk)
	ON_BN_CLICKED(IDC_OS_CHECK, OnOsCheck)
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_STOP, OnStop)
	ON_BN_CLICKED(IDC_LINKAGAIN, OnLinkagain)
	ON_MESSAGE(WM_MY_TRAY_NOTIFICATION, OnTrayNotification)
	ON_COMMAND(ID_TRAYEXIT, OnTrayExit)
	ON_COMMAND(ID_SHOWFIDELIO, OnShowAutoNetFdl)
	ON_CBN_SELCHANGE(IDC_DOORTYPE_COMBO, OnSelchangeDoortypeCombo)
	ON_CBN_SELCHANGE(IDC_PORT_COMBO, OnSelchangePortCombo)
	ON_EN_KILLFOCUS(IDC_SERVPORT_EDIT, OnKillfocusServportEdit)
	ON_COMMAND(ID_HELP, OnHelp)
	ON_BN_CLICKED(IDC_OS_CHECK2, OnOsCheck2)
	//}}AFX_MSG_MAP
	ON_WM_SYSCOMMAND( )
	ON_MESSAGE (WM_USER_THREAD, OnThreadExcute)

END_MESSAGE_MAP()

BOOL CFrmMain::OnInitDialog() 
{
	CDialog::OnInitDialog();
	//初始化控件信息
	InitControl();
	//初始化托盘图标程序功能
	InitTrayIcon();
	//初始化变量和参数设置
	InitParameter();
	//得到本机的IP地址
	GetHostIPAddress();
	//系统初始化设置
	InitFidelioSkin();
	
	return TRUE; 
}

//读卡器端口信息
static const char *ComboxPort[5] = { 
	"COM1",
	"COM2",
	"COM3",
	"COM4",
	"USB"
};

//门锁类型信息
static const char *ComboxDoorType[5] = { 
	"TM",
	"IC",
	"RF56",
	"RF57",
	"RF50"
};

//门锁类型信息
static const char *ComboxDoorTypeEn[5] = { 
	"TM Card Door Lock",
	"IC Card Door Lock",
	"RF56 Card Door Lock",
	"RF57 Card Door Lock",
	"RF50 Card Door Lock"
};

//初始对话框中控件信息
void CFrmMain::InitControl()
{
	char     szCaption[200];
	CString  ExtractFilePath = g_DefaultLangDir+"FrmMain.INI";
	m_InfoFilePath = g_DefaultLangDir+"AutoFdl.ini";
	
	//初始化多国语言界面部分
	if (g_IsFindLangDir)
	{
		GetPrivateProfileString ("Frm","FrmMain", NULL, szCaption, 200, ExtractFilePath);
		this->SetWindowText(szCaption);
		
		GetPrivateProfileString ("LAB","LabFdlProt", NULL, szCaption, 200, ExtractFilePath);
		((CStatic*)GetDlgItem(IDC_ADDR_STATIC))->SetWindowText(szCaption);
		GetPrivateProfileString ("LAB","LabReadProt", NULL, szCaption, 200, ExtractFilePath);
		((CStatic*)GetDlgItem(IDC_PORT_STATIC))->SetWindowText(szCaption);
		GetPrivateProfileString ("LAB","LabDoorType", NULL, szCaption, 200, ExtractFilePath);
		((CStatic*)GetDlgItem(IDC_DOORTYPE_STATIC))->SetWindowText(szCaption);
		GetPrivateProfileString ("LAB","LabFdlKc", NULL, szCaption, 200, ExtractFilePath);
		((CStatic*)GetDlgItem(IDC_FDLKC_STATIC))->SetWindowText(szCaption);
		GetPrivateProfileString ("LAB","LabServerPort", NULL, szCaption, 200, ExtractFilePath);
		((CStatic*)GetDlgItem(IDC_SERVPORT_STATIC))->SetWindowText(szCaption);
		GetPrivateProfileString ("LAB","LabRem", NULL, szCaption, 200, ExtractFilePath);
		((CStatic*)GetDlgItem(IDC_LABREM_STATIC))->SetWindowText(szCaption);
		GetPrivateProfileString ("LAB","LabInf0", NULL, szCaption, 200, ExtractFilePath);
		((CStatic*)GetDlgItem(IDC_LABINF0_STATIC))->SetWindowText(szCaption);
		GetPrivateProfileString ("LAB","LabInf1", NULL, szCaption, 200, ExtractFilePath);
		((CStatic*)GetDlgItem(IDC_LABINF1_STATIC))->SetWindowText(szCaption);
		GetPrivateProfileString ("LAB","LabInf2", NULL, szCaption, 200, ExtractFilePath);
		((CStatic*)GetDlgItem(IDC_LABINF2_STATIC))->SetWindowText(szCaption);
		
		GetPrivateProfileString ("BUT","ButOk", NULL, szCaption, 200, ExtractFilePath);
		((CButton*)GetDlgItem(IDC_0K))->SetWindowText(szCaption);
		GetPrivateProfileString ("BUT","ButStop", NULL, szCaption, 200, ExtractFilePath);
		((CButton*)GetDlgItem(IDC_STOP))->SetWindowText(szCaption);
		GetPrivateProfileString ("BUT","ButRestart", NULL, szCaption, 200, ExtractFilePath);
		((CButton*)GetDlgItem(IDC_LINKAGAIN))->SetWindowText(szCaption);
		GetPrivateProfileString ("Chk","ChkOs", NULL, szCaption, 200, ExtractFilePath);
		((CButton*)GetDlgItem(IDC_OS_CHECK))->SetWindowText(szCaption);	
	}
	
	//初始化与多国语言无关的部分界面
	for (int i = 0 ; i < 5 ; ++i ) 
	{   
		((CComboBox *) GetDlgItem (IDC_PORT_COMBO))->AddString((LPCSTR) ComboxPort[i]);
		((CComboBox *) GetDlgItem (IDC_DOORTYPE_COMBO))->AddString((LPCSTR) ComboxDoorType[i]);
	}
	
	for (i=1;i<=80;i++)
	{
		CString str;
		str.Format("%d",i);
		((CComboBox *) GetDlgItem (IDC_FDLKC_COMBO))->AddString(str);
	}
	
	//取得应用程序当前路径
	char  appPath[MAX_PATH];
	GetModuleFileName(NULL,appPath,MAX_PATH);
	ConfigureFile.Format("%s",appPath);
	int pos=ConfigureFile.ReverseFind('\\');
	ConfigureFile=ConfigureFile.Left(pos);
	ConfigureFile+="\\zhao.dll";

	//读取门锁类型
	DoorType=GetPrivateProfileInt("IsIni","DoorType",1,ConfigureFile);
	//读取发卡机端口
	Port=GetPrivateProfileInt("IsIni","Port",5,ConfigureFile);
	//读取FKC参数值
	FKC=GetPrivateProfileInt("IsIni","FKC",1,ConfigureFile);
	//读取Fidelio服务器IP地址
	GetPrivateProfileString ("IsIni","FidelioIP", "168.192.0.1", szCaption, 200, ConfigureFile);
	m_FidelioIP.Format("%s",szCaption);
	IPStrToByteArry(m_FidelioIP);
	//读取Fidelio服务器端口
	m_ServPort = GetPrivateProfileInt("IsIni","FidelioPort",5000,ConfigureFile);

	((CIPAddressCtrl *)GetDlgItem(IDC_ADDR_COMBO))->SetAddress(m_nField[0],m_nField[1],m_nField[2],m_nField[3]);
	((CComboBox *)GetDlgItem(IDC_PORT_COMBO))->SetCurSel(Port-1);
	((CComboBox *)GetDlgItem(IDC_DOORTYPE_COMBO))->SetCurSel(DoorType-1);
	((CComboBox *)GetDlgItem(IDC_FDLKC_COMBO))->SetCurSel(FKC-1);
	
	CString KeyName = "StrAcc";
	CString szDoorType;
	szDoorType.Format("%d",DoorType);
	KeyName=KeyName+szDoorType;
	//读取StrAcc初始化参数
	GetPrivateProfileString ("IsIni",KeyName, NULL, szCaption, 200, ConfigureFile);
	StrAcc.Format("%s",szCaption);
	UpdateData(FALSE);
}

void   CFrmMain::InitTrayIcon()
{
	CRect rc;
	m_wndEdit.Create(
		WS_VISIBLE|WS_CHILD|WS_VSCROLL|ES_MULTILINE|ES_READONLY, rc, this, 
		AFX_IDW_PANE_FIRST);
	//安装托盘图标
	m_trayIcon.SetNotificationWnd(this, WM_MY_TRAY_NOTIFICATION);
	m_trayIcon.SetIcon(IDI_ICON1);
}

void   CFrmMain::InitParameter()
{
	IsEdit=false;
	IsLink=false;
	IsStop=false;
	IsResm=false;
	m_IsSecondLS=false;
	m_pThread=NULL;
	//打开注册表
	if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",NULL,KEY_ALL_ACCESS,&m_hKey)!=ERROR_SUCCESS)
	{
		AfxMessageBox(Translate(m_InfoFilePath,"打开注册表项失败!"),MB_OK|MB_ICONINFORMATION);
		return;	 
	}
	char  cData[BUFSIZE];
	DWORD dwBufSize = BUFSIZE;
	DWORD dwRegType=REG_SZ;

	//取得应用程序当前路径
	char  appPath[MAX_PATH];
	GetModuleFileName(NULL,appPath,MAX_PATH);
	m_RegistPath.Format("%s",appPath);

	RegQueryValueEx(m_hKey,"HsyFdLServer",NULL,&dwRegType,(LPBYTE)cData,&dwBufSize);
	if (strcmp(cData,m_RegistPath))
	{
		((CButton *)GetDlgItem(IDC_OS_CHECK))->SetCheck(0);
	}
	else
	{
		((CButton *)GetDlgItem(IDC_OS_CHECK))->SetCheck(1);
	}
	RegCloseKey(m_hKey);
}

//将字符转化为十六进制短整数
short CFrmMain::ChToShort(const char &ch)
{
	if(ch>='0' && ch<='9')
		return (short)(ch-'0');    
	else if(ch>='a' && ch<='z')
		return (short)(ch-'a'+10);
	else if(ch>='A'&&ch<='Z')
		return (short)(ch-'A'+10);
	else
		return 0;
}

void CFrmMain::InitFidelioSkin()
{	
	short int buf[8]={0,0,0,0,0,0,0,0};

	//设置当前门锁类型
	typedef short  (__stdcall *pSelectDoorLockType)(short);
	pSelectDoorLockType pFuncSelectDoorLockType= (pSelectDoorLockType)GetProcAddress (hInstCard,"SelectDoorLockType");
	m_StValue=pFuncSelectDoorLockType(DoorType); //设置当前门锁类型
	if(m_StValue!=1)
	{
		CheckError(m_StValue);
		return;
	}
	
	//打开端口
	typedef short  (__stdcall *pMakeCardOpenPort)(short);
	pMakeCardOpenPort pFuncMakeCardOpenPort= (pMakeCardOpenPort)GetProcAddress (hInstCard,"MakeCardOpenPort");
	m_StValue = pFuncMakeCardOpenPort(Port);//打开端口
	if(m_StValue!=1)
	{
		CheckError(m_StValue);
		return;
	}

	//将十六位十六进制数转化为8个整数存入buf中
	short tmp;
	for(int i=0;i<8;i++)
	{
		tmp=ChToShort(StrAcc[2*i]);
		tmp <<= 4;
		tmp |= ChToShort(StrAcc[2*i+1]);	 
		buf[i]=tmp;
	}

	//设置客户参数
	typedef short  (__stdcall *pSystemInitialization_EX)(short *);
	pSystemInitialization_EX pFuncSystemInitialization_EX= (pSystemInitialization_EX)GetProcAddress (hInstCard,"SystemInitialization_EX");
	m_StValue = pFuncSystemInitialization_EX(buf); //设置客户参数
	if(m_StValue!=1)
	{
		CheckError(m_StValue);
		return;
	}	
		
	//打开网络端口,连接网络
	SetUpConnect();
}

void CFrmMain::OnOk() 
{
	//最小化窗口以托盘图标形式显示
	ShowWindow(SW_HIDE);
	//如果参数修改则暂定线程,关闭端口重新打开	
	UpdateData(TRUE);
	CString Str;
	//重新更新FKC的值
	FKC=((CComboBox*)GetDlgItem (IDC_FDLKC_COMBO))->GetCurSel()+1;
	Str.Format("%d",FKC);
	WritePrivateProfileString("IsIni","FKC",Str,ConfigureFile);
	IsIPAddressChanged();//判断服务器IP地址改变了没有

	if(IsEdit)//参数修改了
    {
		//重新恢复系统设置状态为未改变状态
		IsEdit=false;
		//关闭端口
		typedef short  (__stdcall *pMakeCardClosePort)(short);
		pMakeCardClosePort pFuncMakeCardClosePort= (pMakeCardClosePort)GetProcAddress (hInstCard,"MakeCardClosePort");
		pFuncMakeCardClosePort(Port);

		//给服务器发送结束命令
		CStop();
		//断开连接,关闭线程
		DisConnect();

		//重新更新各参数的值
		((CIPAddressCtrl *)GetDlgItem(IDC_ADDR_COMBO))->GetAddress(m_nField[0],m_nField[1],m_nField[2],m_nField[3]);
		Port=((CComboBox*)GetDlgItem (IDC_PORT_COMBO))->GetCurSel()+1;
		DoorType=((CComboBox*)GetDlgItem (IDC_DOORTYPE_COMBO))->GetCurSel()+1;
		
		//将新得到的值写入配置文件中
		Str.Format("%d",Port);
		WritePrivateProfileString("IsIni","Port",Str,ConfigureFile);
		m_FidelioIP=ByteArryToIPStr(m_nField);
		WritePrivateProfileString("IsIni","FidelioIP",m_FidelioIP,ConfigureFile);
		Str.Format("%d",m_ServPort);
		WritePrivateProfileString("IsIni","FidelioPort",Str,ConfigureFile);
		Str.Format("%d",DoorType);
		WritePrivateProfileString("IsIni","DoorType",Str,ConfigureFile);
		
		//重新启动Fidelio程序
		InitFidelioSkin();
	 }
}

void CFrmMain::CheckError(int StValue)//出错检查 
{
	//检查出错代码
    switch(StValue)
	{
	case -1:
		MessageBox(Translate(m_InfoFilePath,"对不起,没有检测到卡!"),
				   Translate(m_InfoFilePath,"提示信息!"),MB_ICONASTERISK);
		break;
		
	case -2:
		MessageBox(Translate(m_InfoFilePath,"对不起,没有检测到发卡机!"),
				   Translate(m_InfoFilePath,"提示信息!"),MB_ICONASTERISK);
		break;
		
	case -3:
		MessageBox(Translate(m_InfoFilePath,"对不起,此卡为无效卡!"),
				   Translate(m_InfoFilePath,"提示信息!"),MB_ICONASTERISK); 
		break;
		
	case -4:
		MessageBox(Translate(m_InfoFilePath,"对不起,卡类型不符!"),
				   Translate(m_InfoFilePath,"提示信息!"),MB_ICONASTERISK);

⌨️ 快捷键说明

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