• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Datei - Speichern unter

Mark

Neues Mitglied
Ich möchte einen Button in eine Win32 Anwendung machen, auf den der User klicken kann, um ein Verzeichnis auf seiner Festplatte auszusuchen.
Das Ganze für MinGW/GCC++ mit WinAPI und sonst nichts.
Ich habe aber überhaupt keine Ahnung von Dialogen.
Was brauche ich dazu? comctrl oder was?
Gibt es irgendwo einen Beispiel Code für ganz blutige Anfänger, wie man das anstellt?
 
Werbung:
Such doch mal nach „c++ directory chooser dialog“ oder so. Speziellen Code kann ich dir jetzt nicht nennen, aber das sollte definitiv zu finden sein.
 
Das hatte ich schon probiert, bevor ich hier gefragt habe, da finden sich genau 2 Dinge, jeweils auf mehreren Seiten.
1) CodeGuru, CodeProject und ähnliche beschreiben Lösungen, wie es mit MFC, .NET, VisualBasic, etc. geht, da reichen meine Anfängerkenntnisse nicht, mir das zu "übersetzen".
2) MSDN (im üblichen fachchinesich) beschreibt 2 Versionen, wo bei beiden dabei steht, ab Vista sollte man die neuere Version verwenden.
Was sie nicht dazu schreiben ist, ob die neuere Version auch rückwirkend unter XP funktioniert.
Selbst wenn ich das raus bekomme, das Code-Beispiel von MSDN, wo sie seitenlang auf alle möglichen Optionen eingehen, ist mir zu hoch, da sehe ich den Wald vor lauter Bäumen nicht.
 
Werbung:
Hallo,
ich finde garnicht das die msdn Foren auf "fachchinesich" ist. Eigendlich muss man nur den Code verstehen wen man das tuht ist es auch ganet schwer sonne seite zu verstehen nur wen man dort einamal schnell rüber huscht versteht man es auch nicht ;). Das wahr jetzt nicht böse gemeint sonder nur meine ansicht ;).
Ich habe hier mal einen link zu einen der MSDN Foren. Ich selber verstehe ja c++ garnet aber ich denke ich habe das was dadrinne steht verstanden naja wen es dir hilft *freu* wen nicht dan schreibe es einfach ich suche dan nochmal ;)

Mit freundlichen Grüßen
JoKaBo
 
Du hast den Link nicht gepostet und auch dieser Thread ist schon ein paar Monate alt.

Zu speziellen C++-Sachen kann ich aber auch wenig sagen. Das hängt sicherlich auch von der eingesetzten Library ab.

Das Ganze für MinGW/GCC++ mit WinAPI und sonst nichts.

Die Einschränkung schließt wahrscheinlich alles aus, was ich kennen würde (Qt, GTK, fltk, .NET, …).
 
Ich bin gar nicht böse, wenn dieser Thread nochmal hoch kommt, vor allem weil mir immer noch die passende Antwort fehlt.
Allerdings habe ich mittlerweile ein kleines bischen mehr rausgefunden.

Die gesuchte Funktion heisst SHBrowseForFolder()

Bei MSDN steht dazu:
For Windows Vista or later, it is recommended that you use IFileDialog with the FOS_PICKFOLDERS option rather than the SHBrowseForFolder function. This uses the Open Files dialog in pick folders mode and is the preferred implementation.

Was ich nicht weiss und auch nicht dabei steht ist:
Wenn ich eine Anwendung schreiben will, die sowohl unter XP als auch unter Vista und Win7 laufen soll, was nehme ich dann?
Gibt es IFileDialog überhaupt unter XP und welche Probleme bekomme ich, wenn ich trotz dem Hinweis SHBrowseForFolder() verwende? Kommt dann ab Windows8 nur noch Error?

Und zum Schluss noch eine Anmerkung zur WinAPI.
Ich beschäftige mich ja nun schon ein paar Jahre damit und wenn ich eins rausgefunden habe, dann ist das: Absolut ALLE Libraries, ob .NET oder sonstwas, selbst andere Programmiersprachen wie C# sind nichts weiter als Wrapper für die Win32 API, es gibt nicht die allerkleinste Funktion in welcher Programmiersprache auch immer und mit Hilfe von welcher Library auch immer, die man nicht auch mit reinen Win32 API Funktionen schreiben könnte.
Das Problem ist, dass M$ an der Win32 API nichts verdient, darum sucht man sich teilweise dusselig, bis man mal die zugrunde liegenden Funktionen gefunden hat, während die Lösungen mit .NET Funktionen 1000fach übers Web verteilt sind.
Hat man die reine Win32 API Lösung einmal gefunden ist die in aller Regel einige zig1000 Mal schneller, weil sie MB-weise Overhead einspart.
 
Werbung:
Vielleicht solltest du die Frage lieber in einem dedizierten C++-Forum stellen.

Sei dir aber bitte der Ironie bewusst, dass du offenbar seit Monaten gar keine Lösung für ein nicht besonders spezielles Problem gefunden hast, weil du die „1000fach übers Web verteilt“ existierenden Varianten aus Gründen der Performance ausschlägst. So maximal effizient ist das auch nicht.
 
Das siehst du falsch.
Ich habe seit Monaten keine Lösung, weil ich seit Monaten mit was Anderem beschäftigt bin.
Ich springe seit Jahren zwischen einem Dutzend Projekten hin und her, von meiner Homepage in PHP über meinen Server bis zu einigen C++ Anwendungen, das Ganze aber nur hobbymässig, ohne jeden Zeitdruck, es kann leicht passieren, dass eine Umgestaltung meiner Homepage ein Jahr oder länger dauert.
Dabei schreibe ich auf, was alles was noch verbesserungsbedürftig ist (ist ne lange Liste).
Wenn dabei Fragen auftauchen, von denen ich glaube, dass ich in einem Forum wie diesem schneller Antwort bekomme als ich es selbst recherchieren kann, frage ich halt.
Wenn dann keine passende Antwort kommt, komme ich irgendwann von alleine darauf zurück und wenn die Frage derweil zur Spitze meiner Liste gewandert ist, dann finde ich die Lösung auch, zumindest hat es bis jetzt noch nichts gegeben, was ich nicht gelöst hätte.
Ich habe tatsächlich schon vor diesem Thread in 2 anderen Foren nachgefragt, die beide auf C++ spezialisiert sind, aber auch da bekam ich (bis heute) keine passende Antwort, es ist offensichtlich nicht ganz so einfach, wie es auf den ersten Blick erscheint.
 
Hallo,


So, ich habe jetzt noch mal gegooglet und hier ist der code von dem MSDN foren. Ich habe den Code als unerfahrener c++ Programmierer Verstanden, dan sollte es dir nicht schwer fallen das so umzubauen wie du es gerne hättest bzw. du solltest den code dan auch verstehen ...


*EDIT: Der code ist doof Formatiert deshalb nehme ich ihn wieder raus, aber der code steht ja in dem Link :D

Hier der fehlende Link dazu...

Gewusst wie: Speichern von Dateien mit der SaveFileDialog-Komponente

mfg
JoKao
 
Werbung:
EDIT:
Jetzt war ich schon am Jubeln, dann habe ich erst gesehen, der Code ist für .NET.
 
Zuletzt bearbeitet:
Ja klar, C++, aber ich habe keine Lust meine User zu zwingen über 100MB .NET zu installieren, nur um eine einzige Funktion in mein Programm einzubauen, die ohne .NET vermutlich nur ein paar 100 Byte hat.
Ich hatte das sogar mal probiert, eine Anwendung mit .NET zu coden, aber das Ergebnis war niederschmetternd.
Von knapp 500 Usern lief mein Programm bei über 50 davon nicht, weil sie die falsche oder überhaupt keine Version von .NET installiert hatten.
10 davon waren auch mit ausführlicher Beratung nicht in der Lage .NET korrekt zu installieren.
Ich habe mit dem User-Support dazu mehr Zeit verbracht als mit dem Coden der Anwendung selbst und trotzdem waren am Ende alle unzufrieden, weil solche Probleme IMMER auf den Coder geschrieben werden.

In kurz: Alles was nicht plain C/C++/Win32API ist, insbesondere wenn M$ drauf steht, kommt mir unter keinen Umständen mehr in meinen Code.
 
Werbung:
ok... aber heutzutage haben doch die meisten Menschen .Net oder nicht also meine freunde haben das alles bzw. alle in meinem umfeld ud die die ich so kenne aber gut, das kann so sein muss aber net ich werde dann nochmal suchen vil. finde ich das ja...
 
Mark schrieb:
Ich habe tatsächlich schon vor diesem Thread in 2 anderen Foren nachgefragt, die beide auf C++ spezialisiert sind, aber auch da bekam ich (bis heute) keine passende Antwort, es ist offensichtlich nicht ganz so einfach, wie es auf den ersten Blick erscheint.

Oder die Lösung, die du suchst, existiert nicht/ist nicht praktikabel…

Ich habe sehr wenig Erfahrung mit C++, aber einen FileChooser als „kompliziert“ zu bezeichnen… Na ja. Du schaffst dir deine Probleme da auch selbst.

Kurz mal mit FLTK probiert (unter Ubuntu Linux):

Code:
$ sudo apt-get install libfltk1.3-dev

(Möglicherweise fehlen noch weitere Pakete wie build-essential oder Header für g++.)

Entweder: Download der Distribution als Archiv, um Beispieldatei zu finden (ich weiß nicht, ob/wohin die per apt-get installiert werden):

Code:
http://fltk.org/software.php?VERSION=1.3.0&FILE=fltk/1.3.0/fltk-1.3.0-source.tar.gz

Dort im examples-Unterverzeichnis die Datei nativefilechooser-simple-app.cxx in ein Arbeitsverzeichnis kopieren.

Oder: Hier kopieren und in Arbeitsverzeichnis als nativefilechooser-simple-app.cxx ablegen.

Code:
//
// "$Id: nativefilechooser-simple-app.cxx 8183 2011-01-04 17:31:56Z AlbrechtS $"
//
//	An example of how to use Fl_Native_File_Chooser to open & save files.
//
// Copyright 2010 Greg Ercolano.
// Copyright 1998-2010 by Bill Spitzak and others.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA.
//
// Please report all bugs and problems on the following page:
//
//     http://www.fltk.org/str.php
//
#include <stdio.h>	// printf
#include <stdlib.h>	// exit,malloc
#include <string.h>	// strerror
#include <errno.h>	// errno
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Menu_Bar.H>
#include <FL/Fl_Native_File_Chooser.H>
#include <FL/Fl_Box.H>
#include <FL/fl_ask.H>

class Application : public Fl_Window {
  Fl_Native_File_Chooser *fc;
  // Does file exist?
  int exist(const char *filename) {
    FILE *fp = fopen(filename, "r");
    if (fp) { fclose(fp); return(1); }
    else    { return(0); }
  }
  // 'Open' the file
  void open(const char *filename) {
    printf("Open '%s'\n", filename);
  }
  // 'Save' the file
  //    Create the file if it doesn't exist
  //    and save something in it.
  //
  void save(const char *filename) {
    printf("Saving '%s'\n", filename);
    if ( !exist(filename) ) {
      FILE *fp = fopen(filename, "w");				// create file if it doesn't exist
      if ( fp ) {
        // A real app would do something useful here.
        fprintf(fp, "Hello world.\n");
        fclose(fp);
      } else {
        fl_message("Error: %s: %s", filename, strerror(errno));
      }
    } else {
      // A real app would do something useful here.
    }
  }
  // Handle an 'Open' request from the menu
  static void open_cb(Fl_Widget *w, void *v) {
    Application *app = (Application*)v;
    app->fc->title("Open");
    app->fc->type(Fl_Native_File_Chooser::BROWSE_FILE);		// only picks files that exist
    switch ( app->fc->show() ) {
      case -1: break;	// Error
      case  1: break; 	// Cancel
      default:		// Choice
        app->fc->preset_file(app->fc->filename());
        app->open(app->fc->filename());
	break;
    }
  }
  // Handle a 'Save as' request from the menu
  static void saveas_cb(Fl_Widget *w, void *v) {
    Application *app = (Application*)v;
    app->fc->title("Save As");
    app->fc->type(Fl_Native_File_Chooser::BROWSE_SAVE_FILE);	// need this if file doesn't exist yet
    switch ( app->fc->show() ) {
      case -1: break;	// Error
      case  1: break; 	// Cancel
      default:		// Choice
        app->fc->preset_file(app->fc->filename());
        app->save(app->fc->filename());
	break;
    }
  }
  // Handle a 'Save' request from the menu
  static void save_cb(Fl_Widget *w, void *v) {
    Application *app = (Application*)v;
    if ( strlen(app->fc->filename()) == 0 ) {
      saveas_cb(w,v);
    } else {
      app->save(app->fc->filename());
    }
  }
  static void quit_cb(Fl_Widget *w, void *v) {
    exit(0);
  }
  // Return an 'untitled' default pathname
  const char* untitled_default() {
    static char *filename = 0;
    if ( !filename ) {
      const char *home =
        getenv("HOME") ? getenv("HOME") :		 // unix
	getenv("HOME_PATH") ? getenv("HOME_PATH") :	 // windows
	".";						 // other
      filename = (char*)malloc(strlen(home)+20);
      sprintf(filename, "%s/untitled.txt", home);
    }
    return(filename);
  }
public:
  // CTOR
  Application() : Fl_Window(400,200,"Native File Chooser Example") {
    Fl_Menu_Bar *menu = new Fl_Menu_Bar(0,0,400,25);
    menu->add("&File/&Open",  FL_COMMAND+'o', open_cb, (void*)this);
    menu->add("&File/&Save",  FL_COMMAND+'s', save_cb, (void*)this);
    menu->add("&File/&Save As", 0,  saveas_cb, (void*)this);
    menu->add("&File/&Quit",  FL_COMMAND+'q', quit_cb);
    // Describe the demo..
    Fl_Box *box = new Fl_Box(20,25+20,w()-40,h()-40-25);
    box->color(45); 
    box->box(FL_FLAT_BOX);
    box->align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE|FL_ALIGN_WRAP);
    box->label("This demo shows an example of implementing "
               "common 'File' menu operations like:\n"
               "    File/Open, File/Save, File/Save As\n"
	       "..using the Fl_Native_File_Chooser widget.\n\n"
	       "Note 'Save' and 'Save As' really *does* create files! "
	       "This is to show how behavior differs when "
	       "files exist vs. do not.");
    box->labelsize(12);
    // Initialize the file chooser
    fc = new Fl_Native_File_Chooser();
    fc->filter("Text\t*.txt\n");
    fc->preset_file(untitled_default());
    end();
  }
};

int main(int argc, char *argv[]) {
  Fl::scheme("gtk+");
  Application *app = new Application();
  app->show(argc,argv);
  return(Fl::run());
}

//
// End of "$Id: nativefilechooser-simple-app.cxx 8183 2011-01-04 17:31:56Z AlbrechtS $".
//

Dann:

Dort kompilieren:

Code:
$ fltk-config --compile nativefilechooser-simple-app.cxx

Und ausführen:

Code:
$ ./nativefilechooser-simple-app



Dateigröße auf meinem Notebook (64-Bit): 51,3 kB
Auf dem Desktop (32-Bit): 39,9 kB

- FLTK

Nur ein Beispiel.
 
Vielen Dank für deine Mühe.
Wie schon gesagt, ich weiss mitterweile wie es geht, ich bin mir nur nicht sicher, welche der beiden Versionen ich verwenden soll.

1) Open and Save As Dialog Boxes (Windows)

Da steht gleich oben in der ersten Zeile, dass man dies ab Vista nicht mehr verwenden sollte.
Nicht dabei steht, was man machen soll, wenn man eine Anwendung unter XP und Vista laufen haben will.

2) Common Item Dialog (Windows)

Der umgekehrte Fall, "Starting with Windows Vista ...".
Nicht dabei steht, was passiert, wenn man dies unter XP verwendet.
 
Werbung:
naja, man kann doch bestimmt eine abfrage machen welches betriebsystem garde drauf ist oder nicht ?? dan würde es so gehen

if(widows 7)
{
erstes Beispiel
}
else if(vista)
{
zweitest Beispiel
}

ich weiss nicht genau wie das bei c++ aussehen würde aber ich denke das es net so schwer sein wird ....

du musst natürlich erst mal googlen wie du soeine abfrage machen kannst ich denke aber das es so am besten ist weil, du es dann auf mehreren systemen benutzen kannst (benutzer Freundlicher)

mfg
JoKaBo
 
Oh, das habe ich überlesen.

Sorry, dass ich etwas unfreundlich klang. Ich habe das noch mal überflogen. Die Sache ist, dass ich auf „Performance“-Argumente mittlerweile recht allergisch reagiere, weil ich ständig mitbekomme, wie sich Leute darauf versteifen und ihnen proportional viel zu viel Bedeutung beimessen. So nach dem Motto: „Gut, jetzt hat die Entwicklung doppelt so lange gedauert und nur noch ich verstehe den Code, aber dafür startet mein Vokabeltrainer jetzt in 2 Sekunden statt in 3.“

Konkret zu den von dir verlinkten Dingen kann ich nichts sagen, da ich Windows praktisch nicht nutze. Wenn es ganz dumm kommt, musst du vielleicht eine Precompiler-Weiche einbauen, die je nach Windows-Version die passende Variante auswählt… Das sind natürlich genau die Dinge, die dir Frameworks abnehmen, auch wenn es dann nicht nativ aussieht.

Das Argument mit der Download-Größe des Frameworks, die du vermeiden möchtest, erkenne ich aber an.

Andererseits kannst du glaube ich .NET inzwischen durchaus voraussetzen und es gäbe eben auch Komponenten wie fltk, die sehr schlank sind und direkt in die ausführbare Datei einkompiliert werden.
 
Die Idee mit der Weiche ist nicht blöd, da weiss ich sogar, wie das geht.
Warum bin ich da nicht selber drauf gekommen?
Das kann die Win32API ganz ohne extra Libraries.

Vielen Dank euch beiden.
 
Werbung:
Zurück
Oben