[ ljube @ 22.06.2004. 11:26 ] @
Zdravo,
da li neko zna za neki primjer kako izabrati samo folder.
Moj program ne koristi MFC ili nesto slicno, znaci obican API.

Pokusao sam sa SHBrowseForFolder ali iz nekog razloga program "puca".

Da li neko ima gotov primjer?


Pozdrav,
Ljubisa
[ DarkMan @ 22.06.2004. 22:46 ] @
Code:

#include <shlobj.h>

void _SHFree(void *p)
{
    IMalloc *pm;
    SHGetMalloc(&pm);
    if(pm) {
        pm->Free(p);
        pm->Release();
    }
}

BOOL BrowseDirectory(LPCSTR szTitle, LPSTR buffer, INT size, HWND hwnd)
{
    BROWSEINFO BI;
    ITEMIDLIST *pidl = NULL;
    memset(buffer,0,size);
    memset(&BI,0,sizeof(BI));

    BI.pidlRoot = NULL;
    BI.hwndOwner = hwnd;
    BI.lpszTitle = szTitle;
    BI.ulFlags = BIF_RETURNONLYFSDIRS;
    pidl = SHBrowseForFolder(&BI);
    if(pidl == NULL) return FALSE;
    BOOL Result = SHGetPathFromIDList(pidl, buffer);
    _SHFree(pidl);
    if(Result == FALSE) return FALSE;
    int l = strlen(buffer);
    if(buffer[l-1] != '\\') { buffer[l] = '\\'; buffer[l+1] = 0; }
    return TRUE;
}


Jedino sto nikada nisam provalio kako da postavim default direktorijum koji ce se prikazati po otvaranju dijaloga. Sa gore navedenim kodom uvek je prvo selektovan root (mislim da je root "My Computer" a ne root za C:\).
Zna li neko kako to postici?
[ ljube @ 23.06.2004. 06:11 ] @
Mnogo hvala!

Nisam jos stigao da probam ali u mom primjeru koji je "pucao" nakon izbora direktorija
ima sledeci dio koda koji postavlja default direktorij.

<code>
BI.lpfn = &BrowseCallbackProc; // dodati BI strukturi pokazivac na callback funkciju.



int __stdcall BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData )
{
if(uMsg==BFFM_INITIALIZED)
{
// LastDirPath je global varijabla koja sadrzi default dir
SendMessage(hwnd,(UINT)BFFM_SETSELECTION,(WPARAM)TRUE,(LPARAM)(LPCTSTR)LastDirPath);
}
return 0;
}

</code>


Pozdrav,
Ljubisa
[ idb @ 23.06.2004. 08:39 ] @
Ne tako davno sam i ja imao ovaj problem.
Evo resenja koje meni obavlja posao (samo WInWPI32), a mogu da biram defalut folder koji ce se otvoriti:
Code:
// Zbog "MyBrowseForFolder" dodati linker opciju:   -lole32
// Windows 2000, Dev-C++ 4.9.8.9
#include <windows.h>
#include<shlobj.h>

char  szSelectedPath[MAX_PATH];

int CALLBACK MyBrowseCallbackProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData){
   if (uMsg == BFFM_INITIALIZED) {SendMessage(hWnd, BFFM_SETSELECTION, TRUE, lpData);}
   return 0;
}

bool MyBrowseForFolder(HWND hWnd, const char* szInitialPath, const char* szTitle, char* szSelectedPath)
{
   BROWSEINFO  bi;
   char        szDisplayName[MAX_PATH];
   bool        bRetVal = false;
   IMalloc*    pMalloc;
   *szSelectedPath = 0;
   CoInitialize(NULL);
   SHGetMalloc(&pMalloc);
   bi.hwndOwner = hWnd;
   bi.pidlRoot = NULL;
   bi.pszDisplayName = szDisplayName;
   bi.lpszTitle = szTitle;
   bi.ulFlags = BIF_RETURNONLYFSDIRS|BIF_USENEWUI;
   bi.lpfn = MyBrowseCallbackProc;
   bi.lParam = (LPARAM) szInitialPath;    // ovde je inicijalni folder 
   bi.iImage = 0;
   LPITEMIDLIST pidl = SHBrowseForFolder(&bi);

   if (pidl != NULL) {
      if (SHGetPathFromIDList(pidl, szSelectedPath)) {
         bRetVal = true;
      }
      pMalloc->Free(pidl);
   }
   pMalloc->Release();
   CoUninitialize();
   return bRetVal;
}

void IzaberiFolder(){
   if (MyBrowseForFolder(NULL, "c:\\Dev-Cpp", "Izaberite Folder sa Podacima", szSelectedPath))
      MessageBox(NULL,szSelectedPath,"Izabrali ste folder:",MB_OK);
}

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{
    IzaberiFolder();
   MessageBox(NULL,szSelectedPath,"PONAVLJAM: Izabrali ste folder:",MB_OK);
    return 0;
}