Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Problème de récupération de chemin valide [ Windows / GUI ] (piroman14)

mardi 1 juillet 2008 à 10:59:31 | Problème de récupération de chemin valide

piroman14

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);
    }
}


mardi 1 juillet 2008 à 11:33:06 | Re : Problème de récupération de chemin valide

juju12

t'aurais pas oublié un i++ dans ta boucle?

mardi 1 juillet 2008 à 11:50:22 | Re : Problème de récupération de chemin valide

piroman14

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

mardi 1 juillet 2008 à 12:43:37 | Re : Problème de récupération de chemin valide

Pistol_Pete

Salut
Le nom du fichier selectionner est directement accessible depuis la variable ofn.lpstrFile;
Pas d'autre traitement necessaire.

A+
Mon site internet : [ Lien ]


mardi 1 juillet 2008 à 13:12:33 | Re : Problème de récupération de chemin valide

jfrancois

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


mardi 1 juillet 2008 à 13:39:09 | Re : Problème de récupération de chemin valide

piroman14

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

mardi 1 juillet 2008 à 13:47:59 | Re : Problème de récupération de chemin valide

piroman14

 Voilà une solution qui marche     !! 
      i = 0;   
     while (*(szFile + i) != '.')
     {
     *(name + i) = *(szFile + i);
     ++i;
     }
     *(name + i) = 0;


mardi 1 juillet 2008 à 14:49:00 | Re : Problème de récupération de chemin valide

jfrancois

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


mardi 1 juillet 2008 à 14:51:27 | Re : Problème de récupération de chemin valide

jfrancois

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


mardi 1 juillet 2008 à 15:15:25 | Re : Problème de récupération de chemin valide

piroman14

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.


1 2

Cette discussion est classé dans : fichier, hwnd, wc, ofn, vtk


Répondre à ce message

Sujets en rapport avec ce message

Problème pour iconiser une application [ par piroman14 ] Noobinho one again!!Bonjour tout le monde!Je serais très reconnaissant si vous pouviez m'aiguiller pour ce programme.Je souhaite iconiser mon applicat Récupérer séparément Nom et Chemin d'un fichier [ par cartes1 ] BonjourAvec Visual studio C++ 6 en Api pur, je n'arrive pas à récupérer séparément le nom d'un fichier d'un côté et le chemin de l'autre ( sans le nom OPENFILENAME [ par mat74 ] salut à tous, voila je voudrais ouvrir une boite dialogue pour enregistrer un fichier, récupérer la valeur de type, et rajouter un bouton suivant la v Conserver messages dans hEdit à chaque envoi de nveau message [ par piroman14 ] Bonjour tout le monde:Dsl mais je suis toujours aussi mauvais en winAPI depuis la dernière fois.Mon problème est que je n'arrive pas à conserver les m Poblème avec un pointeur... [ par xxDarkSidexx ] Bonsoir,J'essaye tant bien que mal de mettre en place une ListView...Le seul problème est malheureusement cette ligne de code...je n'arrive pas a savo Application MDI dans une classe [ par PLUiK ] Salut!Je voudrais savoir s'il est possible de coder uneapplication MDI en C++ (en mettant presque tout le codedans la classe):#include //Code de la cl OPENFILENAME et fichier ini [ par raoulman ] Bonjour, Voilà le problème. J'ai une boîte de dialogue avec plusieurs EditBox et un bouton qui m'ouvre la boîte de dialogue "ouvrir" de Windows en ut 2 Questions : icone fenetre & Taille... [ par clabe ] Bonjour, Je voudrais savoir comment je pourrais tout d'abord changer l'icone dans la barre de titre de ma fenetre... Ensuite j'aurais aimé savoir comm Ouvrir un fichier : problème de LPWSTR ne VC++ [ par marco123456789 ] Je souhaterais obtenir l'adresse d'un fichier en utilisant une fenetre OUVRIR de WINDOWS (un OPENFILENAME).Or le code ne compile pas car il semble imp Tabulation dans les champs d'une fenetre [ par billy5938 ] Bonjour,Je veux pouvoir parcourir les champs d'édition (ou même des checkBox) d'une fenetre. En utilisant la methode IsDialogMessage dans la boucle de


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,250 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.