CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - OpenDialog do wczytywania wielu folderów.

OpenDialog do wczytywania wielu folderów.

dział ogólny

OpenDialog do wczytywania wielu folderów.

Nowy postprzez pablocool » czwartek, 23 września 2010, 13:51

Witam serdecznie,

Zacznę od tego, że na stronie http://cyfbar.republika.pl/ goszczę bardzo często od dawna, ponieważ zawarte tam materiały są na prawdę pierwsza klasa.

A teraz już mówię w czym rzecz. Generanie nad problemem spędziłem wiele godzin bez większych rezultatów. Otóż piszę dość prostą aplikację, za pomocą OpenDialog pobieram nazwy plików mp3 i cue (pliki te zawierają informacje o utworach zawartych w pliku mp3) i wrzucam je do Memo. Obrabiam sobie, zapisuje i wszystko ładnie. Dalej dzielę pliki mp3 przy użyciu spreparowanych plików cue za pomocą innej aplikacji. Pozostaje jedynie pozmieniać nazwy folderów wg określonego schematu. I tu zaczyna się problem.

Jak pobrać wiele nazw katalogów za pomocą kontrolki OpenDialog (lub innej) i wrzucić te nazwy do memo? Kiedy zaznaczam wiele katalogów i klikam otwórz to kontrolka OpenDialog wchodzi do ostatniego zaznaczonego katalogu i można dalej zaznaczać. (co jest zrozumiałe - kontrolka ta oczekuje plików).

Gdzieś znalazłem, że problem może rozwiązać zestaw kontrolek jvcl (JEDI Visual Component Library) http://jvcl.delphi-jedi.org/ Rzeczywiście znajduje się tam kontrolka TJvSelectDirectory jednak jest to zlepek kontrolek znanych z RAD2010 i starszych z zakładki Win3.1. Jednak kontrolka ApOpenDialog również z JVCL posiada ciekawą możliwość:

ApOpenDialog1->SelectedSubfolders->Count
ApOpenDialog1->SelectedSubfolders->Strings[]

w momencie gdy użyłem EVENTu SelectionChange i powyższych właściwości rzeczywiście udało mi się łapać w memo nazwy zaznaczanych katalogów, ale niepoprawnie - ApOpenDialog1->SelectedSubfolders->Strings[] przy zaznaczeniu kilku katalogów nie zawierały nazw tych katalogów tylko nazwę pierwszego zaznaczonego (DZIWNE:|)

Znalazłem coś co działa idealnie. JEdnak jest to projekt z Visual C++ i nie umiem przerobić tego na borlanda :/ Projekt i exe przykładowe w załączniku. Będę wdzięczny za wszelkie sugestie - pomysły na przerobienie tego projektu lub inne. Korzystam z RAD2010.

pozdrawiam
pablo
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
pablocool
Bladawiec
Bladawiec
 
Posty: 7
Dołączył(a): czwartek, 23 września 2010, 12:34
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP/7, Ubuntu
Kompilator: RAD 2010
Gadu Gadu: 0
    Windows XPOpera

Re: OpenDialog do wczytywania wielu folderów.

Nowy postprzez Cyfrowy Baron » czwartek, 23 września 2010, 14:07

By mieć pewność... Chcesz w jakimś oknie dialogowym otworzyć jakiś katalog, lub dysk, w którym będzie widać kilkanaście katalogów (podkatalogów), TY pozaznaczasz, które będziesz chciał, a potem wybrane dodasz do listy np. typu TListBox, tak?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: OpenDialog do wczytywania wielu folderów.

Nowy postprzez pablocool » czwartek, 23 września 2010, 14:15

Dokładnie o to chodzi. Otwieram OpenDialog (lub podobne lub coś zupełnie inne np a API nie ma znaczneia) Zaznaczam pare katalogów, klikam otwórz i ścieżki lub nazwy tych katalogów lądują w TListBox lub TMemo.

Proponuję zajrzeć do pliku załącznika. Tam jest skompilowany exe w MFC który robi dokładnie to co bym chciał, tyle że tam można zaznaczać pliki i/lub katalogi (dla mnie pliki są zbędne i filtrem bym je nawet uniewidocznił)
Avatar użytkownika
pablocool
Bladawiec
Bladawiec
 
Posty: 7
Dołączył(a): czwartek, 23 września 2010, 12:34
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP/7, Ubuntu
Kompilator: RAD 2010
Gadu Gadu: 0
    Windows XPOpera

Re: OpenDialog do wczytywania wielu folderów.

Nowy postprzez Cyfrowy Baron » czwartek, 23 września 2010, 15:57

Nie znalazłem, żadnych gotowych rozwiązań pozwalających na zaznaczanie i wybieranie w oknie dialogowym kilku katalogów. Znalazłem dwie funkcje oferujące okno dialogowe do wybierania katalogów, są to: SelectDirectory i SHBrowseForFolder, jednak te funckje pozwalają wybierać tylko pojedyncze katalogi.
Co się tyczy przykładu z załącznika, to został on opracowany dla innego środowiska i z C++Builder nie jest zgodny. Dałoby się pewnie zrobić coś podobnego, ale wymagałoby to drobiazgowej analizy kodu. Skoro to projekt w VC++ to być może polymorphism będzie potrafił coś z tym zrobić.
Jedyne co znajduję w środowisku C++Builder, to komponenty TDriveComboBox i TDirectoryListBox, z których można takie okno dialogowe sobie zmontować.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: OpenDialog do wczytywania wielu folderów.

Nowy postprzez pablocool » czwartek, 23 września 2010, 16:20

Dzięki za wkład. Niestety, kontrolki które podałeś znam i nie załatwią problemu. Żeby jeszcze była jakaś kontrolka do wyświetlania katalogów tyle że nie w drzewie a w stylu jak OpenDialog. No nic napiszę do urzytkownika, którego wskazałeś.
Avatar użytkownika
pablocool
Bladawiec
Bladawiec
 
Posty: 7
Dołączył(a): czwartek, 23 września 2010, 12:34
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP/7, Ubuntu
Kompilator: RAD 2010
Gadu Gadu: 0
    Windows XPOpera

Re: OpenDialog do wczytywania wielu folderów.

Nowy postprzez Cyfrowy Baron » czwartek, 23 września 2010, 16:40

Mam pomysł na dodawanie wielu katalogów, ale pojedynczo. Czyli otwierasz okno dialogowe do wyboru katalogów, a następnie zaznaczasz w nim jakiś katalog, klikasz na przycisku Dodaj, potem zaznaczasz kolejny katalog, znów klikasz Dodaj i tak z każdym katalogiem, który chcesz dodać. Różnica polega na tym, że okno dialogowe po dodaniu katalogu nie zamyka się, czyli można dodawać kolejne katalogi, aż do przerwania przyciskiem anuluj. Jeżeli to rozwiązanie Ciebie zadowala to mogę je podać.

Żeby jeszcze była jakaś kontrolka do wyświetlania katalogów tyle że nie w drzewie a w stylu jak OpenDialog


W przypadku DirectoryListBox to nie jest tak do końca drzewo, a raczej lista.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: OpenDialog do wczytywania wielu folderów.

Nowy postprzez pablocool » czwartek, 23 września 2010, 16:48

Jak mówią lepszy rydz niż nic więc zapodaj. W każdym razie metoda dobra na krótką metę - wyobraźmy sobie katalog z którego chcemy wybrać 100 podkatalogów z 200 możliwych ;)
Avatar użytkownika
pablocool
Bladawiec
Bladawiec
 
Posty: 7
Dołączył(a): czwartek, 23 września 2010, 12:34
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP/7, Ubuntu
Kompilator: RAD 2010
Gadu Gadu: 0
    Windows XPOpera

multiple select directory

Nowy postprzez Cyfrowy Baron » czwartek, 23 września 2010, 17:05

No więc dobrze. Po pierwsze w opcjach (menu: Project -> Options) w sekcji Directories and Conditionals musisz usunąć wpis STRICT lub NO_STRICT, a zamiast niego dodać wpis NO_WIN32_LEAN_AND_MEAN:

opcje.png


A dalej to już tylko kod:

KOD cpp:     UKRYJ  
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <shlobj.h>
#include <objbase.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

#if defined(_MSC_VER)
#pragma comment(lib, "shell32.lib")
#pragma comment(lib, "ole32.lib")
#endif
//---------------------------------------------------------------------------
struct
{
    WNDPROC oldWndProc;
    TCHAR   szLastSelection[MAX_PATH];
    UINT    cFolders;
} g_Multi;

static LRESULT CALLBACK SubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam,
LPARAM lParam)
{
    if (uMsg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED)
    {
        TCHAR szText[50];

        if (GetWindowText((HWND) lParam, szText, 50) &&
            0 == lstrcmp(szText, TEXT("Dodaj Katalog")))
        {
            if (0 != lstrcmp(g_Multi.szLastSelection, TEXT("")))
            {
                g_Multi.cFolders++;
                Form1->Memo1->Lines->Add(g_Multi.szLastSelection);
            }
            else
            {
              ShowMessage("Spróbuj wybrać jeszcze raz jakiś istniejący katalog.");
            }

            return 0;
        }
    }


    return CallWindowProc(g_Multi.oldWndProc, hwnd, uMsg, wParam, lParam);
}
//---------------------------------------------------------------------------
static int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam,
LPARAM lpData)
{
    switch (uMsg)
    {
        case BFFM_INITIALIZED:
        {
            SendMessage(hwnd, BFFM_SETOKTEXT, 0, (LPARAM) L"Dodaj Katalog");
            g_Multi.oldWndProc = (WNDPROC) SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR) SubclassProc);
            break;
        }

        case BFFM_SELCHANGED:
        {
            if (!SHGetPathFromIDList((LPCITEMIDLIST) lParam, g_Multi.szLastSelection))
                g_Multi.szLastSelection[0] = TEXT('\0');
            break;
        }
    }

    return 0;
}
//---------------------------------------------------------------------------
void MultiFolderSelect(HWND hWnd, LPCTSTR szTitle)
{
    LPITEMIDLIST pidl  = NULL;
    Shlobj::BROWSEINFO bInfo  = { 0 };
    TCHAR Buf[MAX_PATH];

    bInfo.hwndOwner      = hWnd;
    bInfo.pszDisplayName = Buf;
    bInfo.pidlRoot       = NULL;
    bInfo.lpszTitle      = szTitle;
    bInfo.ulFlags        = BIF_RETURNONLYFSDIRS;// | BIF_USENEWUI;
    bInfo.lpfn           = BrowseCallbackProc;

    g_Multi.cFolders           = 0;
    g_Multi.szLastSelection[0] = TEXT('\0');

    if ((pidl = SHBrowseForFolder(&bInfo)) != NULL)
        CoTaskMemFree(pidl);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  CoInitialize(NULL);

  MultiFolderSelect(NULL, TEXT("Dodaj katalogi."));

  CoUninitialize();
}
 
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: OpenDialog do wczytywania wielu folderów.

Nowy postprzez pablocool » czwartek, 23 września 2010, 18:51

No rzeczywiście działa. Trzeba tylko odkomentować linijkę:

LPITEMIDLIST pidl = NULL;

W każdym razie dziękuję za pomoc. Niemniej jednak temat uważam za dalej otwarty bo rozwiązanie problemu jest niestety tylko częściowe.

PS: Chciałbym się tylko dowiedzieć jakie znaczenie ma "NO_WIN32_LEAN_AND_MEAN". Zauważyłem, że bez tego program wysypuje sie na linii:

Shlobj::BROWSEINFO bInfo = { 0 };
Avatar użytkownika
pablocool
Bladawiec
Bladawiec
 
Posty: 7
Dołączył(a): czwartek, 23 września 2010, 12:34
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP/7, Ubuntu
Kompilator: RAD 2010
Gadu Gadu: 0
    Windows XPOpera

Re: OpenDialog do wczytywania wielu folderów.

Nowy postprzez Cyfrowy Baron » czwartek, 23 września 2010, 19:59

Chciałbym się tylko dowiedzieć jakie znaczenie ma "NO_WIN32_LEAN_AND_MEAN". Zauważyłem, że bez tego program wysypuje sie na linii:


Nie wiem co to znaczy, ale wiem, że naprawia błąd związany z biblioteką shlobj.h
Brak jakichkolwiek informacji na temat tego makra.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: OpenDialog do wczytywania wielu folderów.

Nowy postprzez polymorphism » czwartek, 23 września 2010, 20:42

pablocool napisał(a):PS: Chciałbym się tylko dowiedzieć jakie znaczenie ma "NO_WIN32_LEAN_AND_MEAN".

WIN32_LEAN_AND_MEAN służy do zmniejszenia czasu kompilacji poprzez wyłączenie niektórych nagłówków. Daje także możliwość wyłączania innych modułów, np. GDI. Podejrzewam, że NO_WIN32_LEAN_AND_MEAN daje efekt przeciwny.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: OpenDialog do wczytywania wielu folderów.

Nowy postprzez pablocool » czwartek, 23 września 2010, 20:47

Dzięki, a czy mógłbyś rzucić okiem na kod z załącznika z pierwszego postu. Generalnie nie znam sie na VC++ i zastanawiam się czy jest techniczna możliwość przepisania tego kodu na kod Buildera 2010.
Avatar użytkownika
pablocool
Bladawiec
Bladawiec
 
Posty: 7
Dołączył(a): czwartek, 23 września 2010, 12:34
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP/7, Ubuntu
Kompilator: RAD 2010
Gadu Gadu: 0
    Windows XPOpera

Re: OpenDialog do wczytywania wielu folderów.

Nowy postprzez polymorphism » piątek, 24 września 2010, 14:40

Dobra, zaszalałem. Z reguły nie robię takich rzeczy, ale...

KOD cpp:     UKRYJ  
class COpenFileDirDialog
{
public:
    typedef std::vector<std::wstring> file_vec_t;

    COpenFileDirDialog(HWND hwnd,const wchar_t *InitialDir)
        :m_parent(hwnd)
    {
        if(InitialDir)
            m_initial_dir = m_initial_dir;
    }


    bool Execute()
    {
        OPENFILENAMEW ofn;
        wchar_t buff[1] = {0};

        memset(&ofn,0,sizeof(ofn));

        ofn.lStructSize = sizeof(ofn);
        ofn.hwndOwner = m_parent;
        ofn.lpstrInitialDir = m_initial_dir.c_str();
        ofn.lpstrFilter = L"\0*.*\0\0";
        ofn.Flags = OFN_EXPLORER | OFN_ALLOWMULTISELECT | OFN_ENABLEHOOK | OFN_HIDEREADONLY;
        ofn.lpstrFile = buff;
        ofn.nMaxFile = 1;
        ofn.lpfnHook = &hook_proc;
        ofn.lCustData = (LPARAM)this;

        m_files.clear();

        return GetOpenFileNameW(&ofn) == TRUE;
    }

    void GetFiles(file_vec_t &files)
    {
        files = m_files;
    }

private:

    bool get_filenames(HWND hwnd,file_vec_t &list)
    {
        IShellBrowser* psb = (IShellBrowser*) SendMessage(hwnd,WM_USER + 7, 0, 0L);
        if(!psb)return false;

        IShellView*        psv;
        IDataObject*    pdo;

        if(FAILED(psb->QueryActiveShellView(&psv)))return false;

        if(FAILED(psv->GetItemObject(SVGIO_SELECTION,IID_IDataObject,(void**)&pdo)))
        {
            psv->Release();
            return false;
        }

        FORMATETC fmt;
        STGMEDIUM medium;

        fmt.cfFormat = CF_HDROP;
        fmt.ptd = NULL;
        fmt.dwAspect = DVASPECT_CONTENT;
        fmt.lindex = -1;
        fmt.tymed = TYMED_HGLOBAL;

        if(SUCCEEDED(pdo->GetData(&fmt,&medium)))
        {
            DROPFILES* df = (DROPFILES*)GlobalLock(medium.hGlobal);

            if(df->fWide)
            {
                WCHAR *fn = (WCHAR*) (((BYTE*)df) + df->pFiles);
                std::wstring text;

                while(*fn)
                {
                    text = (wchar_t*)fn;
                    fn += text.size() + 1;
                    list.push_back(text);
                }
            }
            else
            {
                CHAR *fn = (((CHAR*)df) + df->pFiles);

                std::locale loc(".ACP");
                const std::ctype<wchar_t> &ct = std::use_facet<std::ctype<wchar_t> >(loc);
                std::wstring text;

                while(*fn)
                {
                    text.clear();

                    while(*fn)
                    {                
                        text.push_back(ct.widen(*fn++));
                    }

                    list.push_back(text);
                    ++fn;
                }
            }

            GlobalUnlock(medium.hGlobal);
            ReleaseStgMedium(&medium);
        }

        pdo->Release();
        psv->Release();
        return true;
    }

    static UINT_PTR CALLBACK hook_proc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
    {
        if(uiMsg == WM_INITDIALOG)
        {
            COpenFileDirDialog *_this = (COpenFileDirDialog*)((OPENFILENAME*)lParam)->lCustData;
            SetWindowLong(GetParent(hdlg),GWL_USERDATA,(LONG)_this);
            _this->m_old_proc = (WNDPROC)SetWindowLong(GetParent(hdlg),GWL_WNDPROC,(LONG)&new_wnd_proc);

            ShowWindow(GetDlgItem(GetParent(hdlg),0x47c),SW_HIDE);
            ShowWindow(GetDlgItem(GetParent(hdlg),0x470),SW_HIDE);
            ShowWindow(GetDlgItem(GetParent(hdlg),0x442),SW_HIDE);
            ShowWindow(GetDlgItem(GetParent(hdlg),0x441),SW_HIDE);
            return TRUE;
        }

        return 0;
    }


    static LRESULT CALLBACK new_wnd_proc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
        COpenFileDirDialog *_this = (COpenFileDirDialog*)GetWindowLong(hwnd,GWL_USERDATA);

        if (uMsg == WM_COMMAND)
        {
            if (HIWORD(wParam) == BN_CLICKED)
            {
                if(LOWORD(wParam) == IDOK)
                {
                    if(_this->get_filenames((hwnd),_this->m_files) && !_this->m_files.empty())
                    {
                        EndDialog(hwnd,IDOK);
                    }
                    return 0;
                }
            }
        }

        return CallWindowProc(_this->m_old_proc,hwnd,uMsg,wParam,lParam);
    }

private:
    WNDPROC            m_old_proc;
    HWND            m_parent;
    std::wstring    m_initial_dir;
    file_vec_t        m_files;
};


KOD cpp:     UKRYJ  
COpenFileDirDialog dlg(GetDesktopWindow(),L"e:\\");

if(dlg.Execute())
{
        COpenFileDirDialog::file_vec_t f;

        dlg.GetFiles(f);

        wcout.imbue(locale(".852"));
        for(int i = 0; i < f.size(); ++i)
        {
                wcout << f[i] << L'\n';
        }
}

Nie jest to taki sam dialog jak w aplikacji, którą podałeś, ale foldery można wybierać. Dialog jest w wersji unikodowej...

___
p.s. Całość była pisana na szybko, więc mogą pojawić się błędy, których nie zauważyłem.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: OpenDialog do wczytywania wielu folderów.

Nowy postprzez pablocool » piątek, 24 września 2010, 19:15

Jestem pod ogromnym wrażeniem! bardzo dziękuję, działa dokładnie jak chciałem:)

PS trzeba dodać
NO_WIN32_LEAN_AND_MEAN do Conditional Defines (pokazane wyżej na obrazkach) bo inaczej nie kompiluje.

PS2 Czy mogłbyś powiedzieć czy, a jeśli tak to z jakich materiałów korzystałeś pisząc tą klasę?
Avatar użytkownika
pablocool
Bladawiec
Bladawiec
 
Posty: 7
Dołączył(a): czwartek, 23 września 2010, 12:34
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP/7, Ubuntu
Kompilator: RAD 2010
Gadu Gadu: 0
    Windows XPOpera

Re: OpenDialog do wczytywania wielu folderów.

Nowy postprzez polymorphism » piątek, 24 września 2010, 21:45

działa dokładnie jak chciałem

Jest tam jeden szkopuł, który delikatnie mówiąc mnie denerwuje. Jeśli fokus jest na ListView, w którym zaznaczony jest jakiś plik, to naciśnięcie enter powoduje zamknięcie okna, ale tak, jakby naciśnięty został przycisk anuluj. I szczerze mówiąc nie wiem, dlaczego tak się dzieje :o Inna ciekawa rzecz to to, że nie mam komunikatu CDN_FILEOK, nawet jeśli dam domyślną obsługę BN_CLICKED.


PS2 Czy mogłbyś powiedzieć czy, a jeśli tak to z jakich materiałów korzystałeś pisząc tą klasę?

Niezastąpiony Platform SDK (plus pewne doświadczenie z dialogami i powłoką systemową).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości

cron