В C (или C ++) вы создадите экземпляр структуры OPENFILENAME
и установите его члены. Это очень похоже на то, что вы показали в приведенном выше примере кода VB 6.
Связанная документация содержит информацию о том, что означают все различные члены этой структуры и как вы должны их заполнить, но большинство из них совпадают с тем, что вы найдете в VB 6.
Например:
OPENFILENAME ofn;
ofn.lpstrTitle = TEXT("Select a file to open");
ofn.lpstrFilter = TEXT("EXE files\0*.exe\0");
/* etc... */
Волшебство наступает, когда вы установили все свойства и готовы показать диалоговое окно. В отличие от VB 6, где структура данных предоставляет функцию, которая отображает диалоговое окно (ShowOpen
), в C / Win32 для этого нужно вызвать другую функцию.
Интересующая вас функция: GetOpenFileName
, и она принимает один аргумент - указатель на вашу OPENFILENAME
структуру. Члены этой структуры используются для инициализации диалогового окна, и функция также заполняет членов структуры информацией о файле, который выбрал пользователь. Возвращаемое значение функции указывает, указал ли пользователь имя файла и нажал ли кнопку «ОК» (не ноль), или нажал ли пользователь «Отмена», или произошла ошибка (ноль; FALSE
).
Полный пример кода здесь , но упрощенная версия такова:
TCHAR szFileName[MAX_PATH]; /* string buffer to hold name of the selected file */
OPENFILENAME ofn = {0};
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWnd; /* a handle to your window that will own the dialog */
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrTitle = TEXT("Select a file to open");
ofn.lpstrFilter = TEXT("EXE files\0*.exe\0");
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
/* etc... */
/* Show the dialog. */
if (!GetOpenFileName(&ofn))
{
/* Either the user clicked Cancel, or an error occurred.
* You need to handle it here... */
}
else
{
/* The user selected a file and clicked OK.
* The name and path to the file is contained in the szFileName buffer. */
MessageBox(NULL, szFileName, TEXT("You selected the file..."), MB_OK);
}
Да, некоторые вещи по этому поводу отличаются от VB 6. Например, C не имеет встроенного строкового типа, что усложняет кодирование. Если вас смущает приведенный выше пример кода, я настоятельно советую вам изучить язык C, прежде чем пытаться изучать Win32 API. Все пойдет намного более гладко, и вы не будете почти так же потеряны.