📄 frmmain.cpp
字号:
// 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 + -