Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC_Lect.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
15 Мб
Скачать
☆

12.5.Диалоги по выбору имени файла и каталога

Класс CFileDialog библиотеки MFC предназначен для вызова стандартного диалога Windows по открытию или сохранению файла. Вот формат его использования:

CFileDialog dlg(FALSE,"dat","*.dat"); /*FALSE - сохранение, TRUE – открытие */

if(dlg.DoModal()==IDOK) /*вызов диалогового окна*/

{

/*в этой точке программы функция dlg.GetPathName() вернет полное имя файла */

}

else /*пользователь завершил диалог нажатием кнопки Cancel*/;

На самом деле конструктор класса CFileDialog имеет значительно больше параметров, описание которых см. в MSDN.

Конечно, класс CFileDialog можно использовать искусственным образом и для выбора каталога (придется заставить пользователя выбрать какой-нибудь файл в желаемом каталоге), но это некрасиво. Ниже приводится текст функции, несколько сложноватой (а что поделаешь), которая позволяет выбрать имя каталога и возвращает его как значение параметра DirName.

Функция возвращает значение true, если выбор каталога завершился без ошибки, и false в случае возникновения ошибки или при отказе пользователя от выбора каталога, т.е. при закрытии им диалогового окна с помощью кнопки «Отмена». Если пользователь не выбрал каталог и завершил диалог нажатием кнопки «ОК», то функция вернет значение true, но строка с именем каталога DirName будет пустой.

Вызывающая программа должна позаботиться о выделении достаточной памяти для имени каталога, возвращаемого обсуждаемой функцией. С учетом сказанного вызов функции может выглядеть так:

char DirName[MAX_PATH]; // объявляем массив достаточного размера

if(GetDirNameDemo(DirName)) ; // используем каталог

else ; // какая-то ошибка

Код функции выбора имени каталога.

bool GetDirNameDemo(char *DirName)

{

LPMALLOC pMalloc;

/* Получаем интерфейс pMalloc */

if (::SHGetMalloc(&pMalloc) == NOERROR)

{

BROWSEINFO bi;

LPITEMIDLIST pidl;

// устанавливаем значения полей структуры bi - см. справку MSDN

bi.hwndOwner = NULL;

bi.pidlRoot = NULL;

bi.pszDisplayName = DirName;

bi.lpszTitle = _T("Выберите каталог");

bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;

bi.lpfn = NULL;

bi.lParam = 0;

// В следующей строке вызывается функция выбора имени каталога

if ((pidl = ::SHBrowseForFolder(&bi)) != NULL)

{

if (!::SHGetPathFromIDList(pidl, DirName)) return false;

/* Освобождаем память для pidl, выделенную функцией

SHGetPathFromIDList() */

pMalloc->Free(pidl);

}

// Освобождаем интерфейс pMalloc

pMalloc->Release();

return true;

}

else return false;

}

Существует еще несколько функций оболочки (shell), которые предоставляют программисту различные сервисы. Имена этих функций начинаются с префикса SH. См. MSDN.

13.Обработка сообщений Windows

Достаточно подробно обработка сообщений (messages) Windows описана в MSDN (см. перевод соответствующего раздела в файле MMQ_Rus.doc), хотя и без примеров. Предполагается, что перед чтением этого раздела Вы ознакомитесь с этим источником или с другими. В данном разделе я постарался привести конкретные рекомендации по практическому использованию механизма сообщений и привести примеры.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]