Verzeichnisse



  • Hallo C++-ler.
    Ihr kennt doch sicher, dass wenn ihr beim Installieren seid, ein Button für das Suchen des Installationsordners kommt. Ich möchte jetzt aber gerne noch alle Dateien eines bestimmten Typs anzeigen lassen. Wisst ihr wie man so etwas machen kann bzw. habt ihr so etwas schon einmal gemacht? Für Codesnips wäre ich sehr dankbar.

    Mfg Ominion



  • Nimm doch die CommonDialogBox, die du mit GetOpenFileName erstellst.

    Da kannst du doch Filter mit angeben.



  • Meinst du mit der CommonDialogBox eine "normale" DialogBox? Ich habe unter MSDN darunter nichst finden könne.

    Mfg Ominion



  • Die Commonteile sind vorgefertigte Dialogboxen für Standardaufgaben wie Druckereinstellungen oder Dateiauswahl.
    Damit nicht jede Anwendung das selbst machen muss und der Anwender sich leichter zurechtfindet.

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/commondialogboxlibrary/commondialogboxreference/commondialogboxfunctions/getopenfilename.asp



  • Danke, SeppSchrot. Ich probier es mal.

    Mfg Ominion



  • Also ich habe jetzt ein Problem festgestellt. Ich hab jetzt geguckt was wie wo rein muss, aber finde es nicht richtig heraus. Hast du ein konkretes Beispiel für diese "OPENFILENAME Structure"?

    Mfg Ominion



  • For an example, see Opening a File.



  • Danke jetzt funktioniert es.

    Mfg Ominion



  • Ich habe jetzt versucht den Pfad an ein Editfeld zu übergeben. Ich habe es jetzt schon mit SendMessage() und SetWindowText() probiert, hat aber alles nicht geklappt. Weiß jemand wie das geht?

    Mfg Ominion



  • Wie hast du es denn probiert?



  • Tschuldigung, dass ich erst jetzt antworte aber ich hatte noch anderweitige Verpflichtungen.
    Jetzt zu der Frage:
    So

    if (GetOpenFileName (&ofn) == true)
    {
        hf = CreateFile(ofn.lpstrFile, GENERIC_READ, 0, (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);
        SetWindowText (hFile, hf);
    }
    

    So, oder so ähnlich

    SetWindowText (hFile, (LPCSTR)GetOpenFileName (&ofn))
    

    Die SendMessage()-Varianten weiss ich leider nicht mehr. Aber trotzdem ist das meiner Meinung nach nicht relevant, da wenn jemand eine funktionierende Möglichkeit kennt oder wusste, kann er die ja auch hier rein stellen bzw. einen Lösungsansatz posten.

    Mfg Ominion



  • Im Erfolgsfalle liegt der Pfad der Datei in einem Speicherbereich, auf den
    ofn.lpstrFile zeigt.

    Was denkst du dir hierbei 😕

    SetWindowText (hFile, (LPCSTR)GetOpenFileName (&ofn))
    

    Sieh nochmal nach, was GetOpenFileName zurückliefert.



  • Danke. Ich weiß was GetOpenFileName zurück liefert. Das war mehr oder weniger eine Verzweiflungstat, da ich nicht mehr weiter wusste.

    Mfg Ominion



  • Ich habe jetzt noch ein Problem: Ich habe meinen Code wieder kompiliert und immer wenn ich jetzt auf den Button drücke, öffnet sich die DialogBox nicht. Hier mal der Code:

    LRESULT CALLBACK WndProc (HWND hWnd1, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	OPENFILENAME ofn;
    	char szFile[260];
    	HWND hwnd;
    	HANDLE hf;
    
    	ZeroMemory(&ofn, sizeof(ofn));
    	ofn.lStructSize = sizeof(ofn);
    	ofn.hwndOwner = hwnd;
    	ofn.lpstrFile = szFile;
    
    	ofn.lpstrFile[0] = '\0';
    	ofn.nMaxFile = sizeof(szFile);
    	ofn.lpstrFilter = "Alle\0*.*\0Mp3\0*.mp3\0";
    	ofn.nFilterIndex = 1;
    	ofn.lpstrFileTitle = NULL;
    	ofn.nMaxFileTitle = 0;
    	ofn.lpstrInitialDir = NULL;
    	ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    
    	PAINTSTRUCT ps;
    	HDC hDC;
    	HBRUSH hWelcomeBrush;
    
        HWND hOpen;
    	HWND hFile;
    
    	switch (message)
        {
    
    		case WM_CREATE:
    			  hFile = CreateWindow ("ListBox", NULL, WS_CHILD | WS_VISIBLE, 110, 60, 560, 40, hWnd1, (HMENU)1, g_hInst, NULL);
    			  hOpen = CreateWindow ("Button", "Öffnen", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 340, 245, 110, 22, hWnd1, (HMENU)2, g_hInst, NULL);
    		return 0;
    
    		case WM_PAINT:
    	          hDC = BeginPaint(hWnd1, &ps); 
    
                  RoundRect (hDC, 100, 50, 680, 460, 40, 40);
    
    					  hWelcomeBrush = (HBRUSH) SelectObject (hDC, CreateSolidBrush (RGB (255, 0, 0))); 
    				      Ellipse (hDC, 285, 150, 495, 360); 
    				      DeleteObject(hWelcomeBrush);
    
    			  EndPaint (hWnd1, &ps);
    
    	    return 0;
    
    	    case WM_COMMAND:
    			  switch (LOWORD(wParam))
    			  {
    				  case 2:
    					  if (GetOpenFileName(&ofn) == true) 
    					  {
    						  hf = CreateFile(ofn.lpstrFile, GENERIC_READ, 0, (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);
    					  } 							    
    				  return 0;
    			  }
    		return 0;
    
    		case WM_DESTROY:
    			  PostQuitMessage (0);
    		return 0;
    	}
    
        return DefWindowProc (hWnd1, message, wParam, lParam);
    }
    

    Weiß jemand warum?

    Mfg Ominion



  • Scheinbar hat niemand eine Idee. Ich habe jetzt gemerkt, dass beim Buttonclick einfach nicht die Message WM_COMMAND aktiviert wird. Woran könnte das liegen?

    Mfg Ominion

    PS: Quelltext hat sich nicht verändert.

    [EDIT]WM_COMMAND kommt jetzt an. Die DialogBox öffnet sich aber immer noch nicht beim Buttonclick. Wenn ich sieh aber in WM_CREATE reinpacke klappt es. Weiß jemand warum das zwar bei WM_CREATE aber nicht bei WM_COMMAND klappt?[/EDIT]



  • die hwnd variable wird uninitialisiert benutzt. die ist sowieso völlig überflüssig. lösch die und nenn den 1.parameter der funktion hwnd



  • Danke, ich glaub ich hatte da gerade meine Sonnenbrille auf.

    Mfg Ominion


Anmelden zum Antworten