
| | auteur : 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.
CFileDialog::CFileDialog
CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );
|
Exemples d'utilisation de CFileDialog :
Ouverture d'un fichier :
CString OpenFilter;
OpenFilter = "Text File (*.txt)|*.txt||";
CFileDialog FileOpenDialog(
TRUE,
NULL,
NULL,
OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,
OpenFilter,
AfxGetMainWnd());
if(FileOpenDialog.DoModal()==IDOK)
{
CFile File;
VERIFY(File.Open(FileOpenDialog.GetPathName(),CFile::modeRead));
}
|
Sélections multiples de fichiers :
CString OpenFilter;
OpenFilter = "Text File (*.txt)|*.txt|";
OpenFilter += "All Files (*.*)|*.*||";
CFileDialog FileOpenDialog(
TRUE,
NULL,
NULL,
OFN_ALLOWMULTISELECT|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,
OpenFilter,
AfxGetMainWnd());
CString fileName;
const int c_cMaxFiles = 100;
const int c_cbBuffSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1;
FileOpenDialog.GetOFN().lpstrFile = fileName.GetBuffer(c_cbBuffSize);
FileOpenDialog.GetOFN().nMaxFile = c_cbBuffSize;
if(FileOpenDialog.DoModal()==IDOK)
{
POSITION pos=FileOpenDialog.GetStartPosition();
while(pos)
{
AfxMessageBox(FileOpenDialog.GetNextPathName(pos));
}
}
fileName.ReleaseBuffer();
|
Sauvegarde d'un fichier :
CFileDialog FileOpenDialog( FALSE, "dat", NULL, OFN_HIDEREADONLY, "Fichiers (*.dat)|*.dat||" );
|
Spécification du répertoire d'origine :
CFileDialog FileOpenDialog( FALSE, "dat", NULL, OFN_HIDEREADONLY, "Fichiers (*.dat)|*.dat||" );
FileOpenDialog.m_ofn.lpstrInitialDir="c:\\myprojects";
|
|
| | auteur : Farscape | 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
class CMyFileDialog : public CFileDialog
{
DECLARE_DYNAMIC(CMyFileDialog)
public:
CMyFileDialog(BOOL bOpenFileDialog,
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:
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)
END_MESSAGE_MAP()
void CMyFileDialog::OnFolderChange()
{
char buf[256];
CommDlg_OpenSave_GetFolderPath( GetParent()->m_hWnd, buf, 256 );
m_szDirName = buf;
}
|
Après DoModal la variable m_szDirNamecontient le chemin complet du répertoire en cours de sélection.
|
| | auteur : Farscape | Il faut faire une classe dérivée de CFileDialog (avec classwizard) et redéfinir la fonction virtuelle :
virtual void OnTypeChange()
|
Elle est appelée à chaque changement de sélection par l'intermédiaire d'un message WM_NOTIFY.
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.
void CMyFileDialog::OnTypeChange()
{
CString str;
CWnd *pWnd=this;
pWnd=GetParent();
pWnd->GetDlgItem(1136)->GetWindowText(str);
TRACE("\n%s",(const char *)str);
}
|
|
| | auteur : Farscape | Il suffit d'aller regarder la fonction OnNotify dans le source de la classe CFileDialog pour avoir un aperçu rapide !
BOOL CFileDialog::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
ASSERT(pResult != NULL);
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
}
|
Les fonctions qui suivent sont disponibles si le
type OFN_EXPLORER est utilisé à la création de la boîte de dialogue.
- 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_SHAREAWARE dans 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 :
char buf[256];
CommDlg_OpenSave_GetSpec( GetParent()->m_hWnd, buf, 256 );
|
CommDlg_OpenSave_GetFilePath : récupération du chemin du fichier en cours de sélection.
char buf[256];
CommDlg_OpenSave_GetFilePath ( GetParent()->m_hWnd, buf, 256 );
|
CommDlg_OpenSave_GetFolderPath : récupération du répertoire en cours de sélection :
char buf[256];
CommDlg_OpenSave_GetFolderPath( GetParent()->m_hWnd, buf, 256 );
|
CommDlg_OpenSave_GetFolderIDList(hDlg, pidl, cbmax) :permet de récupérer une structure ITEMIDLIST sur le répertoire courant .
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.
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());
}
}
}
}
CWnd *pWnd=GetParent();
pWnd->GetDlgItem(1136)->GetWindowText(str);
|
|
Consultez les autres F.A.Q.
 
|
|