如何使用户能够重新输入(或)重用 MFC 中的相同对话框
How to enable user to re-entry(or) reuse the same dialog in MFC
我目前正在使用 MFC FTP 下载。是一个非常简单的程序,它从用户那里获取 2 个输入并单击下载按钮以便从服务器下载。一切都很好,我可以从中下载它。但我意识到这个程序只能执行一次。成功或失败的用户必须再次打开 .exe 以下载另一个文件。我是 C&C++ 的初学者,知识简单,我将 OnInitDialog() 放在下载函数的最后一行,它会循环返回并再次初始化。当然不行。以下是我当前的下载按钮代码
BOOL CFTPDOWNLOADDlg::Log_In(char* path, char* ID, char* password {
m_pFtpConnection = NULL;
try{
// path
// ID
// password
m_pFtpConnection = m_Session.GetFtpConnection(path,
ID,password,INTERNET_INVALID_PORT_NUMBER);
}
catch(CInternetException *pEx){
pEx->ReportError(MB_ICONEXCLAMATION);
m_pFtpConnection = NULL;
pEx->Delete();
return FALSE;
}
return TRUE;
}
BOOL CFTPDOWNLOADDlg::Download(){
m_Edit3.SetWindowText("Downloading..");
m_Session.EnableStatusCallback(TRUE);
if(m_pFtpConnection->GetFile(serv_Loc,host_Loc,
FALSE,FILE_ATTRIBUTE_NORMAL,FTP_TRANSFER_TYPE_BINARY,1) != 0){
MessageBox("Download Complete");
m_Edit3.SetWindowText("");}
else{
MessageBox("Download Fail");
return FALSE;
}
// Log_out Session
m_Session.Close();
m_pFtpConnection->Close();
if(m_pFtpConnection!=NULL) delete m_pFtpConnection;
else MessageBox("Download Complete");
return TRUE;
}
BOOL CFTPDOWNLOADDlg::get_Path(){
...
...
...
sprintf(serv_Loc,"soft\%s\%d\%s.zip",s_No,r_Number,r_No);
sprintf(host_Loc,"%s\%s.zip",buff2,r_No);
return TRUE;
}
void CFTPDOWNLOADDlg::OnCancel() {
// Log_out Session
m_Session.Close();
m_pFtpConnection->Close();
if(m_pFtpConnection!=NULL)
delete m_pFtpConnection;
CDialog::OnCancel();
}
void CFTPDOWNLOADDlg::OnDLButton() {
//get path from user input
get_Path();
// start download
Download();
}
我尝试在线搜索,但找不到任何相近的东西。抱歉我的解释不当。
提前感谢您的回复
这是您需要做的:
- 您应该让
CInternetSession m_Session;
成为您 CWinApp
派生的 class 的成员。
- 您应该在
CWinApp
派生的 class 的 ExitInstance()
方法中调用 m_Session.Close()
。
- 在您的
CDialog
派生的 class 中,您应该只处理 CFtpConnection
相关的东西。因此,当用户单击 下载 按钮时,您应该调用 GetFtpConnection()
并初始化您的 m_pFtpConnection
并完成剩下的工作。 download/upload 完成后调用 m_pFtpConnection->Close();
和 delete m_pFtpConnection;
- 请同时使用
CString
而不是 char*
。有很多好处,例如自动支持 UNICODE 等。
- 也请考虑使用
CString::Format()
方法代替 sprintf()
。
您还应该考虑使用线程在单独的工作线程中执行 upload/download 任务。使用 AfxBeginThread()
启动线程。这样您就不会影响作为主应用程序 (GUI) 线程一部分的 Windows 消息泵。因此,当您 uploading/downloading 文件时,您的 GUI 不会锁定。
我目前正在使用 MFC FTP 下载。是一个非常简单的程序,它从用户那里获取 2 个输入并单击下载按钮以便从服务器下载。一切都很好,我可以从中下载它。但我意识到这个程序只能执行一次。成功或失败的用户必须再次打开 .exe 以下载另一个文件。我是 C&C++ 的初学者,知识简单,我将 OnInitDialog() 放在下载函数的最后一行,它会循环返回并再次初始化。当然不行。以下是我当前的下载按钮代码
BOOL CFTPDOWNLOADDlg::Log_In(char* path, char* ID, char* password {
m_pFtpConnection = NULL;
try{
// path
// ID
// password
m_pFtpConnection = m_Session.GetFtpConnection(path,
ID,password,INTERNET_INVALID_PORT_NUMBER);
}
catch(CInternetException *pEx){
pEx->ReportError(MB_ICONEXCLAMATION);
m_pFtpConnection = NULL;
pEx->Delete();
return FALSE;
}
return TRUE;
}
BOOL CFTPDOWNLOADDlg::Download(){
m_Edit3.SetWindowText("Downloading..");
m_Session.EnableStatusCallback(TRUE);
if(m_pFtpConnection->GetFile(serv_Loc,host_Loc,
FALSE,FILE_ATTRIBUTE_NORMAL,FTP_TRANSFER_TYPE_BINARY,1) != 0){
MessageBox("Download Complete");
m_Edit3.SetWindowText("");}
else{
MessageBox("Download Fail");
return FALSE;
}
// Log_out Session
m_Session.Close();
m_pFtpConnection->Close();
if(m_pFtpConnection!=NULL) delete m_pFtpConnection;
else MessageBox("Download Complete");
return TRUE;
}
BOOL CFTPDOWNLOADDlg::get_Path(){
...
...
...
sprintf(serv_Loc,"soft\%s\%d\%s.zip",s_No,r_Number,r_No);
sprintf(host_Loc,"%s\%s.zip",buff2,r_No);
return TRUE;
}
void CFTPDOWNLOADDlg::OnCancel() {
// Log_out Session
m_Session.Close();
m_pFtpConnection->Close();
if(m_pFtpConnection!=NULL)
delete m_pFtpConnection;
CDialog::OnCancel();
}
void CFTPDOWNLOADDlg::OnDLButton() {
//get path from user input
get_Path();
// start download
Download();
}
我尝试在线搜索,但找不到任何相近的东西。抱歉我的解释不当。
提前感谢您的回复
这是您需要做的:
- 您应该让
CInternetSession m_Session;
成为您CWinApp
派生的 class 的成员。 - 您应该在
CWinApp
派生的 class 的ExitInstance()
方法中调用m_Session.Close()
。 - 在您的
CDialog
派生的 class 中,您应该只处理CFtpConnection
相关的东西。因此,当用户单击 下载 按钮时,您应该调用GetFtpConnection()
并初始化您的m_pFtpConnection
并完成剩下的工作。 download/upload 完成后调用m_pFtpConnection->Close();
和delete m_pFtpConnection;
- 请同时使用
CString
而不是char*
。有很多好处,例如自动支持 UNICODE 等。 - 也请考虑使用
CString::Format()
方法代替sprintf()
。
您还应该考虑使用线程在单独的工作线程中执行 upload/download 任务。使用 AfxBeginThread()
启动线程。这样您就不会影响作为主应用程序 (GUI) 线程一部分的 Windows 消息泵。因此,当您 uploading/downloading 文件时,您的 GUI 不会锁定。