Объединение функций для более чистого кода? - PullRequest
4 голосов
/ 14 июня 2011

Не отключайтесь по длине ... Не думаю, что это слишком сложная проблема.

Язык: C ++

Среда разработки: Microsoft Visual C ++

Используемые библиотеки: MFC

Проблема: Я создаю большой диалог настроек с несколькими "страницы».Многие из них требуют от пользователя указать путь к файлу.Прямо сейчас пользователь нажмет на кнопку, и он перейдет к OnCommand ().Это проверит, что команда была от кнопки, затем перейдите к функции Browse (), где она выяснит, какая кнопка была нажата.Наконец, он вызовет FileDialog (), который запустит средство выбора файлов, затем вернет путь к файлу, назначит его правильной переменной и добавит его к правильному элементу управления редактирования.

Я пытаюсь объединить всеэти кнопки «открыть файл» в один класс или функцию, но я не уверен, что лучший способ приблизиться к этому.Я бы хотел, чтобы он был чистым, чтобы мне не приходилось указывать в нем конкретные идентификаторы (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);
}

//

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;
  }
}

//

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;
 }
}

Определения файла заголовка:

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

Так как я могу настроить параметры, чтобы поместить все три из них в один файл, и как бы я сослался на них?Если я это сделал, я чувствую, что мне нужно добавить дополнительный параметр в функцию OnCommand (), но я не думаю, что смогу это сделать.

Заранее спасибо за помощь!

~ Джон

1 Ответ

7 голосов
/ 14 июня 2011

Как насчет использования CMFCEditBrowseCtrl или COXBrowseFileEdit (или других аналогичных классов) вместо обычных элементов управления редактированием?
Эти классы создают поля редактирования с кнопкой «Обзор», которая, когдапри нажатии автоматически открывается диалоговое окно выбора файла и устанавливается выбранный файл в качестве текста элемента управления для редактирования.

...