Открыть каталог или фаил
Вызвасть стандартное Windowsкое окно по открытию фаила или каталога....
Ну и естественно получить на блидечке путь к фаилу....
1. открытие файла: GetOpenFileName
2. выбор папки: SHBrowseForFolder
см. MSDN:
1. открытие файла: GetOpenFileName
2. выбор папки: SHBrowseForFolder
А можно маленький примерчик, меня такая большая структура сбила с толку....
А можно маленький примерчик, меня такая большая структура сбила с толку....
без MFC, выбор файла, для сохранения:
char *Browse_forSaveFile(HWND owner, char *info, char *filter, char *file, char *initial)
{
static OPENFILENAME ofn;
char szFileTitle[MAX_PATH];
static char szFile[MAX_PATH];
szFileTitle[0] = 0;
szFile[0] = 0;
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = owner;
ofn.lpstrFilter = filter;
ofn.nFilterIndex = 1;
if (file) strcpy(szFile, file);
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFileTitle = szFileTitle;
ofn.nMaxFileTitle = sizeof(szFileTitle);
ofn.lpstrInitialDir = initial;
ofn.lpstrTitle = info;
ofn.lpstrDefExt = "jpg";
ofn.Flags = OFN_PATHMUSTEXIST |
OFN_FILEMUSTEXIST | OFN_OVERWRITEPROMPT;
if (!GetSaveFileName(&ofn)) return NULL;
return ((char *)ofn.lpstrFile);
}
использование простое:
char *pszFile = Browse_forSaveFile(hWnd,
"Куда сохранить",
"Изображения JPEG (*.jpg,*.jpeg)\0*.jpg;*.jpeg\0",
NULL, NULL);
для открытия почти всё тоже самое, тока будет GetOpenFileName() и OFN_OVERWRITEPROMPT не нужен.
в MFC всё проще, (это пример из MSDN):
void CChildFrame::OnFileOpen()
{
// szFilters is a text string that includes two file name filters:
// "*.my" for "MyType Files" and "*.*' for "All Files."
char CChildFrame::szFilters[]=
"MyType Files (*.my)|*.my|All Files (*.*)|*.*||";
// Create an Open dialog; the default file name extension is ".my".
CFileDialog fileDlg (TRUE, "my", "*.my",
OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, this);
// Display the file dialog. When user clicks OK, fileDlg.DoModal()
// returns IDOK.
if( fileDlg.DoModal ()==IDOK )
{
CString pathName = fileDlg.GetPathName();
// Implement opening and reading file in here.
...
//Change the window's title to the opened file's title.
CString fileName = fileDlg.GetFileTitle ();
SetWindowText(fileName);
}
}
Выбор папки:
CoInitialize();
....
BROWSEINFO bi={0}; // всё инициализиреум нулями
char szBuffer[MAX_PATH];
LPMALLOC pMalloc = NULL;
if (FAILED(SHGetMalloc(&pMalloc))) // это интерфейс для освобождения памяти, возвращаемой SHBrowseForFolder
retrun;
bi.hwndOwner = hWnd; // окно родитель
//bi.pidlRoot; // корневая папка (откуда смотрим, если NULL то это Рабочий Стол)
bi.pszDisplayName = szBuffer;
bi.lpszTitle = "заголовок над деревом папок";
bi.ulFlags = BIF_USENEWUI; // разные флаги, позволяет указать какие объёкты показывать (принтеры, компы и пр.)
//bi.lpfn; // адрес управляющей ф-ции (для "интеллектуального выбора", тебе это не надо) см. BrowseCallbackProc
//bi.lParam; // параметр этой ф-ции
//bi.iImage; // индекс изображения, которое ассоциировано с выбранным элементом
LPITEMIDLIST pItemIDL = SHBrowseForFolder(&bi);
if (!pItemIDL)
{
pMalloc->Release();
return; // пользователь нажал "отмена" или какая-то ошибка
};
char szPathBuffer[MAX_PATH];
if (!SHGetPathFromIDList(pItemIDL, szPathBuffer))
{
pMalloc->Release();
return; // ошибка
}
pMalloc->Free(pItemIDL);
pMalloc->Release();
// теперь у нас в szPathBuffer путь к выбранному объекту
удачи!
Спасибо
да незашта, :)
кстати CoInitialize() нада вызвать адин рас ф начали праграммы
А если используешь - не забудь в конце вызвать CoUninitialize
CoInitialize() даже можно и опустить - все равно работает (почему-то).
А если используешь - не забудь в конце вызвать CoUninitialize
Конечно если все это писать под API то этот способ конечно хорош. Но если вдруг это MFC - проект то есть чудесный класс CFileDialog
первый параметр 1- открытие 0- сохранение (BOOL -переменная или наоборот, непомню). Остальные перегружены (но можно конечно использовать свои данные чтобы задать маску и т.д.)
А также в дереве MFC - рядом можно найти хорошие классы для работы с выбором цвета, шрифта, и может что еще.
Поклонников АPI прошу не ругаться.
Конечно если все это писать под API то этот способ конечно хорош. Но если вдруг это MFC - проект то есть чудесный класс CFileDialog
первый параметр 1- открытие 0- сохранение (BOOL -переменная или наоборот, непомню). Остальные перегружены (но можно конечно использовать свои данные чтобы задать маску и т.д.)
А также в дереве MFC - рядом можно найти хорошие классы для работы с выбором цвета, шрифта, и может что еще.
Поклонников АPI прошу не ругаться.
Угу...
Я имею ввиду
//bi.pidlRoot; // корневая папка (откуда смотрим, если NULL то это Рабочий Стол)
Как назначить допустим "C:\\Windows"?
или только гетпатнейм и отрубать все от последнего слеша?