Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как задать выбранную папку в диалоге выбора папки? при использовании SHBrowseForFolder() 
V
    Опции темы
zkv
Дата 3.9.2006, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



собственно сам диалог обзора вызывается без проблем, а вот как сделать, чтобы при старте диалога уже была бы выбрана определенная папка.

если через  BROWSEINFO::pidlRoot передать стартовую папку, то в диалоге отображаются, только ее содержимое, а надо задать именно папку, которая выбрана при старте диалога (т.е. чтобы все  каталоги имеющиеся на компе в диалоге присутствовали).

и вообще есть ли в MFC какая нибудь альтернатива SHBrowseForFolder() ? Что то неприятно с ним работать smile неужели нет чего нибудь похожего на CFileDialog? 
PM MAIL   Вверх
zkv
Дата 4.9.2006, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



и еще, на форуме несколько раз задавали вопрос об использовании CFileDialog для открытия каталога, но ответа так и не последовало (я не нашел во всяком случае), так можно использовать или нет?
PM MAIL   Вверх
Damarus
Дата 4.9.2006, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Цитата(zkv @  3.9.2006,  22:37 Найти цитируемый пост)
собственно сам диалог обзора вызывается без проблем, а вот как сделать, чтобы при старте диалога уже была бы выбрана определенная папка.

Код

#include <windows.h>
#include <shlobj.h>
#include <iostream>

BOOL CALLBACK BrowseCallbackProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
    if (uMsg == BFFM_INITIALIZED)
        SendMessage(hWnd, BFFM_SETSELECTION, TRUE, lpData);

    return FALSE;
}

int wmain(int argc, wchar_t* argv[], wchar_t* envp[])
{
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

    BROWSEINFO bi = { 0 };
    bi.ulFlags = BIF_NEWDIALOGSTYLE;
    bi.lpfn    = BrowseCallbackProc;
    bi.lParam  = LPARAM(L"C:\\Program Files");
    SHBrowseForFolder(&bi);

    CoUninitialize();
}



Это сообщение отредактировал(а) Damarus - 4.9.2006, 01:26
PM MAIL ICQ Jabber   Вверх
zkv
Дата 4.9.2006, 03:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



Damarus спасибо за столь развернутый пример, только у меня почему то работает только в таком варианте (мне сгодится и так, привожу для сведения):
Код

#include <windows.h>
#include <shlobj.h>

BOOL CALLBACK BrowseCallbackProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
    if (uMsg == BFFM_INITIALIZED)
        SendMessage(hWnd, BFFM_SETSELECTION, 
                                      FALSE,   //будет рассматривать lpData как id
                                      lpData); //здесь id 
    return FALSE;
}
int wmain(int argc, wchar_t* argv[], wchar_t* envp[])
{
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    BROWSEINFO bi = { 0 };
    WCHAR wstr[] = L"c:\\Program Files\\";    //требуемый путь, \ на конце обязательна :)
    LPITEMIDLIST    pidl;                    //сюда запишем
    pidl = SHSimpleIDListFromPath( wstr );  //id папки
    bi.ulFlags = BIF_NEWDIALOGSTYLE;        //тут маленькие проблемки, но разберусь
    bi.lpfn    = BrowseCallbackProc;        //
    bi.lParam  = LPARAM(pidl);              //отправляем id вместо имени
    SHBrowseForFolder(&bi);
    CoUninitialize();
}

как все непросто оказывается, неужели в MFC нет ничего проще, не верится, что для открытия файла сделали класс (CFileDialog), а для папки ничего нет. 
Повторюсь, кто-нибудь знает наверняка, что использовать CFileDialog для открытия каталога не получится?

Это сообщение отредактировал(а) zkv - 4.9.2006, 05:14
PM MAIL   Вверх
Earnest
Дата 4.9.2006, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Теоретически можно, но требуются доработки: нужно запретить заходить в листовые папки, обработать выбор папки как выбор, а не как вход в нее и т.д. И все равно получается костыль. Когда-то очень давно именно так и делала. Но потом стала использовать SHBrowse: стандартное средство все-таки. Пользоваться напрямую, конечно, неудобно, но кто мешает обернуть это дело в класс или в функцию?


--------------------
...
PM   Вверх
Damarus
Дата 4.9.2006, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Цитата(zkv @  4.9.2006,  04:05 Найти цитируемый пост)
Damarus спасибо за столь развернутый пример, только у меня почему то работает только в таком варианте (мне сгодится и так, привожу для сведения):

zkv, то есть код, который я привёл (без изменений), у тебя не работает smile Странно. В чём это выражается smile  У меня этот код нормально работает.
PM MAIL ICQ Jabber   Вверх
zkv
Дата 4.9.2006, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



Цитата(Damarus @  4.9.2006,  09:55 Найти цитируемый пост)
zkv, то есть код, который я привёл (без изменений), у тебя не работает smile Странно. В чём это выражается smile  У меня этот код нормально работает. 


Damarus, выражается в том, что нужная папка просто не выбирается, диалог появляется нормально, 
в коде
Код

BOOL CALLBACK BrowseCallbackProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
    if (uMsg == BFFM_INITIALIZED)
        SendMessage(hWnd, BFFM_SETSELECTION, 
                                      TRUE,   //будет рассматривать lpData как LPWSTR
                                                  // (или LPСWSTR  не помню точно :) )
                                      lpData); 
    return FALSE;
}

перед SendMessage смотрел на значение lpData, туда все правильно доходит, а как дальше проследить не знаю smile
пробовал менять bi.ulFlags, не помогло, добавлял/прибавлял '\\' в конец пути, тоже глухо, получилось только так, как показано в моем вариатнте выше, причем мой вариант работает нормально только при сброшеном флаге  BIF_NEWDIALOGSTYLE, но меня это устраивает, "ненормальность"  работы заключается в том, что если указать к примеру "c:\\" или любой другой диск то он выбирается, а если добавить к пути какую нибудь папку к примеру "c:\\Program Files\\" (пробовал как со слешем на конце, так и без него), то опять таки не выбирается ничего. Работаю в 2003 студии. 

Всем спасибо за помощь


Это сообщение отредактировал(а) zkv - 4.9.2006, 13:30
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0483 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.