整合更清洁代码的功能?

Jon*_*Jon 4 c++ parameters mfc function visual-c++

不要被长度关闭......我不认为问题太难了.

语言: C++

开发环境: Microsoft Visual C++

使用的库: MFC

问题:我正在创建一个包含多个"页面"的大型首选项对话框.其中许多要求用户指定文件路径.现在,用户将单击该按钮,它将跳转到OnCommand().这将验证该命令是否来自一个按钮,然后跳转到Browse()函数,在该函数中它将确定按下了哪个按钮.最后,它将调用FileDialog(),它将启动文件选择器,然后返回文件路径,将其分配给正确的变量,并将其附加到正确的编辑控件.

我试图将所有这些"打开文件"按钮合并到一个类或函数中,但我不确定最好的方法来处理它.我希望它是干净的,这样我就不必为它提供特定的ID(2001,2002,...).

现在,这三个函数(下面)都在我的每个文件中...这很麻烦且不必要.我希望有一个名为OpenFile.cpp的文件或包含处理打开文件所需函数的文件,并将所选路径附加到正确对话框中的正确文本框中.

BOOL FSC_3DPersp::OnCommand(WPARAM wParam, LPARAM lParam)
{
  if (HIWORD(wParam) == BN_CLICKED)
  {
    Browse(LOWORD(wParam));
    return TRUE;
  }
return CWnd::OnCommand(wParam, lParam);
}
Run Code Online (Sandbox Code Playgroud)

//

CString OpenFile::FileDialog(CWnd* wnd, int uiID) // dialog from which the call came and the ID of the edit control where the path is going
{
  CFileDialog dlg(
      TRUE // Open = TRUE, Save = FALSE
    , NULL //filename extension
    , "" // initial filename
    , OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST // flags
    , "" // filter
    , wnd // parent window
  ); 

  if (dlg.DoModal() == IDOK)
  {
    CEdit *Display;
    CString path = dlg.GetPathName();
    Display = reinterpret_cast<CEdit *>(GetDlgItem(uiID));
    Display->SetWindowText((LPCTSTR)path);
    return path;
  }
}
Run Code Online (Sandbox Code Playgroud)

//

void FSC_3DPersp::Browse(UINT uiID)
{
 switch(uiID)
 {
 case IDC_BUTTON1: 
    m_strPersTexture = FileDialog(this, 2004);
    break;
 case IDC_BUTTON2:
    m_strSkyFront = FileDialog(this, 2005);
    break;
 case IDC_BUTTON3:
    m_strSkyRight = FileDialog(this, 2006);
    break;
 case IDC_BUTTON4:
    m_strSkyBack = FileDialog(this, 2007);
    break;
 case IDC_BUTTON5:
    m_strSkyTop = FileDialog(this, 2008);
    break;
 case IDC_BUTTON6:
    m_strSkyLeft = FileDialog(this, 2009);
    break;
 case IDC_BUTTON7:
    m_strSkyBottom = FileDialog(this, 2010);
    break;
 }
}
Run Code Online (Sandbox Code Playgroud)

头文件定义:

afx_msg CString FileDialog(CWnd* wnd, int uiID);
afx_msg void Browse(UINT uiID);
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
Run Code Online (Sandbox Code Playgroud)

那么如何调整参数以将所有三个参数放入一个文件中,我将如何引用它们?如果我这样做,我觉得我需要在OnCommand()函数中添加一个额外的参数,但我认为我不能这样做.

提前感谢您的帮助!

〜乔恩

Mik*_*Mik 7

如何使用CMFCEditBrowseCtrlCOXBrowseFileEdit(或其他类似的类)而不是正常的编辑控件?
这些类创建带有"浏览"按钮的编辑框,单击该按钮时,将自动打开文件选择对话框并将所选文件设置为编辑控件文本.