Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[C++]Диалог выбора директории. Как установить начальную директорию?

1.9K
19 октября 2007 года
max_dark
256 / / 11.11.2005
Диалог выбора директории.
Код:
#include <shlobj.h>
/* .... */
bool ChooseFolder(HWND hwnd, LPSTR lpszTitle, LPSTR lpBuffer) {
    BROWSEINFO bi;
    bool res = false;
    LPITEMIDLIST pidlBrowse;
    ZeroMemory(&bi, sizeof(BROWSEINFO));
    bi.hwndOwner = hwnd;
    bi.pszDisplayName = lpBuffer;
    bi.lpszTitle = lpszTitle;
    bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_DONTGOBELOWDOMAIN;
    pidlBrowse = SHBrowseForFolder(&bi);
    if (pidlBrowse != NULL) {
        if (SHGetPathFromIDList(pidlBrowse, lpBuffer))
            res = true;
    }
    return res;
}
Как установить начальную директорию?
Т.е. чтобы при открытии диалога был выделен каталог из lpBuffer
код взят из WIN32SDK

Насколько я понимаю, надо копать в сторону BROWSEINFO::lpfn
489
19 октября 2007 года
NeO_u
277 / / 11.10.2006
Цитата: max_dark

Насколько я понимаю, надо копать в сторону BROWSEINFO::lpfn



Разве? а не просто SetCurrentDir(dir)?

1.9K
19 октября 2007 года
max_dark
256 / / 11.11.2005
Цитата:
Разве? а не просто SetCurrentDir(dir)?


SetCurentDir - установка рабочего каталога программы.
А мне нужно ВЫДЕЛЕНИЕ КАТАЛОГА в диалоге
Например:

 
Код:
char buff[MAX_PATH];
lstrcpy(buff,"D:\\docs\\sources\\Visual C++");
ChooseFolder(hwnd,"Microsoft Visual C++ 6.0",buff);

Должен сразу выделять каталог Visual C++
Как на скриншоте
1.9K
19 октября 2007 года
max_dark
256 / / 11.11.2005
Все, разобрался
Код:
#include <shlobj.h>
/* .... */
int __stdcall BrowseCallbackProc(
    HWND hwnd,
    UINT uMsg,
    LPARAM lParam,
    LPARAM lpData
    ) {
    switch (uMsg) {
        case BFFM_INITIALIZED: {
            // При инициализации диалога
            // посылаем сообщение установки каталога
            if(lpData!=NULL)
                SendMessage(hwnd,BFFM_SETSELECTION,TRUE,lpData);
            } break;
        case BFFM_SELCHANGED : {
            } break;
    }
    return 0;
}
bool ChooseFolder(HWND hwnd, LPSTR lpszTitle, LPSTR lpBuffer) {
    BROWSEINFO bi;
    bool res = false;
    LPITEMIDLIST pidlBrowse;
    ZeroMemory(&bi, sizeof(BROWSEINFO));
    bi.hwndOwner = hwnd;
    bi.pszDisplayName = lpBuffer;
    bi.lpszTitle = lpszTitle;
    bi.lParam=(LPARAM)lpBuffer;
    bi.lpfn=BrowseCallbackProc;
    bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_DONTGOBELOWDOMAIN;
    pidlBrowse = SHBrowseForFolder(&bi);
    if (pidlBrowse != NULL) {
        if (SHGetPathFromIDList(pidlBrowse, lpBuffer))
            res = true;
    }
    return res;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог