Skocz do zawartości

[C++] WinAPI, wybranie kilku plikow z open dialog


gong

Polecane posty

Mam dwa pytania dotyczące WinApi:

1) W przykłądzie poniżej wykorzystuje Open Dialog do wyboru pliku i wysłania jego nazwy pliku w Edicie(utworzony jako multiline);

Użytkownik wybiera plik(np po ustaleniu filtra)

No ale chcialbym wybrać kilka plików i pojawia się problem...bo nie wiem jak? Mógłbym wykorzystać ListBoxa i kazdorazowo Otwierac okno dialogowe i wybierac nazwe 1 pliku, ale nie oto mi chodzi...Proszę o pomoc...

 

2) Jak wysłąc text do kolejnej lini w Edicie (przeskoczyc wiersz) ..próbowałem w stringu umieścić "\n" ale bez skutecznie...Oczywiście utworzony Edit jest Multiline..Np w ListBoxie jest to rozwiązane tak:

SendMessage(lb01, LB_ADDSTRING, 0, (LPARAM)"1");

 

Dziekuje za pomoc...

 

    //tworzę edita
    HWND hEdit = CreateWindowEx(WS_EX_ACCEPTFILES,L"EDIT", L"", 
                       WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL| WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 
                       100, 250, 350, 150, hWnd, (HMENU)601, NULL, NULL);
   //wykorzystuje open dialog by wybrac plik
   OPENFILENAME ofn;
   TCHAR szFileName[MAX_PATH] = L"";

   ZeroMemory(&ofn, sizeof(ofn));
   ofn.lStructSize = sizeof(ofn); 
   ofn.hwndOwner = hWnd;
   ofn.lpstrFilter = L"Text Files (*.txt)*.txtAll Files (*.*)*.*\";
   ofn.lpstrFile = szFileName;
   ofn.nMaxFile = MAX_PATH;
   ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
   ofn.lpstrDefExt = L"txt";

   if(GetOpenFileName(&ofn))
   { 
               SetDlgItemText(hWnd, 601, szFileName);//wysyłąm nazwe pliku do Edita
       }

Link do komentarza
Udostępnij na innych stronach

No ale chcialbym wybrać kilka plików i pojawia się problem...bo nie wiem jak?

 

Dodajemy flagę: OFN_ALLOWMULTISELECT

 

ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT;

 

Pozdrawiam!

 

@Edit: użyj \r\n zamiast \n LINK.

Link do komentarza
Udostępnij na innych stronach

Dziękuje za podpowiedź...ale nadal mam problem.

 

Otórz jak z ofn.Flags zlikwiduje OFN_EXPLORER i dodam oczywiście OFN_ALLOWMULTISELECT

Otworze dialog i wybiore pliki to wtedy mam w edicie:

 

\DOCUME~1\MLz\MOJEDO~1\ apartaments.txt data.txt

 

Mogę napisać fukcje pobierająca nazwy plików, bo są oddzielone spacjami..no i wydawać by się moglo że HURRA

ale chcialbym jednak pozostać przy:

 

OFN_EXPLORER i by moim buforem byla tablica nazw plików.

 

//tak to wygląda po modyfikacji

OPENFILENAME ofn;
   ZeroMemory(&ofn, sizeof(ofn));

   ofn.lStructSize = sizeof(ofn);
   ofn.hwndOwner = hWnd;
   ofn.lpstrFilter = L"Text Files (*.txt)*.txtAll Files (*.*)*.*\";

     TCHAR strFiles[MAX_PATH] = {0};
     ofn.lpstrFile = strFiles;
     ofn.nMaxFile = MAX_PATH;

   ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY |OFN_ALLOWMULTISELECT;
   ofn.lpstrDefExt = L"txt";

   if(GetOpenFileName(&ofn))
   {
               SetDlgItemText(hWnd, 601, strFiles);
       }
%ŹŻ(ł<z')HŃ[QX[ĘQKSSŃSÓUSTŃSPSS
NÓPVSHH MMHX^WX^[HHPVSNH]ÓPVSWNW
[HHW[VHHS[T]HÓ[[

NYT]OHQĘB[[HUSÓH]][
N[H
   HS
B]^][YJĘN[
ĘB[X]
       ][X[H[Y        Y[L][[
NYYYP
NB[HYT]OHQSŃS
BYYYP
       ][[[     ][ĘN

 

http://msdn.microsoft.com/en-us/library/ms646839(VS.85).aspx

Bardzo dziękuje za wszelką pomoc...

Link do komentarza
Udostępnij na innych stronach

Heyka :)

 

jeśli nie używasz flagi: OFN_EXPLORER

 

czyli odbierasz skrócone nazwy plików, to możesz wyłuskać sobie je w ten sposób:

 

       if(GetOpenFileName(&ofn))
       {
        int y=0;
        int t=0;
        TCHAR SciezkaDoPliku[MAX_PATH] = "";
        TCHAR NazwaPliku[MAX_PATH] = "";

        for(int x=0;x<strlen(szFileName);x++)
        {
         if(szFileName[x]!=' ')
         {
          NazwaPliku[y]=szFileName[x];
          y++;
         } else
         {
          if(t==0)
          {
               int xx;
               for(xx=0;xx<strlen(NazwaPliku);xx++)
               {
                SciezkaDoPliku[xx]=NazwaPliku[xx];
               }
               SciezkaDoPliku[xx]='\\';
               SciezkaDoPliku[xx+1]='�';                
               t++;
               y=0;
          } else
          {
               NazwaPliku[y]='\r';
               NazwaPliku[y+1]='\n';
               NazwaPliku[y+2]='�';
               SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) SciezkaDoPliku);
               SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) NazwaPliku);
               y=0;
          }
         }
        }
        SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) SciezkaDoPliku);
        SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) NazwaPliku);
       }

 

Kod nie jest pierwszej jakości i może zawierać masę błędów ponieważ pisałem go w pośpiechu

 

i jestem za leniwy, aby mu się przyglądać :lol:

 

Pozdrawiam!

 

PS oczywiście u mnie działa poprawnie :rolleyes: przynajmniej tak mi się wydaje :rolleyes:

Link do komentarza
Udostępnij na innych stronach

Ja napisałem wcześniej rozwiązanie bez flagi EXPLORER może się komuś przyda..natomiast rozwiązania najlepszego nadal nie mam...

To tylko analiza stringa i wysyłąnie nazw plków do ListBoxa..przy czym w linii jest pełna ścieżka do katalogu...a dalej wybrane pliki.

 

                       int n=0;
                       string list[10];

                       path2files(str,list,n);

                       FILE *plik=NULL;
                       fopen_s(&plik,"test.txt","w");
                       for (int i=0;i<n;i++)
                       {
                               SendMessageA(lb01, LB_ADDSTRING, 0, (LPARAM)list[i].c_str());
                               fprintf (plik, "path: %s\n", list[i].c_str());
                       }

void path2files(char *str,string list[],int &z)
{
       static int n=0;
       while (pos>0)
       {
                       char *bufer=new char[256];
                       pos=str1.find(' ',0);
                       int len=str1.copy(bufer,pos,1);
                       bufer[len]='';
                       list[n]=bufer;
                   str1.erase(1,pos);
                       delete[] bufer;
                       n++;
       }
       z=n;
};

 

Aha no i nadal nie wiem jak przejść do nowego wiersza w MULTIEDICIE...np chce zapisac 2 stringi w 2 linijkach Editu...to jest zdecydowanie prostsze..już zacząłem szukać..ale jakby ktoś pamiętał...z góry dziękuje...

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...