CFileDialog实例化的问题

时间:2014-11-20 21:00:18

标签: c++ mfc cfiledialog

我遵循CFileDialog的定义,但VS2013仍然告诉我,我传递的参数没有可用的构造函数。

我的代码:

CFile theFile;
char strFilter[] = { "TXT Files (*.txt)|*.txt|All Files (*.*)|*.*||" };
CFileDialog fDlg = CFileDialog(TRUE, ".txt", NULL, 0, strFilter);

结果错误:

  

1智能感知:没有构造函数的实例" CFileDialog :: CFileDialog"匹配参数列表               参数类型是:(int,const char [5],int,int,char [46])c:\ Users \ Jonathan \ Documents \ Visual Studio 2013 \ Projects \ SDI \ SDI \ MainFrm.cpp 131 21 SDI

CFileDialog构造函数供参考:

explicit CFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs
    LPCTSTR lpszDefExt = NULL,
    LPCTSTR lpszFileName = NULL,
    DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
    LPCTSTR lpszFilter = NULL,
    CWnd* pParentWnd = NULL,
    DWORD dwSize = 0,
    BOOL bVistaStyle = TRUE);

问题是什么?

2 个答案:

答案 0 :(得分:5)

问题似乎是您使用了错误的字符串类型。

快速解决方案是使用TCHAR而非char。更好的解决方案是只使用宽字符串并确保构建是Unicode。

在Visual Studio中创建项目时,使用的默认字符集类型是Unicode,而不是MBCS,而不是"未设置"。这意味着采用字符数组和指针的Windows API和MFC函数将使用宽字符。因此,在期望使用宽字符串的Windows API函数上使用charchar *const char*将无法编译。

即使您对Unicode或MBCS一无所知,您的代码错误的指示是您正在调用的函数采用LPCTSTR类型 - 即 a const char *,就是它,即指向TCHAR的常量指针。如果您不知道如何使用指定的类型,那么您将会很高兴。

因此,经验教训是,如果函数需要一个类型,请提供该类型的变量或表达式,而不是您认为该类型等效的类型。

答案 1 :(得分:2)

确定。所以我已将代码更改为以下内容:

CFile theFile;
TCHAR strFilter[] = { _T("TXT Files (*.txt)|*.txt|All Files (*.*)|*.*||") };
CFileDialog fDlg = CFileDialog(TRUE, _T(".txt"), NULL, 0, strFilter);

而且,现在没有问题。感谢您的回复!