C++ 为更干净的代码整合功能?
不要对长度感到厌烦……我认为这不是一个太难的问题 语言:C++ 开发环境:Microsoft Visual C++ 使用的库:MFC 问题:我正在创建一个包含多个“页面”的大型首选项对话框。其中许多要求用户指定文件路径。现在,用户将单击该按钮,它将跳转到OnCommand()。这将验证该命令是否来自某个按钮,然后跳转到Browse()函数,在该函数中它将确定按下了哪个按钮。最后,它将调用FileDialog(),它将启动一个文件选择器,然后返回文件路径,将其分配给正确的变量,并将其附加到正确的编辑控件 我试图将所有这些“打开文件”按钮合并到一个类或函数中,但我不确定最好的方法。我希望它是干净的,这样我就不必输入它特定的ID(2001、2002,…) 现在,这三个函数(如下)在我的每个文件中…这是混乱和不必要的。我想要一个名为OpenFile.cpp的文件,或者包含打开文件所需功能的文件,并将所选路径附加到正确对话框中的正确文本框中 //C++ 为更干净的代码整合功能?,c++,visual-c++,function,mfc,parameters,C++,Visual C++,Function,Mfc,Parameters,不要对长度感到厌烦……我认为这不是一个太难的问题 语言:C++ 开发环境:Microsoft Visual C++ 使用的库:MFC 问题:我正在创建一个包含多个“页面”的大型首选项对话框。其中许多要求用户指定文件路径。现在,用户将单击该按钮,它将跳转到OnCommand()。这将验证该命令是否来自某个按钮,然后跳转到Browse()函数,在该函数中它将确定按下了哪个按钮。最后,它将调用FileDialog(),它将启动一个文件选择器,然后返回文件路径,将其分配给正确的变量,并将其附加到正确的编
头文件定义:
afx_msg CString FileDialog(CWnd* wnd, int uiID);
afx_msg void Browse(UINT uiID);
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
那么,我如何调整参数以将所有三个参数放在一个文件中,以及如何引用它们?如果我这样做了,我觉得我需要向OnCommand()函数添加一个额外的参数,但我认为我做不到
提前感谢您的帮助
~Jon用or(或其他类似类)代替普通的编辑控件怎么样?这些类使用“浏览”按钮创建编辑框,单击该按钮会自动打开文件选择对话框,并将所选文件设置为编辑控制文本。其他定义的签名是什么样的?如果它们是相同的,那么将它们合并到一个单元中不会带来很多问题。@phresnel您是指头文件中的定义吗?我将在上面添加它们。我的意思是,如果所有编译单元中的“函数重新定义”都是相同的,那么合并它们应该不是一个大问题。@phresnel它们都应该是相同的。我只是不知道如何传递对话框的ID,从该对话框中“调用”可以知道按下了哪个按钮,因此需要附加哪个编辑控件。哇,这太简单了,我想这会节省很多时间。非常感谢。或者使用公开
GetFileName()
方法的CEdit
和CButton
实现您自己的CWnd派生控件。
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);