OPENFILENAME

deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 - 29 déc. 2005 à 14:26
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 - 29 déc. 2005 à 19:47
Bonjour a tous :D





Voila j'ai dans ma fonction de vérification des messages ceci :



if(LOWORD(wParam) == OPEN){


ZeroMemory(&OpenFile,sizeof(OPENFILENAME));





OpenFile.lStructSize=sizeof(OPENFILENAME);


OpenFile.hwndOwner=hWnd;


OpenFile.lpstrFile=D_szFileName;


OpenFile.nMaxFile=MAX_PATH;


OpenFile.lpstrFilter="Fichier source C\0*.c\0Fichier source
CPP\0*.cpp\0Texte (*.txt)\0*.txt\0";


OpenFile.nFilterIndex = 1;


OpenFile.Flags= OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST |
OFN_HIDEREADONLY;





GetOpenFileName(&OpenFile);


if(D_bResult==TRUE){ //Si on a ouvert un fichier.


HANDLE hFile; //On crée un handle de fichier;


DWORD D_dwFileSize,D_dwNbrCarRead;


CHAR *D_szTextFile;





hFile =
CreateFile(D_szFileName,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);


D_dwFileSize = GetFileSize(hFile,NULL);


D_szTextFile=(PCHAR)LocalAlloc(LMEM_FIXED,D_dwFileSize+1);


ReadFile(hFile,D_szTextFile,D_dwFileSize,&D_dwNbrCarRead,NULL);


*(D_szTextFile+D_dwFileSize)=0;


SendMessage(hEdit,WM_SETTEXT,0,(LPARAM)D_szTextFile);


LocalFree(D_szTextFile);


CloseHandle(hFile);


}

}

En clair lorsque je clique sur "ouvrire..." dans mon menu cela éxécute
ces instructions. Cela devrait ouvrire une boit de dialogue ( ça
fonctionne) et je doit pouvoir choisir dans les fichiers filtré (ça
fonctionne) et lorsque je clic sur ouvrire, cela devrait m'afficher le
texte contenu dans fichier dans mon controle ici hEdit (ça fonctionne
pas). J'ai cherché dans tous les sens et je trouve pas la réponse.



Avez vous une idée?



Et j'ai une deuxième question. Lorsque j'ai deux contro de type button
et que j'intercèpte l'évènement MN_CLICKED les instructions sont
éxécuté par tous les controle clicable (logique). Comment je fait pour
les identifier? exemple :



J'ai l'évènement WM_CREATE :



Button1 = CreateWindow("button","&OK", WS_CHILD | WS_VISIBLE,200,280,30,30,hWnd,NULL,Jhinst,NULL);

Button2 = CreateWindow("button","&CANCEL",WS_CHILD | WS_VISIBLE,140,280,60,30,hWnd,NULL,Jhinst,NULL);



et dans le switch des message :



if(LOWORD(wParam) == BN_CLICKED){


MessageBox(hWnd,"OK","BUTTON1 CLICKED",MB_OK | MB_ICONWARNING);


}

if(LOWORD(wParam) == BN_CLICKED){


MessageBox(hWnd,"OK","BUTTON2 CLICKED",MB_OK | MB_ICONWARNING);

}



Comment différentier les deux? Pour que la 1er messagebox s'éxécute lorsque l'ont clic sur button1 et la deuxième sur button2.





Merci d'avance.



PS: je code sous dev-cpp.

39 réponses

julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
29 déc. 2005 à 14:52
Reponse a la deuxieme partie de la question:


Peut-etre je dis des betises, je suis pas sur de bien cerner le probleme.

Tu dois etre dans le message WM_COMMAND de ta fenetre.



<hr size="2" width="100%">switch (msg)

{

case ...:

break;

case WM_COMMAND:

if (HIWORD(wParam) == BN_CLICKED)

{

if ((HWND) lParam == Button1)


MessageBox(hWnd,"OK","BUTTON1 CLICKED",MB_OK | MB_ICONWARNING);

else if ((HWND) lParam == Button2)


MessageBox(hWnd,"OK","BUTTON2 CLICKED",MB_OK | MB_ICONWARNING);

}

...

break;

case ...:

...

break;

default:

...

}

return 0;



<hr size="2" width="100%">




Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
29 déc. 2005 à 14:59
Si, une petite question pour la premiere question, meme si ca ne reolvera en rien le probleme:

Pourquoi empeches-tu d'ouvrir les fichiers en lecture seule?



Sinon, j'ai pas trop le temp de regarder le code (bien que pas trop long)

Donc je te colle une de mes fonctions pour gérer les fenetres d'ouverture de fichier



<hr size="2" width="100%">
int FILEOpenStandardDialogBoxOpenFile(char *extension, char* descriptiontype, HWND windowhandle, BOOL VIEWERROR)


{


char *fichierouvrir, *buffer;


int handle, i;


OPENFILENAME
ofn; //Structure pour ouvrir la
boite de dialogue "Ouvrir un fichier..."




fichierouvrir = (char*) calloc(FILESIZEBUFFER, sizeof(char));


buffer = (char*) calloc(FILESIZEBUFFER, sizeof(char));


// Initialisation de la structure OPENFILENAME


ZeroMemory(&ofn, sizeof(OPENFILENAME));


ofn.lStructSize = sizeof(OPENFILENAME);


ofn.hwndOwner = windowhandle;


ofn.lpstrFile = fichierouvrir;


ofn.nMaxFile = FILESIZEBUFFER;


//on doit creer une chaine du type: "descriptiontype\0extension"


buffer = strcat(buffer, descriptiontype);


handle = strlen(buffer) + 1;


for (i = 0; i < 5 && *(extension + i) != '\0'; i++)


buffer[handle + i] = *(extension + i);


ofn.lpstrFilter = buffer;


ofn.nFilterIndex = 1;


ofn.lpstrFileTitle = NULL;


ofn.lpstrTitle = FILETITREOPEN;


ofn.nMaxFileTitle = 0;


ofn.lpstrInitialDir = _getcwd(NULL, FILESIZEBUFFER);


ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;


//Création de la fenètre d'ouverture d'un fichier


if (GetOpenFileName(&ofn) == TRUE)


{


handle = FILEOpen(fichierouvrir, VIEWERROR);


if (handle != -1)


{


LocalFree(fichierouvrir);


chdir(ofn.lpstrInitialDir);


return handle;


}


}


chdir(ofn.lpstrInitialDir);


LocalFree(fichierouvrir);


return -1;


}



<hr size="2" width="100%">

Vérifie que tu as bien le bon nom de fichier à la sortie de ta fonction (avec un messageBox par exemple).


Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 déc. 2005 à 15:03
if(D_bResult==TRUE){ //Si on a ouvert un fichier.
Ou est-ce que tu modifies D_bResult?
J'aurais plutot vu D_bResult = GetOpenFileName...
Ensuite regarde si le CreateFile et ReadFile n'echouent pas


Pour la deuxieme question, LOWORD(wParam) contient l'ID du bouton. BN_CLICKED n'est pas dans LOWORD(wParam) mais HIWORD(wParam)
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
29 déc. 2005 à 15:08
Tu à bien cerné le problème, mais cela ne fonctionne pas. J'ai testé ça
aussi tantot. Mais aucun résultat, j'ai beau cliqué sur l'un des 2
boutons mais aucune msgbox ne s'affiche.
0

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

Posez votre question
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
29 déc. 2005 à 15:11
Je n'ai pas précisé, mais ca vient peut-etre de la, je me suis tellement fait avoir...
Il faut que tes variables Button1 et Button2 soient définis en static ou en variables globales.

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
29 déc. 2005 à 15:21
vecchio :

if(D_bResult==TRUE) est modififé en faisant D+bResult=GetOpenFileName(&OpenFile)



et pour la deuxième question LOWORD(wParam) contient l'ID du bouton je
suis daccord mais mm à quoi veut tu que je le compare, a la création du
bouton il n'y avait un identificateur, du moin je le connai pas.
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
29 déc. 2005 à 15:24
Savon tu est un ange
cela venai bien du fait que je n'avait pas déclaré en static, mais
pourquoi faut t il déclarer en static? Tant que n'on change pas la
valeur de ces variables il n'y a pas de raison qu'elle change.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 déc. 2005 à 15:24
Eh ben tu lui en mets un (a la création, c'est le param hMenu (ne pas tenir compte du nom du paramètre)). Par exemple (HMENU)1 pour le premier et (HMENU)2 pour l'autre
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
29 déc. 2005 à 15:24
C pour ca qu'il faut que tu compares avec les handles de tes boutons.
Mais il faut que ceux-ci restent identique au cours de ton prog (d'ou le static HWND Button1 dans ta fonction de traitement des messages).
Sinon, il y a un moyen d'assigner un identifiant a tes boutons: la fonction SetWindowLong

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 déc. 2005 à 15:25
Une variable locale est "détruite" a chaque fois que tu sors de la fonction et est recréée à chaque entrée
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
29 déc. 2005 à 15:40
Juste j'avait oublié ce détail. Ca m'est complètement sorti de la tête.



Mais crée un HWD par control ca bouffe pas trop de mèmoire?



si j'ai 10 bouton j'auria button1,... ça bouffe non?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 déc. 2005 à 15:41
40 octets c'est sur, c'est énorme!
Le HWND tu le crée pas, il existe pas. Tu le stockes juste dans une variable.
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
29 déc. 2005 à 15:54
lol mais il se paye ma tête



En claire la réponse est non.



excuse je voulait dire SI ON MEMORISE LES HWND DES CONTROLE DANS UNE VARAIBLE DE TYPE HWND DIFFERENT. satisfait?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 déc. 2005 à 16:05
Si tu en as 10 différents, 4*10 ca fait toujours 40 octets :)
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
29 déc. 2005 à 16:28
Je ne savait pas combien d'octet était allouer pour le type HWND. :D je ne mourrai pas imbécile aujourd'hui.



J'ai testé ta solution en mettant un id lors de la création des bouton.
je met donc par exemple (HMENU)11 , jusque la tout va bien, mais après
je fait un if((int)HIWORD(wParam)==11 mais cela ne fonctionne pas.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 déc. 2005 à 16:32
C'est quand même pas compiqué. Dans WM_COMMAND:
HIWORD(wParam) contient la notification (par exemple BN_CLICKED)
LOWORD(wParam) contient l'ID du controle (11 ici)
lParam contient le HWND du controle
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
29 déc. 2005 à 16:33
Tu peux recupérer l'identifiant associé au bouton que tu viens de créer avec GetWindowLong et GWL_ID comme identifiant.

Vérifie que c'est bien celui que tu viens de lui assigner.

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 déc. 2005 à 16:37
L'ID on l'a dans LOWORD(wParam), on va quand même pas appeler GetWindowLong pour faire joli... S'il faut vérifier que CreateWindowEx fait bien son boulot, ou va-t-on?
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
29 déc. 2005 à 16:39
Vérification de debug.
Jamais associé un identifiant de la sorte, je découvre avec ce que tu dis (et j'en suis ravi, c'est tellement simple).
Donc comme pas sur, ben je proposais de vérifier.

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
29 déc. 2005 à 16:41
Et pis faut dire que je pensais evident la remrque que t'as fait en meme temps que mon post.
Donc ben je cherchais d'ou pouvais provenir l'erreur.
Et comme la seule chose dont je n'étais pas sur était cette nouvelle façon (pour moi) d'associer un identifiant à un controle, ben j'ai logiquement proposé de vérifier.

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
Rejoignez-nous