Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/48: Рейтинг темы: голосов - 48, средняя оценка - 4.92
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878

Как сделать нормальный диалог выбора папки?

20.11.2014, 09:58. Показов 9872. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нормальный - это например как у paint, когда мы выбираем папку куда сохранить.
Просто бздюха которая создаётся при помощи SHBrowseForFolder - реально с виду полная хрень.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.11.2014, 09:58
Ответы с готовыми решениями:

Диалог выбора папки с последующим получением пути к этой папке. Как его получить?
Добрый вечер! У меня возникла проблема, мне нужно нажав по кнопке "Browse", находящейся рядом с edit, должен открываться диалог выбора...

Как создать диалог выбора шрифтов?
Какими функция можно создать диалог выбора шрифтов? Можно еще пример

CreateFont, как сделать нормальный шрифт?
Короче не могу сделать нормальный шрифт при помощи CreateFont , прилипил картинку, там 2 поля edit со шрифтом Arial 11 ...

14
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
20.11.2014, 10:09
тыц

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/ диалог выбора файла
bool OpenModuleDlg(HWND hwnd, char* modpath, long count, const char* filter) {
    OPENFILENAME ofn;
 
    ZeroMemory(&ofn, sizeof(OPENFILENAME));
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hwnd;
    ofn.lpstrFile = modpath;
    ofn.nMaxFile = count;
    ofn.lpstrFilter = (filter == NULL ? "Exe\0*.exe\0All Files\0*.*\0" : filter);
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
 
    return (GetOpenFileName(&ofn) == TRUE);
}
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
20.11.2014, 10:14  [ТС]
так это диалог открытия файла, а мне папку нада
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
21.11.2014, 05:22
Можно узнать где у Paint происходит выбор папки, а то я ни разу не нашел
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
21.11.2014, 06:57
Цитата Сообщение от mh-coder Посмотреть сообщение
так это диалог открытия файла, а мне папку нада
Стандартных диалогов выбора вроде бы больше нет. Есть вариант не использовать стандартные диалоги, а реализовать свой, чтобы по виду нравился
1
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
21.11.2014, 15:29
Тю, пацаны, GetSaveFileName же.
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
22.11.2014, 12:22  [ТС]
Цитата Сообщение от dmitry94 Посмотреть сообщение
Стандартных диалогов выбора вроде бы больше нет. Есть вариант не использовать стандартные диалоги, а реализовать свой, чтобы по виду нравился
лан, спс, буду сам рисовать.
Цитата Сообщение от Digit@ll Посмотреть сообщение
Тю, пацаны, GetSaveFileName же.
эта фанкция выбора файла для сохранения, а не папки
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
22.11.2014, 17:37

Не по теме:

Цитата Сообщение от mh-coder Посмотреть сообщение
Нормальный - это например как у paint, когда мы выбираем папку куда сохранить.

0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
23.11.2014, 06:25
Для выбора папки нужно использовать
SHBrowseForFolder()
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
24.11.2014, 22:21  [ТС]
Цитата Сообщение от demmax2004 Посмотреть сообщение
Для выбора папки нужно использовать
SHBrowseForFolder()
мдаа... читать первый пост сейчас не модно?
0
 Аватар для Катеринк@
1 / 1 / 0
Регистрация: 10.04.2011
Сообщений: 30
07.12.2014, 22:28
mh-coder, скажите, пожалуйста, вы нашли функцию, с помощью которой можно выбрать папку для сохранения в нее файлика?
я вот в нете нашла только про структуру BROWSEINFO и эту же функцию SHBrowseForFolder(). А мне нужно путь к папке получить..
0
0 / 0 / 0
Регистрация: 29.04.2015
Сообщений: 5
06.05.2015, 17:56
Как в SHBrowseForFolder() задать путь по умолчанию и корневой путь что б получилось так как на картинке.Тоесть корневая папка была "Сеть".Использую вот такой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
static int CALLBACK
BrowseCallbackProc (HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
    TCHAR szPath[_MAX_PATH];
    switch (uMsg) {
    case BFFM_INITIALIZED:
        if (lpData)
            SendMessage(hWnd,BFFM_SETSELECTION,TRUE,lpData);
        break;
    case BFFM_SELCHANGED:
        SHGetPathFromIDList(LPITEMIDLIST(lParam),szPath);
        SendMessage(hWnd, BFFM_SETSTATUSTEXT, NULL, LPARAM(szPath));
        break;
    }
    return 0;
}
 
BOOL GetFolder (LPCTSTR szTitle, LPTSTR szPath, LPCTSTR szRoot, HWND hWndOwner)
{
    if (szPath == NULL)
        return false;
 
    bool result = false;
 
    LPMALLOC pMalloc;
    if (::SHGetMalloc(&pMalloc) == NOERROR) {
        BROWSEINFO bi;
        ::ZeroMemory(&bi,sizeof bi);
        bi.ulFlags   =  BIF_DONTGOBELOWDOMAIN;
 
        // дескриптор окна-владельца диалога
        bi.hwndOwner = hWndOwner;
 
        // добавление заголовка к диалогу
        bi.lpszTitle = szTitle;
 
        // отображение текущего каталога
        bi.lpfn      = BrowseCallbackProc;
        bi.ulFlags  |= BIF_STATUSTEXT;
 
        // установка каталога по умолчанию
        bi.lParam    = LPARAM(szPath);
 
        // установка корневого каталога
        if (szRoot != NULL) {
            IShellFolder *pDF;
            if (SHGetDesktopFolder(&pDF) == NOERROR) {
                LPITEMIDLIST pIdl = NULL;
                ULONG        chEaten;
                ULONG        dwAttributes;
 
                USES_CONVERSION;
                LPOLESTR oleStr = T2OLE(szRoot);
 
                pDF->ParseDisplayName(NULL,NULL,oleStr,&chEaten,&pIdl,&dwAttributes);
                pDF->Release();
 
                bi.pidlRoot = pIdl;
            }
        }
 
        LPITEMIDLIST pidl = ::SHBrowseForFolder(&bi);
        if (pidl != NULL) {
            if (::SHGetPathFromIDList(pidl,szPath))
                Form1->DiscDirectory->Items->Add(szPath);
                Form1->DiscDirectory->Text= szPath;
                result = true;
            pMalloc->Free(pidl);
        }
        if (bi.pidlRoot != NULL)
            //pMalloc->Free(pidl);
        pMalloc->Release();
    }
    return result;
}
szRoot- корневой католог,szPath- путь к паке которую вибираеш.
Миниатюры
Как сделать нормальный диалог выбора папки?  
0
46 / 31 / 12
Регистрация: 21.04.2015
Сообщений: 82
06.05.2015, 18:31
Цитата Сообщение от Grossmeister228 Посмотреть сообщение
Как в SHBrowseForFolder() задать путь по умолчанию и корневой путь что б получилось так как на картинке.Тоесть корневая папка была "Сеть".
C++
1
2
3
LPITEMIDLIST iil;
SHGetSpecialFolderLocation(m_hWnd, CSIDL_NETWORK, &iil);
bi.pidlRoot = iil;
Добавлено через 3 минуты
Цитата Сообщение от mh-coder Посмотреть сообщение
Просто бздюха которая создаётся при помощи SHBrowseForFolder - реально с виду полная хрень.
Начиная с Windows Vista надо юзать IFileDialog с опцией FOS_PICKFOLDERS.
0
0 / 0 / 0
Регистрация: 29.04.2015
Сообщений: 5
06.05.2015, 19:16
Решил вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
BROWSEINFO    binfo;
 
    char          szDisplayName[MAX_PATH];
    LPITEMIDLIST  pidl;
    LPMALLOC      pShellMalloc;
 
    if(SHGetMalloc(&pShellMalloc) == NO_ERROR)
    {
        SHGetSpecialFolderLocation(NULL,CSIDL_NETWORK,&pidl);//здесь указиваете тип спец. папки вот здесь можно узнать [url]http://samoucka.ru/document28006.html[/url]
        memset(&binfo, 0x00, sizeof(binfo));
        binfo.hwndOwner = Form1->Handle;
        binfo.pidlRoot = pidl;
        binfo.lpszTitle = "Огляд мережевих каталогів";
        binfo.ulFlags   = BIF_RETURNONLYFSDIRS|BIF_STATUSTEXT;
        binfo.lpfn      = NULL;
        binfo.lParam = 0;
        binfo.iImage = 0;
 
        pidl = SHBrowseForFolder(&binfo);
 
        if(pidl)
        {
            if(SHGetPathFromIDList(pidl, Directory))
            {
                Form1->DiscDirectory->Items->Add(Directory);
                Form1->DiscDirectory->Text= Directory;
 
            }
            pShellMalloc->Free(pidl);
            pShellMalloc->Release();
        }
    }
, предидущий код более универсален но не подходит для этих действий
0
46 / 31 / 12
Регистрация: 21.04.2015
Сообщений: 82
06.05.2015, 19:42
Grossmeister228,
Не забудь удалить PIDL, выделенный с помощью SHGetSpecialFolderLocation, функцией CoTaskMemFree.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.05.2015, 19:42
Помогаю со студенческими работами здесь

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

Диалог выбора файла в си с использованием win api
Помогите сделать диалоговое окно для выбора файла при нажатии на кнопку в си с использованием winapi. Уже все обгуглил, или я тупой или не...

Как сделать невидимым консольное окно в программе, вызывающей диалог?
Простая тестовая программа#include <Windows.h> int main(int argc, char* argv) { MessageBox(NULL, "Окно", "Заголовок...

Как в Delfi 7 при нажатии Batton открыть диалог выбора папки в подкаталоге программы и сохранить путь папки в Edit
Как в Delfi 7 при нажатии Batton открыть диалог выбора папки в подкаталоге программы и сохранить путь папки в Edit. С условием, что данная...

Как показать диалог выбора папки
Как показать диалог выбора папки ? Без использования DirectoryListBox. Меня интересует путь к выбранной папке. Как сделать так, что-бы в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru