Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Izbor direktorija samo sa API

[es] :: C/C++ programiranje :: Izbor direktorija samo sa API

[ Pregleda: 2448 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

ljube
Ljubiša Knežević
Banjaluka

Član broj: 22429
Poruke: 158
81.93.74.*



+2 Profil

icon Izbor direktorija samo sa API22.06.2004. u 11:26 - pre 241 meseci
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
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
*.smin.sezampro.yu.

Jabber: DarkMan


Profil

icon Re: Izbor direktorija samo sa API22.06.2004. u 22:46 - pre 241 meseci
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?
 
Odgovor na temu

ljube
Ljubiša Knežević
Banjaluka

Član broj: 22429
Poruke: 158
*.dialup.blic.net



+2 Profil

icon Re: Izbor direktorija samo sa API23.06.2004. u 06:11 - pre 241 meseci
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
 
Odgovor na temu

idb
Ivan Bulic
Beograd

Član broj: 4436
Poruke: 402



Profil

icon Re: Izbor direktorija samo sa API23.06.2004. u 08:39 - pre 241 meseci
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;
}
 
Odgovor na temu

[es] :: C/C++ programiranje :: Izbor direktorija samo sa API

[ Pregleda: 2448 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.