FAQ VC++ et MFCConsultez toutes les FAQ
Nombre d'auteurs : 20, nombre de questions : 545, dernière mise à jour : 5 avril 2013 Ajouter une question
Cette faq a été réalisée pour répondre aux questions les plus fréquement posées sur le forum Développement Visual C++
Je tiens à souligner que cette faq ne garantit en aucun cas que les informations qu'elle contient sont correctes ; Les auteurs font le maximum, mais l'erreur est humaine. Si vous trouvez une erreur, ou si vous souhaitez devenir redacteur, lisez ceci.
Sur ce, je vous souhaite une bonne lecture. Farscape
La classe CFileDialog fait partie des boîtes de dialogue standards dérivées de la classe CCommonDialog.
Listes des boites de dialogues standard de ComDLG32:
- CColorDialog: Permet de sélectionner et créer une couleur
- CFileDialog : permet d'enregistrer ou d'ouvrir un fichier.
- CFindReplaceDialog : permet de remplacer une chaîne de caractères par une autre.
- CFontDialog : permet de choisir une police parmi celles du système.
- CPrintDialog : permet de sélectionner de configurer l'imprimante et d'imprimer un document.
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 | CFileDialog::CFileDialog CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL ); |
Ouverture d'un fichier :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | CString OpenFilter; OpenFilter = "Text File (*.txt)|*.txt||"; CFileDialog FileOpenDialog( TRUE, NULL, NULL, OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST, OpenFilter, // filter AfxGetMainWnd()); // the parent window if(FileOpenDialog.DoModal()==IDOK) { CFile File; VERIFY(File.Open(FileOpenDialog.GetPathName(),CFile::modeRead)); } |
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | CString OpenFilter; OpenFilter = "Text File (*.txt)|*.txt|"; OpenFilter += "All Files (*.*)|*.*||"; CFileDialog FileOpenDialog( TRUE, NULL, NULL, OFN_ALLOWMULTISELECT|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST, OpenFilter, // filter AfxGetMainWnd());// the parent window CString fileName; const int c_cMaxFiles = 100; // 100 fichiers maximum const int c_cbBuffSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1; FileOpenDialog.GetOFN().lpstrFile = fileName.GetBuffer(c_cbBuffSize); FileOpenDialog.GetOFN().nMaxFile = c_cbBuffSize; // attention : malgré le // nom de l'attribut, il s'agit bien de la // taille du buffer et non du nombre // max de fichier ! if(FileOpenDialog.DoModal()==IDOK) { POSITION pos=FileOpenDialog.GetStartPosition(); while(pos) { AfxMessageBox(FileOpenDialog.GetNextPathName(pos)); } } fileName.ReleaseBuffer(); |
Code c++ : | Sélectionner tout |
1 2 | CFileDialog FileOpenDialog( FALSE, "dat", NULL, OFN_HIDEREADONLY, "Fichiers (*.dat)|*.dat||" ); |
Code c++ : | Sélectionner tout |
1 2 3 | CFileDialog FileOpenDialog( FALSE, "dat", NULL, OFN_HIDEREADONLY, "Fichiers (*.dat)|*.dat||" ); FileOpenDialog.m_ofn.lpstrInitialDir="c:\\myprojects"; |
En surchargeant la méthode virtuelle OnFolderChange qui est appelée à chaque changement de répertoire (message WM_NOTIFY).
La récupération du nom se fait par la fonction CommDlg_OpenSave_GetFolderPath
Pour plus de détails se reporter à la note d'information MSDN : CDM_GETFOLDERPATH Message
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | ///////////////////////////////////////////////////////////////////////////// // CMyFileDialog class CMyFileDialog : public CFileDialog { DECLARE_DYNAMIC(CMyFileDialog) public: CMyFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL); virtual void OnFolderChange( ); public: CString m_szDirName; protected: //{{AFX_MSG(CMyFileDialog) // NOTE - the ClassWizard will add and remove member functions here. //}}AFX_MSG DECLARE_MESSAGE_MAP() }; IMPLEMENT_DYNAMIC(CMyFileDialog, CFileDialog) CMyFileDialog::CMyFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName, DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) : CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd) { } BEGIN_MESSAGE_MAP(CMyFileDialog, CFileDialog) //{{AFX_MSG_MAP(CMyFileDialog) // NOTE - the ClassWizard will add and remove mapping macros here. //}}AFX_MSG_MAP END_MESSAGE_MAP() /*virtual*/ void CMyFileDialog::OnFolderChange() { // char buf[256]; CommDlg_OpenSave_GetFolderPath( GetParent()->m_hWnd, buf, 256 ); m_szDirName = buf; } |
Il faut faire une classe dérivée de CFileDialog (avec classwizard) et redéfinir la fonction virtuelle :
Code c++ : | Sélectionner tout |
virtual void OnTypeChange()
L'étape suivante consiste à trouver la ComboBox de sélection.
Dans mon exemple j'ai fais un premier essai avec un message avec la macro TRACE pour repérer son identifiant , c'est le code entre commentaire.
Après j'accède directement à la valeur de la zone par un GetWindowText.
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | /*virtual */void CMyFileDialog::OnTypeChange() { CString str; CWnd *pWnd=this; /*char sz[256]; bool bFirst=true; while(pWnd=pWnd->GetWindow(bFirst?GW_HWNDFIRST:GW_HWNDNEXT)) { bFirst=false; if(GetClassName(pWnd->GetSafeHwnd(),sz,sizeof(sz))) { if(CString(sz)=="ComboBox") { pWnd->GetWindowText(str); TRACE("\ntype:%s- %u",(const char *)str,pWnd->GetDlgCtrlID()); } } }*/ pWnd=GetParent(); pWnd->GetDlgItem(1136)->GetWindowText(str); TRACE("\n%s",(const char *)str); } |
Il suffit d'aller regarder la fonction OnNotify dans le source de la classe CFileDialog pour avoir un aperçu rapide !
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | BOOL CFileDialog::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { ASSERT(pResult != NULL); // allow message map to override if (CCommonDialog::OnNotify(wParam, lParam, pResult)) return TRUE; OFNOTIFY* pNotify = (OFNOTIFY*)lParam; switch(pNotify->hdr.code) { case CDN_INITDONE:OnInitDone(); return TRUE; case CDN_SELCHANGE:OnFileNameChange(); return TRUE; case CDN_FOLDERCHANGE:OnFolderChange(); return TRUE; case CDN_SHAREVIOLATION: *pResult = OnShareViolation(pNotify->pszFile); return TRUE; case CDN_HELP:if (!SendMessage(WM_COMMAND, ID_HELP)) SendMessage(WM_COMMANDHELP, 0, 0); return TRUE; case CDN_FILEOK:*pResult = OnFileNameOK(); return TRUE; case CDN_TYPECHANGE:OnTypeChange(); return TRUE; } return FALSE } |
- virtual void OnInitDone( ) :
Appelée quand la boîte de dialogue est entièrement initialisée - virtual void OnFileNameChange( ) :
Appelée quand l'utilisateur sélectionne un nouveau fichier ou répertoire. - virtual void OnFolderChange( ) :
Appelée quand un nouveau répertoire est ouvert . - virtual UINT OnShareViolation( LPCTSTR lpszPathName ) :
Permet de maîtriser le mécanisme de violation de partage sur un fichier .
Si on ne veut pas de message il faut mettre le type OFN_SHAREAWAREdans m_ofn.Flags. - virtual BOOL OnFileNameOK :
Permet de gérer la validité du nom proposé dans la sélection lors de l'appui sur le bouton OK. - virtual void OnTypeChange():
Appelée quand l'utilisateur sélectionne un nouveau type de fichier dans la ComboBox de sélection.
Voici les fonctions permettant de récupérer directement des valeurs :
CommDlg_OpenSave_GetSpec :
Code c++ : | Sélectionner tout |
1 2 3 | char buf[256]; CommDlg_OpenSave_GetSpec( GetParent()->m_hWnd, buf, 256 ); |
Code c++ : | Sélectionner tout |
1 2 3 | char buf[256]; CommDlg_OpenSave_GetFilePath ( GetParent()->m_hWnd, buf, 256 ); |
Code c++ : | Sélectionner tout |
1 2 3 | char buf[256]; CommDlg_OpenSave_GetFolderPath( GetParent()->m_hWnd, buf, 256 ); |
Voir MSDN pour de plus amples renseignements.
Pour finir voici une technique pour récupérer un pointeur sur un des éléments de la boite de dialogue.
Le code ci-dessus itère sur les fenêtres filles de la boîte de dialogue pour trouver un contrôle de type ComboBox.
A adapter selon ses besoins.
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /*virtual */ void CMyFileDialog::OnInitDone( ) { CWnd *pWnd=this; char sz[256]; bool bFirst=true; while(pWnd=pWnd->GetWindow(bFirst?GW_HWNDFIRST:GW_HWNDNEXT)) { bFirst=false; if(GetClassName(pWnd->GetSafeHwnd(),sz,sizeof(sz))) { if(CString(sz)=="ComboBox") { pWnd->GetWindowText(str); TRACE("\ntype:%s- %u",(const char *)str,pWnd->GetDlgCtrlID()); } } } } // Utilisation finale avec un numéro de contrôle trouvé, ici le sélecteur de type de fichiers. CWnd *pWnd=GetParent(); pWnd->GetDlgItem(1136)->GetWindowText(str); |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.