Как выдать окно выбора каталога?
Статья:
Как выдать окно выбора каталога?Автор(ы): Игорь Ткачёв
Авторы:
Игорь Ткачёв
Аннотация:
Windows Shell API включает функцию SHBrowseForFolder, которая отображает стандартный диалог, с помощью которого пользователь может выбрать нужный каталог. На самом деле, выбрать можно не только каталог, а любой объект Shell namespace, в том числе принтеры и компьютеры. Далее приведён пример использования этой функции...
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: установка каталога по умолчанию
Здравствуйте, <Аноним>, Вы писали:
А>Народ, а как можно задать диалог открытия папки, но при этом чтобы в нем была возможность вписать папку вручную?
Re[5]: Диалог выбора папкиАвтор: Odi$$ey Дата: 24.03.05
... << RSDN@Home 1.1.4 beta 7 rev. 451>>
Тоже-самое в виде классика...
От:
Ig
Дата: 24.07.01 20:53
Оценка:
Привет огромный Игорю Л. Ткачеву
и всем-всем-всем...
Если тоже-самое оформить в виде классика, то его можно поместить в галерею...
Поскольку коментарий ограничен — то тексты следующими коментариями...
У меня немало есть еще чем поделиться и по серьезнее, но это пока все, что просочилось сквозь мою лень.
Тоже-самое в виде классика 1
От:
Ig
Дата: 24.07.01 20:55
Оценка:
class CChooseFolder
{
public:
BOOL DoModal(LPCTSTR title, CString &path, HWND hOwner = NULL);
CChooseFolder(HWND hOwner = NULL);
virtual ~CChooseFolder();
protected:
LPMALLOC m_pMalloc;
BROWSEINFO m_asFolder;
LPSHELLFOLDER m_pShf;
};
Тоже-самое в виде классика 2
От:
Ig
Дата: 24.07.01 20:58
Оценка:
// Реализация:
CChooseFolder::CChooseFolder(HWND hOwner/* = NULL*/)
: m_pShf(NULL), m_pMalloc(NULL)
{
if (SHGetDesktopFolder(&m_pShf) != NOERROR) m_pShf = NULL;
if (SHGetMalloc(&m_pMalloc) != NOERROR) m_pMalloc = NULL;
memset(&m_asFolder, 0, sizeof(m_asFolder));
m_asFolder.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
m_asFolder.pszDisplayName = NULL;
m_asFolder.hwndOwner = hOwner;
m_asFolder.lpfn = BrowseCallbackProc;
}
CChooseFolder::~CChooseFolder()
{
if (m_pMalloc) m_pMalloc->Release();
if (m_pShf) m_pShf->Release();
}
Тоже-самое в виде классика 3
От:
Ig
Дата: 24.07.01 21:00
Оценка:
BOOL CChooseFolder::DoModal(LPCTSTR title, CString &path, HWND hOwner)
{
int pathLen = path.GetLength();
char *asPath = path.GetBuffer(_MAX_PATH + 1);
LPITEMIDLIST pIdl = NULL;
if (pathLen && m_pShf) { // IShellFolder
ULONG chEaten = 0L, dwAttributes = 0L;
LPOLESTR pOleStr = path.AllocSysString();
m_pShf->ParseDisplayName(hOwner, NULL, pOleStr, &chEaten, &pIdl, &dwAttributes);
::SysFreeString(pOleStr);
}
m_asFolder.lpszTitle = title;
m_asFolder.lParam = LPARAM(pIdl);
if (hOwner) m_asFolder.hwndOwner = hOwner;
LPITEMIDLIST item = SHBrowseForFolder(&m_asFolder);
BOOL ok = FALSE;
if (item) ok = SHGetPathFromIDList(item, asPath);
if (m_pMalloc) {
if (item) m_pMalloc->Free(item);
if (pIdl) m_pMalloc->Free(pIdl);
}
path.ReleaseBuffer();
return ok;
}
Тоже-самое в виде классика 4
От:
Ig
Дата: 24.07.01 21:07
Оценка:
/// Использование:
class CMyDlg : public CDialog
{
// ...
// Dialog Data
//{{AFX_DATA(CMyDlg)
CString m_AnyFolder; // строчечка ввода
// ...
//}}AFX_DATA
// ...
// Generated message map functions
//{{AFX_MSG(CMyDlg)
afx_msg void OnChooseFolderBtn(); // Кнопочка рядышком со строчечкой
// ...
//}}AFX_MSG
// ...
ССhooseFolder m_Chooser; // Это Он !!!
// ...
};
void CMyDlg::OnChooseFolderBtn()
{
UpdateData();
if (m_Chooser.DoModal("Выбери папку, дружок!",
m_AnyFolder, GetSafeHwnd())) {
UpdateData(FALSE);
}
}
установка каталога по умолчанию
>> // установка каталога по умолчанию
>> bi.lParam = LPARAM(szPath);
а если в szPath будет путь на подобие этого: \\Computer\SomeFolder\
то установка каталога по умолчанию не сработает!!! :-(
Я уже задавал этот вопрос в форуме, но ответа никто так и не дал.
ICQ: 100287472
Re: Как выдать окно выбора каталога?
От:
djyuran
Дата: 02.04.05 04:53
Оценка:
Я думаю надо отразить в статье, что в Visual Studi 2003 пример не комплируется!
Re: установка каталога по умолчанию
От:
Аноним
Дата: 16.05.05 08:19
Оценка:
Народ, а как можно задать диалог открытия папки, но при этом чтобы в нем была возможность вписать папку вручную?
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить