Рассмотрим создание стандартных диалогов для выбора файла или каталога в приложении, написанном на Visual C++.
В качестве шаблона будем использовать Dialog based приложение, созданное в предыдущем посте. Это стандартное, "пустое" Dialog based приложение, просто мы там добавили меню и обработчик его команды, которая вызывается когда мы щелкаем по пункту этого меню.
В этот обработчик (функция CCreatingMenuDlg::OnMytopmenuMymenuitem()) вместо старого вставляем новый код:
CString a(TEXT("All Files (*.*)|*.*||")),
b(TEXT("My File Dialog")),
c(TEXT("Your file name is :"));
CFileDialog fileDlg( TRUE,
NULL,
NULL,
OFN_ALLOWMULTISELECT|OFN_HIDEREADONLY,
a,
this,
sizeof(OPENFILENAME)
);
fileDlg.m_ofn.lpstrTitle = b;
if ( fileDlg.DoModal() == IDOK)
{
CString szlstfile = fileDlg.GetPathName();
CString res;
res = c + szlstfile;
AfxMessageBox(res );
ofstream flow1 (szlstfile);
flow1 << "Ты сделал это!!!";
}
При выборе этого пункта меню будет вызываться диалоговое окно, которое позволяет выбрать или создать файл, куда будет записана тестовая строка. Будьте осторожны при тестировании, чтобы не затереть какой-нибудь полезный файл.
Для работы с типом ofstream (для демонстрируемой функциональности вообще-то нам последние две строчки кода что приведен выше не нужны) включим в файл CreatingMenu.h следующее:
#include<fstream>
#include<iostream>
#include<string>
using namespace std;
Все. Теперь можно скомпилировать и запустить на выполнение.
Теперь напишем код для вызова диалога для выбора директории. Для этого в обработчик CCreatingMenuDlg::OnMytopmenuMymenuitem() вместо предыдущего вставим такой код:
BROWSEINFO bi = { 0 };
bi.lpszTitle = _T("Pick a Directory");
bi.ulFlags |= BIF_NEWDIALOGSTYLE;
LPITEMIDLIST pidl = SHBrowseForFolder ( &bi );
if ( pidl != 0 )
{
TCHAR path[MAX_PATH];
if ( SHGetPathFromIDList ( pidl, path ) )
{
//_tprintf ( _T("Selected Folder: %s\n"), path );
CString a(path);
CString res = TEXT("Your selected path is: ") + a;
AfxMessageBox(res);
}
IMalloc * imalloc = 0;
if ( SUCCEEDED( SHGetMalloc ( &imalloc )) )
{
imalloc->Free ( pidl );
imalloc->Release ( );
}
}
Компилируем и запускаем на выполнение.