如何使用户能够在MFC中重新输入(或)重用相同的对话框

时间:2015-06-08 05:45:53

标签: visual-c++ mfc dialog

我目前正在使用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();
}

我试图在网上搜索,我找不到任何接近的东西。对不起,我的解释很糟糕。

提前感谢您的回复

1 个答案:

答案 0 :(得分:0)

以下是您需要做的事情:

  1. 您应该CInternetSession m_Session;成为CWinApp派生类的成员。
  2. 您应该在m_Session.Close()派生类的ExitInstance()方法中调用CWinApp
  3. CDialog派生的课程中,您只应处理CFtpConnection相关内容。因此,当用户点击下载按钮时,您应该致电GetFtpConnection()并初始化m_pFtpConnection并完成剩下的工作。下载/上传完成后,请致电m_pFtpConnection->Close();delete m_pFtpConnection;
  4. 请同时使用CString代替char*。有很多好处,比如自动UNICODE支持等。
  5. 另请考虑使用CString::Format()方法代替sprintf()
  6. 您还应该考虑使用线程在单独的工作线程中执行上载/下载任务。使用AfxBeginThread()启动该线程。这样,您不会影响作为主应用程序(GUI)线程一部分的Windows消息泵。因此,在上传/下载文件时,您的GUI不会锁定。