Fenêtre "Ouvrir un fichier"

Fenêtre "Ouvrir un fichier" - C++ - Programmation

Marsh Posté le 07-03-2003 à 21:07:53    

'lut,
 
Dans une appli c++  j'essaie d'ouvrire une boite de dialogue type "ouvrir un fichier", donc avec la fonction GetOpenFileName.
J'utilise le bout de code suivant :
 

Code :
  1. OPENFILENAME ofn;       // common dialog box structure
  2. char szFile[260];       // buffer for file name
  3. // Initialize OPENFILENAME
  4. ZeroMemory(&ofn, sizeof(ofn));
  5. ofn.lStructSize = sizeof(ofn);
  6. ofn.hwndOwner = hwndDlg;
  7. ofn.lpstrFile = szFile;
  8. ofn.nMaxFile = sizeof(szFile);
  9. ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
  10. ofn.nFilterIndex = 1;
  11. ofn.lpstrFileTitle = NULL;
  12. ofn.nMaxFileTitle = 0;
  13. ofn.lpstrInitialDir = NULL;
  14. ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
  15. // Display the Open dialog box.  
  16. GetOpenFileName(&ofn);


 
Pour donner qq éléemtns du contexte, je suis déjà dans une boite de dialoge (hwndDlg), et je l'ouvre à partir de ça.
Et le pb c'est que ça fait rien du tout.... et je comprends pas pkoi...
 
Merci de votre aide.

Reply

Marsh Posté le 07-03-2003 à 21:07:53   

Reply

Marsh Posté le 07-03-2003 à 21:15:43    

Y'a pas assez de code. Poste tout ce que tu peux.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-03-2003 à 21:22:55    

Je vais quand meme pas balancer tt mon code, mais bon je vais essayer de vous mettre ce ki me semble utile :
 
Dans le wmain(...) :

Code :
  1. // Appel de la boîte de dialogue
  2.           DialogBox(hThisInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DialogProc);


 
La fonction DialogProc (enfin un peu filtrée) :
 

Code :
  1. BOOL CALLBACK DialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
  2. {
  3. char tempstring[32];
  4.     char temp1[32],temp2[32],temp3[32];
  5.     int j,p;
  6.     switch(uMsg)
  7. {
  8.  case WM_COMMAND:
  9.  {                                                     
  10.   switch(LOWORD(wParam))
  11.   {
  12.                 case IDC_BUTTON_REP_WP:
  13.                 {
  14. //        MessageBox( hwndDlg, "Z'avez appuyé sur changer rep", "ERREUR", MB_OK|MB_ICONEXCLAMATION);
  15. OPENFILENAME ofn;       // common dialog box structure
  16. char szFile[260];       // buffer for file name
  17. //HWND hwnd2;              // owner window
  18. //HANDLE hf;              // file handle
  19. // Initialize OPENFILENAME
  20. ZeroMemory(&ofn, sizeof(ofn));
  21. ofn.lStructSize = sizeof(ofn);
  22. ofn.hwndOwner = hwndDlg;
  23. ofn.lpstrFile = szFile;
  24. ofn.nMaxFile = sizeof(szFile);
  25. ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
  26. ofn.nFilterIndex = 1;
  27. ofn.lpstrFileTitle = NULL;
  28. ofn.nMaxFileTitle = 0;
  29. ofn.lpstrInitialDir = NULL;
  30. ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
  31. // Display the Open dialog box.  
  32. GetOpenFileName(&ofn);
  33. //    hf = CreateFile(ofn.lpstrFile, GENERIC_READ,
  34. //        0, (LPSECURITY_ATTRIBUTES) NULL,
  35. //        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
  36. //        (HANDLE) NULL);
  37.                     return TRUE;
  38.                     break;
  39.                 }
  40.   }
  41.  }
  42.  default:
  43.   break;
  44. }
  45. return FALSE;
  46. }


 
Chépas si ça suffit, mais en regardant mon code c'est tout ce ke je trouve qui s'y rapporte...
 
Merci.

Reply

Marsh Posté le 07-03-2003 à 21:54:16    

Le premier caractère de ofn.lpstrFile doit toujours être NULL, sinon tu auras une erreur CDERR_INITIALIZATION (tu peux récupérer ce code d'erreur en appelant CommDlgExtendedError() juste après l'appel à GetOpenFileName()
 
Pour résoudre ceci, tu dois initialiser le buffer szFile avec des valeurs nulles. Le mieux est de faire un ZeroMemory. Rajoute la ligne :
 

Code :
  1. ZeroMemory (szFile, sizeof(szFile));


 
avant la ligne

Code :
  1. ofn.lpstrFile = szFile;


et ça devrait fonctionner.
 
Conseil : toujours récupérer les codes d'erreur fournis par les fonctions !


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-03-2003 à 22:26:42    

Génial merci !
Mais dis moi, comment ça marche cette fonction CommDlgExtendedError() ?
Je vois que ça me retourne un DWORD, comment on utilise ça ?

Reply

Marsh Posté le 07-03-2003 à 22:34:59    

tu dois insérer l'entête correspondant au début de ton source :
 

Code :
  1. #include <cderr.h>


 
Tous les codes d'erreur de CommDlg sont déclarés dans ce fichier. Ils commencent tous par CDERR_****.
Donc tu dois intercepter tous les codes possibles comme ceci par exemple :
 

Code :
  1. if (!GetOpenFileName(&ofn)) {
  2.    DWORD err = CommDlgExtendedError();
  3.    switch (err) {
  4.       case CDERR_DIALOGFAILURE:
  5.          MessageBox(hWnd, "CDERR_DIALOGFAILURE", "ERREUR", MB_OK|MB_ICONEXCLAMATION);
  6.          break;
  7.       case CDERR_GENERALCODES:
  8.          MessageBox(hWnd, "CDERR_GENERALCODES", "ERREUR", MB_OK|MB_ICONEXCLAMATION);
  9.          break;
  10.       case CDERR_STRUCTSIZE:
  11.          MessageBox(hWnd, "CDERR_STRUCTSIZE", "ERREUR", MB_OK|MB_ICONEXCLAMATION);
  12.          break;
  13.       case CDERR_INITIALIZATION:
  14.          MessageBox(hWnd, "CDERR_STRUCTSIZE", "ERREUR", MB_OK|MB_ICONEXCLAMATION);
  15.          break;
  16.       }
  17. // etc...etc...


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 08-03-2003 à 00:32:12    

Ah ok ben merci beaucoup Harkonnen :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed