Problème de récupération de chemin valide [Résolu]

Signaler
Messages postés
18
Date d'inscription
samedi 14 juin 2008
Statut
Membre
Dernière intervention
11 novembre 2008
-
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
-
Noobinho is back!!!

Je souhaite faire une interface graphique pour un programme que j'ai fait en console et qui marchait correctement.
La seule saisie à faire est celle du fichier que je souhaite traiter. Pour cela, j'ai utilisé un bouton parcourir. Le problème est qu'après le if (GetOpenFileName(&ofn)= =TRUE) ma fenêtre plante. Je n'arrive pas à savoir pourquoi. Je n'arrive pas à récupérer le nom du fichier que je souhaite traiter. Merci de m'aider.

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
 /*
 HICON LoadIcon{
 HINSTANCE hInstance, // handle to application instance
 PCTSTR lpIconName   // name string or resource identifier
 };
 LoadIcon.hInstance=NULL;
 LoadIcon.lpIconName=IDI_WINLOGO;
 */


    HWND hwnd;


    MSG msg;
    WNDCLASS wc;
    HMENU hMenu, hSousMenu;


    hinst = hinstance;


    wc.style = 0 ;
    wc.lpfnWndProc = MainWndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hinstance;
    wc.hIcon = NULL;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = NULL;
    wc.lpszMenuName =  NULL;
    wc.lpszClassName = "MaWinClass";;


    if(!RegisterClass(&wc)) return FALSE;


    hSousMenu = CreateMenu();
    AppendMenu(hSousMenu, MF_STRING, IDM_OPEN, "Générer les images acoustiques à partir d'un fichier VTK");
    AppendMenu(hSousMenu, MF_SEPARATOR, 0, NULL);
    AppendMenu(hSousMenu, MF_STRING, IDM_QUIT, "Quitter");
    hMenu  = CreateMenu();
    AppendMenu(hMenu,MF_POPUP,(UINT)hSousMenu,"Fichier");


    hwnd = CreateWindow("MaWinClass", "SCAT Image Processing LaMIPS/NXP 2008", WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, 640, 300, NULL, hMenu, hinstance, NULL);
   
 
 if (!hwnd)  return FALSE;


    ShowWindow(hwnd, nCmdShow);


    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return msg.wParam;


}
///////////////////////////////////////////////////////////////////////////////


 


///////////////////////////////////////////////////////////////////////////////


LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static HWND hEdit;
    static BOOL EditNotChg = TRUE;
    FILE *fp0, *fp1, *fp2;
    FILE *tmpf= 0;      //Opened temp. file
 
 char name[255];
 char ext[7], mode[7];
 unsigned int i, j, k;
 unsigned int imax, jmax, kmax;
 unsigned char pix; 
 char *vtk, *vtkPtr;


 switch (uMsg)
    {
        case WM_CREATE:
            {
             HFONT hFont;


             hEdit = CreateWindow("edit","Pour générer les images acoustiques de votre échantillon : Fichier -> Générer les images acoustiques à partir d'un fichier VTK", WS_CHILD | WS_VISIBLE |ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL,0, 0, 0, 0, hwnd, NULL, hinst, NULL);
             hFont = (HFONT)GetStockObject(ANSI_FIXED_FONT);
             SendMessage(hEdit,WM_SETFONT,(UINT)hFont,TRUE);
             SendMessage(hEdit, EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(5, 5));
             return 0;
            }


        case WM_CLOSE:
            /*if(EditNotChg ||
               MessageBox(hwnd,"Le texte a été modifié.\r\nEtes vous sûr de \vouloir fermer l'application ?"
                            ,"Question ?",MB_YESNO | MB_ICONQUESTION ) == IDYES)*/
                                                     DestroyWindow(hwnd);
            return 0;


        case WM_COMMAND:
            if(LOWORD(wParam) == IDM_OPEN)
              {
    HFONT hFont;
                OPENFILENAME ofn;
                CHAR szFile[MAX_PATH]={0};


                ZeroMemory(&ofn, sizeof(OPENFILENAME));
                ofn.lStructSize = sizeof(OPENFILENAME);
                ofn.hwndOwner = hwnd;
                ofn.lpstrFile = szFile;
                ofn.nMaxFile = MAX_PATH;
                ofn.lpstrFilter ="Fichier  VTK\0*.vtk\0";
                ofn.nFilterIndex = 1;
                ofn.Flags =OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
  


                if (GetOpenFileName(&ofn)==TRUE)



                 {
 i =0;    
 while(*(szFile+i)!='0');         // est ce la bonne syntaxe pour récupérer un chemin de fichier valide?
 {
 *(name+i)=*(szFile+i);
 }


  //Ouverture d'un fichier temp.     // début de mon programme qui traite mon fichier vtk dont la seule entrée est name
  tmpf= scatOpenTempFile();
 
  //Ouverture des fichiers vtk
  strcpy(ext,".vtk"); strcpy(mode,"rb");
  fp0= scatOpenFile(name,ext,mode);
  strcpy(ext,"X.vtk"); strcpy(mode,"wb+");
  fp1= scatOpenFile(name,ext,mode);
  strcpy(ext,".xls"); strcpy(mode,"wa");
  fp2= scatOpenFile(name,ext,mode);


  //Affichage de l'entete du fichier VTK
  scatHeaderVTK(fp0, fp1, &imax, &jmax, &kmax);


  //Allocation memoire dynamique
  vtkPtr= scatMemAllocVTK(imax, jmax, kmax);
  vtk= vtkPtr;




  //Lecture des echos et reorganisation des data
  scatReadFileVTK(imax,jmax,kmax,fp0,vtk);


  //Traitement des data: lissage + segmentation
  vtk= vtkPtr;
  scatMainProcessing(imax,jmax,kmax,tmpf,fp2,vtk,name);
 


  fclose(fp0);
  fclose(fp2);
 


   fclose(fp1);
   fclose(tmpf);
   exit(0);


  //
  //Remise du fichier vtk dans l'ordre initial
  //Lecture des data
 
  vtk= vtkPtr;
  rewind(tmpf);


  for(i=0;i<imax;i++){
    for(j=0;j<jmax;j++){
      for(k= 0 ; k<kmax; k++) {
 fread(&pix,sizeof(unsigned char),1,tmpf);
 *(vtk+(k*(jmax*imax)+j*imax+i))= pix;  
      }
    }
  }


  //Reecriture
   for(k=0;k<kmax;k++)
     for(j=0;j<jmax;j++)
       for(i= 0; i<imax; i++, vtk++)
  fwrite(vtk,sizeof(unsigned char),1,fp1);


  fclose(tmpf);
  fclose(fp1);


  free(vtkPtr);
 
     
    }
    
              }
            if(LOWORD(wParam) == IDM_QUIT) PostMessage(hwnd, WM_CLOSE,0,0);            if(HIWORD(wParam) EN_CHANGE) EditNotChg FALSE;
           
   return 0;


        case WM_SIZE:
             MoveWindow(hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
             return 0;


        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;


        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

10 réponses

Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Pas de problème quand on sait quoi répondre !

Je suppose que ces messages sont écris dans une zone d'édition ou dans une zone statique.

SendMessage() est la fonction générale mais il y a aussi SetDlgItemText() qui permet d'écrire plus simplement un texte dans un contrôle Windows (et SetDlgItemInt() pour un entier accessoirement !)

Jean-François
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
t'aurais pas oublié un i++ dans ta boucle?
Messages postés
18
Date d'inscription
samedi 14 juin 2008
Statut
Membre
Dernière intervention
11 novembre 2008

oui c vrai tu as raison. je me suis planté dans le copier coller et je l'ai supprimé.
cependant même avec ça le programme ne marche pas: il plante.
pourtant à la compilation le compilateur ne génère aucun message d'erreur.
merci qd même
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
Salut
Le nom du fichier selectionner est directement accessible depuis la variable ofn.lpstrFile;
Pas d'autre traitement necessaire.

A+
Mon site internet : http://pistol.petesampras.free.fr
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Bon jour,

Et accessoirement dans :

i=0;    
while (*(szFile + i) != '0'); // bonne syntaxe ?
{
   *(name + i) = *(szFile + i);
}

1) Ne pas confondre le caractère '0' (48 en binaire) avec le caractère '\0' (0 en binaire, '\0' = 0 sans apostrophes) !
2) Le ; à la fin de la ligne while casse tout !
3) Il n'y a pas de terminateur (zéro binaire) placé à la fin de name !

Il faut (mais c'est pas vraiment optimisé) :

i = 0;    
while (*(szFile + i) != 0)
{

   *(name + i) = *(szFile + i);
   ++i;
}
*(name + i) = 0; // terminateur

ou encore, plus simplement :

strcpy(name,szFile);
ou
strcpy(name,ofn.lpstrfile);

Jean-François
Messages postés
18
Date d'inscription
samedi 14 juin 2008
Statut
Membre
Dernière intervention
11 novembre 2008

Merci Jean-François pour tes conseils très utiles pour la noob que je suis.
Je t'en suis très reconnaissant.
Tes indications marchent presque au détail suivant.
En effet, j'ai oublié de te préciser que dans ma variable name dans laquelle est stockée le chemin de mon fichier ne doit pas figurer l'extension .vtk (  oui je sais je suis chiant).
Ma question (et cette fois c la dernière promis ) est la suivante:
comment faire pour supprimer les 4 caractères .vtk de name??
ok cette question est bidon mais en y répondant vous m'aiderez bcp.
merci d'avance
Messages postés
18
Date d'inscription
samedi 14 juin 2008
Statut
Membre
Dernière intervention
11 novembre 2008

 Voilà une solution qui marche     !! 
      i = 0;   
     while (*(szFile + i) != '.')
     {
     *(name + i) = *(szFile + i);
     ++i;
     }
     *(name + i) = 0;
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Bonjour,

Ca marche s'il n'y a pas d'autre point avant !
Ex: c:\temp.log\toto.old.log donnera c:\temp au lieu de c:\temp.log\toto.old

Le plus efficace est de recopier entièrement le nom puis de reculer sur le dernier point : c'est lui (et lui seul) qui introduit l'extension (attention la modif proposée, sans contrôle particulier, ne fonctionne que s'il y a une extension) :

i = 0;    
while (*(szFile + i) != 0)
{
   *(name + i) = *(szFile + i);
   ++i;
}
while (*(szFile + i) != '.') --i;
*(name + i) = 0; // terminateur à la place du point

Si on veut tenir compte du fait qu'il n'y a pas forcément d'extension :

i = 0;    
while (*(szFile + i) != 0)
{
   *(name + i) = *(szFile + i);
   ++i;
}
*(name + i) = 0; // terminateur par défaut
while (i > 0)
{
   --i;
   if (*(name + i) == '\\') break; // pas d'extension
   if (*(name + i) == '/') break; // pas d'extension
   if (*(name + i) == '.')
   {
      *(name + i) = 0; // extension supprimée
      break;
   }
}

Jean-François
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

i = 0;    
while (*(szFile + i) != 0)
{



   *(name + i) = *(szFile + i);
   ++i;
}




while (*(name + i) != '.') --i; <--- c'est plus logique !!!

*(name + i) = 0; // terminateur à la place du point








Jean-François
Messages postés
18
Date d'inscription
samedi 14 juin 2008
Statut
Membre
Dernière intervention
11 novembre 2008

Merci Jean-François pour des conseils très justes.
Etant donné que tu réponds de la meilleure des façons aux questions que je me pose.
Pourrais-tu m'éclairer sur le point suivant:
je voudrais au fur et à mesure du traitement de mon fichier vtk ajouter des commentaires du genre:

traitement en cours...
x images ont été générées

est ce bien au moyen d la fonction SendMessage(hEdit...) que je dois m'y prendre.

Oui c vrai j'exagère de te poser toutes ces questions. Ne te sens pas obligé d'y répondre.
Tu m'as déjà bcp aidé pour aujourd'hui et je ne suis pas sur qu'en me machant le travail que je progresserai.
Merci bcp en tout cas.