Boite ouvrir/enregistrer sans mfc ?

cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005 - 11 mai 2005 à 16:08
cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005 - 14 mai 2005 à 22:30
bonjours a tous,
je souhaiterais faire apparaitre une boite de dialogue ouvrir/enregistrer lors de l'appuis sur les boutons correspondants...cela sans utiliser les MFC afin de recuperer le nom de fichier.
Ya t'il un moyen ?
Merci d'avance pour votre aide.

23 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 mai 2005 à 17:01
Bien sur, avec GetOpenFileName et GetSaveFileName, tu n'a qua récupérer
ofn.lpstrFile (la valeur de retour de la fonction te permets de savoir
si l'utilisateur a choisi un fichier ou s'il a cliqué sur annuler)
0
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
12 mai 2005 à 21:00
tiens voila le code d'une boite de dialogue "ouvrir" pour en avoir une de type enregistrer, tu change le GetOpenFileName en GetSaveFileName.


// boite de dialogue "Ouvrir"
BOOL dlgFileOpen(HWND hOwner,
char* fName,
const
char* Filter,
const
char
* dlgCaption)
{
OPENFILENAME ofn;
memset(&ofn,0,
sizeof(ofn));
ofn.lStructSize =
sizeof(OPENFILENAME);
ofn.nFilterIndex = 1;
ofn.lpstrFilter = Filter;
ofn.lpstrFile = fName;
ofn.nMaxFile = MAX_PATH;
ofn.hwndOwner = hOwner;
ofn.lpstrTitle = dlgCaption;
ofn.lpstrInitialDir = "c:";
ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
fName[0] = 0;

return GetOpenFileName(&ofn);
}

Bob... "La chance accorde ses faveur aux esprits avertis..."
0
cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005
13 mai 2005 à 18:45
Merci pour votre aide mais je ne parvient pas a recuperer le nom du fichier entré dans le champ paour le metre dans mon CreateFile.
J'ai bien compris qu'il falais recuperer ofn.lpstrFile mais comment ?
Merci d'avance.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
13 mai 2005 à 19:07
Juste après l'appel à GetOpenFileName, ofn contient les bonnes valeurs (sauf si GetOpenFileName à retourné 0)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005
13 mai 2005 à 20:36
Donc en faisant buf = GetOpenFileName(&ofn);

buf contient le nom du fichier ?
Merci.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
13 mai 2005 à 20:53
Mais nom. Tu fais:



if(GetOpenFileName(&ofn))

{

// ici ofn.lpstrFile contient le nom du fichier

}

else

{

// l'utilisateur a choisi annuler

}
0
cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005
14 mai 2005 à 13:59
bonjours,

Quand j'intruduis le code de la boite de dialogue dans mon code j'ai une erreuere a la compilation " 'DlgFileOpen ': local fonction definition are illegal "

Et quand j'utilise ofn dans un if il me dit " undeclared identifier "

Je comprend plus trop la ....
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
14 mai 2005 à 14:33
Si tu essaie de mettre la fonction de LordBob dans une de tes fonctions
c'est normal, il faut que tu la mettes en dehors et que tu l'appelles.
Tu peux aussi copier le contenu de sa fonction dans la tienne.

Et il faut bien sur que tu déclares OPENFILENAME ofn;
0
cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005
14 mai 2005 à 14:51
voila je vient de faire la modif mais quand j'appelle la fonction dlgFileOpen
je dois lui passer quoi comme parametres ?
de plus lors de l'appel de cette fonction il me dit "undeclared identifier"...c'est pourtant pas une variable...
Merci pour ta rapidité
0
cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005
14 mai 2005 à 14:53
voila je vient de faire la modif mais quand j'appelle la fonction dlgFileOpen
je dois lui passer quoi comme parametres ?
de plus lors de l'appel de cette fonction il me dit "undeclared identifier"...c'est pourtant pas une variable...
Merci pour ta rapidité
0
cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005
14 mai 2005 à 14:53
voila je vient de faire la modif mais quand j'appelle la fonction dlgFileOpen
je dois lui passer quoi comme parametres ?
de plus lors de l'appel de cette fonction il me dit "undeclared identifier"...c'est pourtant pas une variable...
Merci pour ta rapidité
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
14 mai 2005 à 15:52
0
cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005
14 mai 2005 à 17:39
Oui je connaissais MSDN mais je ne trouve rien sur ces parametres BOOL dlgFileOpen(HWND hOwner, char* fName, const char* Filter, const char* dlgCaption)
a quoi correspondent t'ils ? car j'ai bien mis comme tu m'as dit, la compile se passe bien et quand je clike sur mon bouton "lire" il ferme le programe....
Merci
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
14 mai 2005 à 17:44
C'est a toi de chercher un peu! Les arguments sont utilisés pour initialier ofn, tu peux donc savoir a quoi ils servent.

Par exemple hOwner sera la fenêtre parent de la boite de dialogue ouvrir
0
cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005
14 mai 2005 à 18:42
Voila ma boite de dialogue s'ouvre bien
Par contre quand je clike sur OK ca me donne une erreure de taille d'allocation de 4 milliards et qualque bytes
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
14 mai 2005 à 19:31
Une erreur d'allocation... fait donc voir ton code sinon on s'en sortira pas.

Exemple de source utilisant GetOpenFileName: http://www.cppfrance.com/code.aspx?ID=11362
0
cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005
14 mai 2005 à 19:42
les variables :

HANDLE hFile;
DWORD Read;
int size=0;
char *buf=0;
OPENFILENAME ofn;
char nameOuvrir[256];
const char* Filter="All\0";
const char* dlgCaption="Ouvrir";

le morceau de code concerné:
......
case IDC_LIRE:

if(dlgFileOpen(Dlg, nameOuvrir, Filter, dlgCaption)==TRUE)
{
if(GetOpenFileName(&ofn)!=NULL)
{
hFile = CreateFile(ofn.lpstrFilter, // file name
GENERIC_READ, // open for reading
0, // do not share
NULL, // default security
OPEN_EXISTING, // existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL);
}
else
{
MessageBox(Dlg,"Erreur, impossible d'ouvrir le fichier ","Erreur",MB_OK);
}
break;
}
....

avant de planter totalement et de me metre l'erreure de memoire il m'affiche la message box d'erreure...
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
14 mai 2005 à 19:46
Pour le moment, tu appelles deux fois GetOpenFileName, puisque dlgFileOpen appelle cette fonction.



case IDC_LIRE:

if(dlgFileOpen(Dlg, nameOuvrir, Filter, dlgCaption)==TRUE)

{

hFile = CreateFile(ofn.lpstrFilter, // file name


GENERIC_READ,
// open for reading


0,
// do not share


NULL,
// default security


OPEN_EXISTING,
// existing file only


FILE_ATTRIBUTE_NORMAL,
// normal file

NULL);

}

else

{

MessageBox(Dlg,"Erreur, impossible d'ouvrir le fichier ","Erreur",MB_OK);

}

break;
0
cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005
14 mai 2005 à 21:07
case IDC_LIRE:

if(dlgFileOpen(Dlg, nameOuvrir, Filter, dlgCaption)==TRUE)
{
// GetDlgItemText(Dlg,IDC_FILENAME,nameOuvrir,256);
hFile = CreateFile(ofn.lpstrFilter, // file name
GENERIC_READ, // open for reading
0, // do not share
NULL, // default security
OPEN_EXISTING, // existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL);


if(hFile==INVALID_HANDLE_VALUE)
{
MessageBox(Dlg,"Erreur, impossible d'ouvrir le fichier ","Erreur",MB_OK);
return 0;
}
else
{
size = GetFileSize (hFile, NULL) ; //obtient la taile de FICHIER
buf = new char[size]; //allocation dynamique
ReadFile(hFile,buf,size,&Read,NULL); //lit le fichier et le met dans buf
CloseHandle(hFile); //ferme le fichier
buf[Read]='\0';
SetDlgItemText(Dlg,IDC_TEXT2,buf); //met le text du fichier dans la zone
SetDlgItemText(Dlg,IDC_TEXT,buf2);
return 0;


}
}
else
{
MessageBox(Dlg,"appuis sur cancel ","Erreur",MB_OK);
}
break;

Je n'ai plus l'erreure d'allocation memoire mais toujour une erreure windows qui me donne le choix entre "debogage" et "fermer"....
Merci pour ton aide
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
14 mai 2005 à 21:44
Si tout se passe bien, tu aura Read==size à la fin de ReadFile (tout
aura été bien lu). buf[Read] n'est pas pas bon, car tu n'a alloué que
Read octets, l'indice le plus grand valide est donc Read-1.

Tu dois donc allouer un octet de plus: buf = new char[size + 1];
0
Rejoignez-nous