Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dialog wskazania wielu folderów

Ostatnio zmodyfikowano 2014-02-26 09:55
Autor Wiadomość
McAffey
Temat założony przez niniejszego użytkownika
Dialog wskazania wielu folderów
» 2014-02-14 01:32:25
Witam, szukam sposobu dzięki któremu otworzy mi się okienko i będę mógł zaznaczyć tam kilka folderów. Np. tak jak jest tutaj (to akurat nie jest C++ chyba) :

folder dialog
dla pojedynczego folderu można użyć z winapi SHBrowseForFolder tak jak to wytłumaczono np. tutaj - http:/​/vctipsplusplus.wordpress.com​/2008/07/15​/using-shbrowseforfolder/ ale za pomocą winapi chyba zaznaczania wielu folderów się utworzyć nie da, a przynajmniej tak wyczytałem np. tutaj http:/​/social.msdn.microsoft.com​/Forums/vstudio/en-US​/f3238042-6983-479f-8e6d-1700a7​2efa7b​/multiple-folder-selection-usi​ng-win32-api​?forum=vcgeneral
I don't think there is a multi-folder selection in the Windows API. The OFN_ALLOWMULTISELECT flag is used for multiple files selection.

Tutaj znalazłem jakieś informacje, ale nie umiem ich przełożyć na kod, za słabo znam winapi - http://www.codeproject.com​/Articles/28015​/SelectDialog-A-Multiple-File-and-Folder-Select-Dia

Czy znacie może jakiś sposób dla utworzenia dialogu w którym można zaznaczyć wiele folderów ? Przychodzi mi do głowy
a) może jednak da radę jakoś z winapi, jeśli ktoś to potrafi to poprosiłbym o wytłumaczenie z kodem, bo nie znam dobrze winapi
b) może z jakiejś innej biblioteki (np. GTK+ ?) którą mógłbym wincludować tak się da ?
c) najgorsze rozwiązanie - samemu sobie taki dialog tworzyć, czyli listować katalogi i samemu to wszystko "budować".

Proszę o pomoc, dzięki :)
P-104619
xevuel
» 2014-02-14 09:15:47
W WinAPI było by z tym trochę paprania, ale da się.

  • SHBrowseForFolder przyjmuje wskaźnik na strukturę BROWSEINFO, która to zawiera pole lpfn. W ten sposób zapewniamy sobie informowanie o kliknięciu jakiegoś elementu oraz uchwyt do okna.
  • Należy w jakiś sposób wyciągnąć z okna uchwyt do SysTreeView32. Można użyć [MSDN] EnumChildWindows
  • Mając uchwyt wysyłamy:
    C/C++
    #define TVS_CHECKBOXES 0x100
    LONG style = GetWindowLong( handle, GWL_STYLE );
    style = style | TVS_CHECKBOXES;
    SetWindowLong( handle, GWL_STYLE, style );
  • Trzeba otrzymać informację o kliknięciu przycisku OK. Chyba jedynym sposobem jest subclassing:
    C/C++
    // w BrowseCallbackProc
    switch( uMsg )
    {
    case BFFM_INITIALIZED:
        DefaultProc =( WNDPROC ) SetWindowLongPtr( hwnd, GWLP_WNDPROC,( LONG_PTR ) SubclassProc );
        break;
    }

    //w SubclassProc
    if( uMsg == WM_COMMAND && HIWORD( wParam ) == BN_CLICKED )
    {
        //sprawdzamy czy lParam jest tym przyciskiem o ktory chodzi
       
        //zachowujemy gdzieś informację o zaznaczonych folderach
    }
  • Pozostaje jeszcze pytanie, skąd wziąć zaznaczone foldery. Najłatwiej chyba jest zapamiętywać w BrowseCallbackProc w BFFM_SELCHANGED za pomocą jakiegoś kontenera który ma szybkie operacje wstaw i usuń, przykładowo std::set


Być może każdą z tych operacji da się zastąpić czymś innym, co będzie szybsze/krótsze/ładniejsze. Ale ogólną koncepcję już znasz :)
P-104625
McAffey
Temat założony przez niniejszego użytkownika
» 2014-02-20 22:02:48
hmm, trochę próbuję się do tego dobrać, ale szczerze powiedziawszy bardzo słabo znam WinAPI, raptem kilka razy jakieś proste interfejsy pisałem i nie bardzo umiem podane przez Ciebie rozwiązania wykonać. Ale pewnie nie masz ochoty wspomóc bardziej rozległym kodem niż tylko ogólną koncepcją ?

Zresztą te rozwiązanie może nie zadziałaś, bo nie wiem czy uda się w takim dialogu do wyboru plików/folderów zaznaczyć kilka elementów na raz, w tym który u siebie stworzyłem się nie da, przynajmniej przytrzymywanie klawisza CTRL nie pomaga.

Zależy mi na tym żeby stworzyć taki dialog, ktoś jeszcze ma może jakieś pomysły ? Z góry dzięki :)
P-105033
DejaVu
» 2014-02-20 22:06:44
Zazwyczaj wielokrotne zaznaczanie sprowadza się do ustawienia dodatkowych flag przy wywołaniu okna dialogowego.

/edit:
http://www.ssware.com/articles​/shbrowseforfolder-unmasked-everything-you-wanted-to-know-about-the-windows-folder-browser-component.htm

No Multiple Selection
The folder browser component does not allow multiple folders to be selected.

http:/​/social.msdn.microsoft.com​/Forums/vstudio/en-US​/5696279d-5914-4b70-bb44-37fd91​02ba7d​/want-to-choose-multiple-files​-and-folders-using-win32-api​?forum=vcgeneral

Więcej informacji:
Frazy, które należy wpisać w wyszukiwarkę google:
P-105034
xevuel
» 2014-02-20 22:14:23
Zresztą te rozwiązanie może nie zadziałaś, bo nie wiem czy uda się w takim dialogu do wyboru plików/folderów zaznaczyć kilka elementów na raz, w tym który u siebie stworzyłem się nie da, przynajmniej przytrzymywanie klawisza CTRL nie pomaga.
Od tego są checkboxy.

nie bardzo umiem podane przez Ciebie rozwiązania wykonać.
Napisz czego konkretnie nie wiesz albo nie rozumiesz, wyjaśnię.
P-105035
McAffey
Temat założony przez niniejszego użytkownika
» 2014-02-24 14:44:18
Sorki, że dopiero odpisuję, zająłem się innym elementem programu a ten dialog chwilowo zostawiłem tak jak jest.
Napisz czego konkretnie nie wiesz albo nie rozumiesz, wyjaśnię.
Miałem problem przy drugim punkcie, ale to bez znaczenia, bo doszedłem do wniosku że rozwiązanie z checkboxami niewiele mnie urządza, potrzebne mi jest rozwiązanie w którym można zaznaczać "przeciągnięciem" wiele folderów. Potrafisz doradzić chociaż koncepcję osiągnięcia takiego efektu ?
P-105190
xevuel
» 2014-02-24 17:05:56
Przeciągnięciem, czyli? Co, skąd i dokąd chcesz przeciągać? Tak czy inaczej, jeśli nie znasz zbyt dobrze WinAPI to przypuszczam że najprostszym wyjściem będzie stworzenie własnego dialogu.
P-105204
McAffey
Temat założony przez niniejszego użytkownika
» 2014-02-25 09:27:22
Przesunięciem czyli przytrzymaniem LPM i zaznaczaniem, lub przytrzymaniem np. Shifta i przytrzymaniem. Tak, zorientowałem się, że na te zadanie w WinAPI za słabo je znam, ale na chwilę obecną za tworzenie własnego dialogu też się nie biorę, bo to zadanie znacznie prostsze ale bardzo czasochłonne.

Za to znalazłem na stronie http://cboard.cprogramming.com​/windows-programming​/59282-%27browse-folder%27-dialog.html czyjeś rozwiązanie :

Looks like your problem's solved, but I'm attaching a class called CFolderDialog that you might find useful. Instead of a tree control (something I'm absolutely not a fan of), it looks like a standard CFileDialog (it is derived from it) but allows you to browse for files, folders, or both. It's not very well thrown together, but it works like a charm. It is originally from CodeGuru, but I threw some fixes in myself (as ugly as they may be).  Attached Files : CFolderDialog.zip

jednak nawet nie potrafię tego skompilować, kompilator wysypuje mnóstwo błędów :

||=== FolderBrowsing, Debug ===|
C:\Moje projekty\Programy\FolderBrowsing\CFolderDialog.h|17|error: expected class-name before '{' token|
C:\Moje projekty\Programy\FolderBrowsing\CFolderDialog.h|18|error: ISO C++ forbids declaration of 'DECLARE_DYNAMIC' with no type [-fpermissive]|
C:\Moje projekty\Programy\FolderBrowsing\CFolderDialog.h|18|error: expected ';' at end of member declaration|
C:\Moje projekty\Programy\FolderBrowsing\CFolderDialog.h|20|error: 'CString' does not name a type|
C:\Moje projekty\Programy\FolderBrowsing\CFolderDialog.h|21|error: 'BOOL' does not name a type|
C:\Moje projekty\Programy\FolderBrowsing\CFolderDialog.h|22|error: 'BOOL' does not name a type|
C:\Moje projekty\Programy\FolderBrowsing\CFolderDialog.h|24|error: 'UINT' does not name a type|
C:\Moje projekty\Programy\FolderBrowsing\CFolderDialog.h|26|error: 'WNDPROC' does not name a type|
C:\Moje projekty\Programy\FolderBrowsing\CFolderDialog.h|27|error: 'CString' has not been declared|
C:\Moje projekty\Programy\FolderBrowsing\CFolderDialog.h|28|error: 'CString' has not been declared|
C:\Moje projekty\Programy\FolderBrowsing\CFolderDialog.h|31|error: expected ')' before 'bSelectDlg'|
C:\Moje projekty\Programy\FolderBrowsing\CFolderDialog.h|36|error: 'CString' does not name a type|
C:\Moje projekty\Programy\FolderBrowsing\CFolderDialog.h|37|error: 'CString' does not name a type|
C:\Moje projekty\Programy\FolderBrowsing\CFolderDialog.h|38|error: 'BOOL' does not name a type|
C:\Moje projekty\Programy\FolderBrowsing\CFolderDialog.h|44|error: 'BOOL' does not name a type|
C:\Moje projekty\Programy\FolderBrowsing\CFolderDialog.h|48|error: 'BOOL' does not name a type|
C:\Moje projekty\Programy\FolderBrowsing\CFolderDialog.h|49|error: 'afx_msg' does not name a type|
C:\Moje projekty\Programy\FolderBrowsing\CFolderDialog.h|51|error: ISO C++ forbids declaration of 'DECLARE_MESSAGE_MAP' with no type [-fpermissive]|
C:\Moje projekty\Programy\FolderBrowsing\CFolderDialog.h|51|error: expected ';' at end of member declaration|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\DLGS.H|177|error: 'BYTE' does not name a type|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\DLGS.H|178|error: 'BYTE' does not name a type|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\DLGS.H|179|error: 'BYTE' does not name a type|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\DLGS.H|180|error: 'BYTE' does not name a type|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2500|error: typedef 'BOOL' is initialized (use decltype instead)|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2500|error: 'CALLBACK' was not declared in this scope|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2500|error: 'DLGPROC' was not declared in this scope|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2501|error: typedef 'VOID' is initialized (use decltype instead)|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2501|error: 'CALLBACK' was not declared in this scope|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2501|error: 'TIMERPROC' was not declared in this scope|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2502|error: typedef 'BOOL' is initialized (use decltype instead)|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2502|error: 'CALLBACK' was not declared in this scope|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2502|error: 'GRAYSTRINGPROC' was not declared in this scope|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2503|error: typedef 'LRESULT' is initialized (use decltype instead)|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2503|error: 'CALLBACK' was not declared in this scope|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2503|error: 'HOOKPROC' was not declared in this scope|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2504|error: typedef 'BOOL' is initialized (use decltype instead)|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2504|error: 'CALLBACK' was not declared in this scope|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2504|error: 'PROPENUMPROCA' was not declared in this scope|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2505|error: typedef 'BOOL' is initialized (use decltype instead)|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2505|error: 'CALLBACK' was not declared in this scope|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2505|error: 'PROPENUMPROCW' was not declared in this scope|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2506|error: typedef 'BOOL' is initialized (use decltype instead)|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2506|error: 'CALLBACK' was not declared in this scope|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2506|error: 'PROPENUMPROCEXA' was not declared in this scope|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2507|error: typedef 'BOOL' is initialized (use decltype instead)|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2507|error: 'CALLBACK' was not declared in this scope|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2507|error: 'PROPENUMPROCEXW' was not declared in this scope|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2508|error: expected ')' before '*' token|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2509|error: expected ')' before '*' token|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\WINUSER.H|2510|error: typedef 'LRESULT' is initialized (use decltype instead)|
||More errors follow but not being shown.|
||Edit the max errors limit in compiler options...|
||=== Build finished: 50 errors, 0 warnings (0 minutes, 30 seconds) ===|

Jedyne co zrobiłem to utworzyłem pusty projekt i tam dołączyłem, ściągnąłem pliki SFMLA których brak wyrzucał na początku kompilator, oraz jakieś pliki "stdafx.h" i "targetver.h" a potem zobaczyłem powyższą listę błędów. Jakieś rady ?
P-105237
« 1 » 2
  Strona 1 z 2 Następna strona