📄 maindlg.cpp
字号:
// MainDlg.cpp : implementation file
//
#include "stdafx.h"
#include "文件升级.h"
#include "MainDlg.h"
#include "MessageEdit.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "DataOperator.h"
CDataOperator gDataOperator;
CEdit m_SuccRatioEditCtrl;
CMessageEdit m_MsgEdit;
#define SaveDataFile "\\FileUpgrade.dat"
void ReadSaveDataFile(CString &cs)
{
char buf[2048]={0};
GetWindowsDirectory(buf,1024);
strcat(buf,SaveDataFile);
FILE *fp;
fp=fopen(buf,"rb");
if(fp)
{
fread(buf,2048,1,fp);
fclose(fp);
cs=buf;
}
else cs="";
}
void WriteSaveDataFile(const char *str)
{
FILE *fp;
char buf[1024]={0};
GetWindowsDirectory(buf,1024);
strcat(buf,SaveDataFile);
fp=fopen(buf,"wb");
if(fp)
{
fwrite(str,strlen(str),1,fp);
fclose(fp);
}
}
/////////////////////////////////////////////////////////////////////////////
// CMainDlg dialog
CMainDlg::CMainDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMainDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMainDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
}
void CMainDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMainDlg)
DDX_Control(pDX, IDC_FileNameEDIT, m_FileNameEditCtrl);
DDX_Control(pDX, IDC_SuccRatioEDIT, m_SuccRatioEditCtrl);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMainDlg, CDialog)
//{{AFX_MSG_MAP(CMainDlg)
ON_CBN_SELCHANGE(IDC_BaudRatioComboBox, OnSelchangeBaudRatioComboBox)
ON_CBN_SELCHANGE(IDC_CommPortNo, OnSelchangeCommPortNo)
ON_BN_CLICKED(IDC_Exit, OnExit)
ON_BN_CLICKED(IDC_BeginSendFile, OnBeginSendFile)
ON_BN_CLICKED(IDC_StopBUTTON, OnStopBUTTON)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_WorkModelCHECK, OnWorkModelCHECK)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMainDlg message handlers
BOOL CMainDlg::OnInitDialog()
{
extern void OpenTimerTick(CWnd *ptrWnd);
CDialog::OnInitDialog();
OpenTimerTick(this);
//编辑框
m_MsgEdit.SubclassDlgItem(IDC_MsgEDIT,this);
m_UprComputerNoEditCtrl.SubclassDlgItem(IDC_ComputerNoEDIT,this,DECINT_TYPE);
m_UprComputerNoEditCtrl.LimitText(10);
CMenu *pMenu = AfxGetMainWnd()->GetSystemMenu(FALSE) ;
if (pMenu)
{
pMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND|MF_GRAYED) ;
pMenu->EnableMenuItem(SC_MINIMIZE, MF_BYCOMMAND|MF_GRAYED) ;
pMenu->EnableMenuItem(SC_MAXIMIZE, MF_BYCOMMAND|MF_GRAYED) ;
}
CenterWindow();
((CComboBox*)GetDlgItem(IDC_BaudRatioComboBox))->SetCurSel(6);
//端口
if(gDataOperator.sio_open(1,GetBaudRate()))
((CComboBox*)GetDlgItem(IDC_CommPortNo))->SetCurSel(-1);
else
((CComboBox*)GetDlgItem(IDC_CommPortNo))->SetCurSel(0);
((CComboBox*)GetDlgItem(IDC_ConnectModelCOMBO))->SetCurSel(1);//0=主动 1=被动连接
((CComboBox*)GetDlgItem(IDC_PackageSizeCOMBO))->SetCurSel(1);
((CComboBox*)GetDlgItem(IDC_IntervalTimeCOMBO))->SetCurSel(1);
m_FileNameEditCtrl.SetLimitText(1024);
OnWorkModelCHECK();
// m_FileNameEditCtrl.SetWindowText("c:\\1.exe,ww1.ini\r\nc:\\2.exe,ww2.ini");
CString cs;
ReadSaveDataFile(cs);
m_FileNameEditCtrl.SetWindowText(cs);
return TRUE;
}
long int CMainDlg::GetBaudRate()
{
return GetDlgItemInt(IDC_BaudRatioComboBox);
}
void CMainDlg::OnSelchangeBaudRatioComboBox()
{
gDataOperator.sio_baud((unsigned short )GetBaudRate());
}
void CMainDlg::OnSelchangeCommPortNo()
{
short int NewPort=((CComboBox*)GetDlgItem(IDC_CommPortNo))->GetCurSel()+1;
if(gDataOperator.sio_open(NewPort,GetBaudRate()))
{
CString cs;
cs.Format("不能打开串口Com%d\n串口Com%d已经被使用或不存在",NewPort,NewPort);
MessageBox(cs,"错误",MB_OK|MB_ICONEXCLAMATION);
((CComboBox*)GetDlgItem(IDC_CommPortNo))->SetCurSel(-1);
}
}
void CMainDlg::OnExit()
{
extern void KillTimerTick();
KillTimerTick();
CDialog::OnOK();
}
UINT ID[]={IDC_Exit,IDC_BeginSendFile,IDC_CommPortNo,IDC_BaudRatioComboBox,IDC_PackageSizeCOMBO,IDC_IntervalTimeCOMBO,IDC_ConnectModelCOMBO,IDC_WorkModelCHECK};
void CMainDlg::UpgradeEnd()
{
int t=sizeof(ID)/sizeof(UINT);
while(t)
{
GetDlgItem(ID[t-1])->EnableWindow(1);
t--;
}
GetDlgItem(IDC_StopBUTTON)->EnableWindow(0);
OnWorkModelCHECK();
}
void CMainDlg::UpgradeStart()
{
int t=sizeof(ID)/sizeof(UINT);
while(t)
{
GetDlgItem(ID[t-1])->EnableWindow(0);
t--;
}
GetDlgItem(IDC_StopBUTTON)->EnableWindow(1);
}
UINT CMainDlg::SendFileThreadProc( LPVOID pParam )
{
((CMainDlg*)pParam)->UpgradeStart();
gDataOperator.Start();
((CMainDlg*)pParam)->UpgradeEnd();
return 0;
}
void CMainDlg::OnBeginSendFile()
{
//检测传输文件的合法性。
if(GetTransferFileName()) return;
short int CurSel;
CurSel=((CComboBox*)GetDlgItem(IDC_ConnectModelCOMBO))->GetCurSel();//0=主动,1=被动
gDataOperator.SetConnectModel(CurSel);
CurSel=((CComboBox*)GetDlgItem(IDC_PackageSizeCOMBO))->GetCurSel();
if(CurSel==0) gDataOperator.SetPackageSize(512);
else gDataOperator.SetPackageSize(CurSel*1024);
CurSel=((CComboBox*)GetDlgItem(IDC_IntervalTimeCOMBO))->GetCurSel();
gDataOperator.SetSendIntervalSecond(CurSel+1);
CurSel=((CButton*)GetDlgItem(IDC_WorkModelCHECK))->GetCheck();//1=交互式传输。
gDataOperator.SetWorkModel(CurSel);
gDataOperator.mExitSystemMark=0;
gDataOperator.SetObjComputerNo(m_UprComputerNoEditCtrl.GetLongValue());
CString cs;
m_FileNameEditCtrl.GetWindowText(cs);
WriteSaveDataFile(cs);
m_SendThread=AfxBeginThread(SendFileThreadProc,this);
}
void CMainDlg::OnStopBUTTON()
{
gDataOperator.mExitSystemMark=1;
}
void CMainDlg::OnButton1()
{
m_MsgEdit.SetWindowText("");
}
int CMainDlg::GetTransferFileName()//1=不合理,无法升级
{
char *DOS_ERROR_Msg="有错误,目标文件名不符合DOS命名规则";
CString cs;
CFileStatus rStatus;
char *ptrMsg;
char src[128],obj[128];
char buf[256],*ptr,*ptrObj;
int index,LineCount=m_FileNameEditCtrl.GetLineCount( );
int Len;
unsigned char SendFileCount=0;
int k;
m_MsgEdit.EditPrintf("\r\n............分析传输的文件名.........");
for(index=0;index<LineCount;index++)
{
Len=m_FileNameEditCtrl.GetLine(index,buf,256);
buf[Len]=0;
if(Len==0) continue;
//有并只能有一个逗号。分解源文件和目标文件。
ptr=buf;
while(isspace(*ptr)) ptr++;
if(*ptr==0) continue;
ptrObj=src;
for(;*ptr && *ptr!=',';ptr++,ptrObj++) *ptrObj=*ptr;
*ptrObj=0;
if(*ptr==0)
{
ptrMsg="有错误。";
goto Error_END;
}
ptr++;while(isspace(*ptr)) ptr++;
ptrObj=obj;
for(;*ptr && *ptr!=',';ptr++,ptrObj++)*ptrObj=*ptr;
*ptrObj=0;
//删除尾部空格
ptrObj=obj;
if(*ptrObj)
{
while(*ptrObj) ptrObj++;
ptrObj--;
while(isspace(*ptrObj)){*ptrObj=0;ptrObj--;}
}
//检测源文件合法性.
if(!CFile::GetStatus(src,rStatus))
{
ptrMsg="有错误,源文件不存在";
goto Error_END;
}
//检验目标文件合法性。
short NameLen;
short HaveDotMark=0;
ptrObj=obj;
if(*ptrObj!='\\' && isalpha(*ptrObj)==0 && *ptrObj!='_')//开头必须为字母
{
ptrMsg=DOS_ERROR_Msg;
goto Error_END;
}
NameLen=9;
for(;*ptrObj;ptrObj++)
{
if(*ptrObj=='\\')
{
if(isalnum(*(ptrObj+1))==0){ptrMsg=DOS_ERROR_Msg;goto Error_END;}
NameLen=9;
}
else if(*ptrObj=='.')
{
if(HaveDotMark || isalnum(*(ptrObj+1))==0){ptrMsg=DOS_ERROR_Msg;goto Error_END;}
NameLen=4;
HaveDotMark=1;
}
else if(isalnum(*ptrObj)==0 && *ptrObj!='_')
{
ptrMsg=DOS_ERROR_Msg;
goto Error_END;
}
else NameLen--;
if(NameLen==0){ptrMsg=DOS_ERROR_Msg;goto Error_END;}
}
m_MsgEdit.EditPrintf("\r\n源文件:%s 目标:%s",src,obj);
for(k=0;k<SendFileCount;k++)
{
if(gDataOperator.mDowloadFileMsg.Name[k].srcName==src)
{
MessageBox("有两个源文件相同,请重新设置!!");
return 1;
}
else if(gDataOperator.mDowloadFileMsg.Name[k].objName==obj)
{
MessageBox("有两个目标文件相同,请重新设置!!");
return 1;
}
}
gDataOperator.mDowloadFileMsg.Name[SendFileCount].srcName=src;
gDataOperator.mDowloadFileMsg.Name[SendFileCount].objName=obj;
SendFileCount++;
}
//检测文件名。
gDataOperator.mDowloadFileMsg.Count=SendFileCount;
cs.Format("下载%u个文件,下载的文件名和目标:",SendFileCount);
for(k=0;k<SendFileCount;k++)
{
cs+="\r\n源文件:";
cs+=gDataOperator.mDowloadFileMsg.Name[k].srcName;
cs+="-->目标文件:";
cs+=gDataOperator.mDowloadFileMsg.Name[k].objName;
}
if(MessageBox(cs,"请确定",MB_OKCANCEL|MB_ICONWARNING)==IDOK && SendFileCount>0) return 0;
return 1;
Error_END:
cs.Format("%d行\n%s\n%s",index+1,buf,ptrMsg);
MessageBox(cs);
return 1;
}
void CMainDlg::OnWorkModelCHECK()
{
int cursel=((CButton*)GetDlgItem(IDC_WorkModelCHECK))->GetCheck();
GetDlgItem(IDC_IntervalTimeCOMBO)->EnableWindow(!cursel);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -