Я следую за определением для CFileDialog
, но VS2013 все еще говорит мне, что для аргументов, которые я передаю, нет конструктора.
Мой код:
CFile theFile;
char strFilter[] = { "TXT Files (*.txt)|*.txt|All Files (*.*)|*.*||" };
CFileDialog fDlg = CFileDialog(TRUE, ".txt", NULL, 0, strFilter);
Результирующая ошибка:
1 IntelliSense: ни один экземпляр конструктора «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);
В чем проблема?
Кажется, проблема в том, что вы используете неверный тип строки.
Быстрое решение заключается в использовании TCHAR
и не char
, Лучшее решение состоит в том, чтобы просто использовать широкие строки и убедиться, что сборка Unicode.
Когда вы создаете проект в Visual Studio, типом набора символов по умолчанию, который используется, является Unicode, а не MBCS и не «Not Set». Это означает, что функции Windows API и MFC, которые принимают символьные массивы и указатели, будут использовать широкие символы. Поэтому с помощью char
, char *
, const char*
в Windows API функции, которые ожидают, что широкие строки не будут компилироваться.
Признак того, что ваш код неверен, даже если вы ничего не знали о Unicode или MBCS, заключается в том, что вызываемые вами функции принимают типы LPCTSTR
— то есть не const char *
это то, что он есть, а именно постоянный указатель на TCHAR
, Если вы застряли в знании использовать указанные типы, вам было бы хорошо.
Таким образом, урок заключается в том, что если функция хочет тип, предоставьте переменную или выражение этого типа, а не то, что, по вашему мнению, эквивалентно типу.
Хорошо. Поэтому я изменил свой код на следующее:
CFile theFile;
TCHAR strFilter[] = { _T("TXT Files (*.txt)|*.txt|All Files (*.*)|*.*||") };
CFileDialog fDlg = CFileDialog(TRUE, _T(".txt"), NULL, 0, strFilter);
И теперь нет проблем. Спасибо за ваши ответы!