SAVE_AS en sortant avec la croix

grorel Messages postés 6 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 30 octobre 2007 - 30 oct. 2007 à 10:41
grorel Messages postés 6 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 30 octobre 2007 - 30 oct. 2007 à 16:35
Salut,


Quand je quitte une fenetre dans une de mes applications, si j'ai fait
un changement dans le Doc, on me demande si je veux enregistrer (jusque
la tout est normal)


J'aimerais, lorsque je souhaite enregistrer, ouvrir la boite de dialogue SAVE_AS mais je n'ai pas trouvé comment faire.


J'ai essayé de récupérer les signaux : ID_FILE_SAVE, ID_FILE_CLOSE et
ID_APP_EXIT avec la fonction "OnCommand (WPARAM,LPARAM)" mais aucun ne
fonctionne. En fait, il semblerait que la fonction ne soit meme pas
appelée.

Meme résultat avec ID_FILE_SAVE_AS. Mais je pense que ce sera plutot la
valeur que je donnerai à wParam des que j'aurais pu intercepter le
signal adhéquat.

voila ce que donne l'aide MSDN :

ID_FILE_CLOSE: Closes the currently open document.
CDocument::OnFileClose calls CDocument::SaveModified to prompt the user to save the document if it has been modified and then calls OnCloseDocument. All the closing logic, including destroying the document, is done in the OnCloseDocument routine.


Note ID_FILE_CLOSE acts differently from a WM_CLOSE message or an SC_CLOSE
system command sent to the documents frame window. Closing a window
will close the document only if that is the last frame window showing
the document. Closing the document with ID_FILE_CLOSE will not only close the document but will close down all frame windows showing the document.


A priori, il faut bien que j'intercepte avant l'appel de la fonction CDocument::OnFileClose. Ca marche bien avec le ID_FILE_CLOSE quand je fais "fichier->Close" dans le Menu mais pas quand je sors avec la croix.


Pour le moment, la fonction "OnCommand" se situe dans le mainFrame.cpp.
Je pense que c'est pour ca que le programme ne passe pas par cette
fonction quand je ferme une fenetre secondaire. (en meme temps, quand
je ferme la fenetre principale, je ne passe pas non plus par le
OnCommand mais je vais quand meme dans le OnClose).

Donc voila, je bloque. Si quelqu'un peu m'aider....

2 réponses

grorel Messages postés 6 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 30 octobre 2007
30 oct. 2007 à 13:06
Bon ben j'ai trouver en fait,

il faut surcharger la fonction :

BOOL CDocument::CanCloseFrame(CFrameWnd* pFrame);

Puis appeller dans cette fonction celle :

BOOL CMainFrame::OnCommand(WPARAM pParam, LPARAM lParam);

avec

wParam = ID_FILE_SAVE_AS;

la fonction OnCommand est une fonction de la classe CWnd, on peut facilement la surcharger dans la MainFrame du Projet. Si vous ne lavez pas surcharger dans la MainFrame et que vous l'appellliez directement en CWnd, il risque de se produire l'erreur

"impossible d'atteindre la fonction protected de CWnd"

Une surcharge du type est envisageable

BOOL CMainFrame::OnCommand(WPARAM wParam,LPARAM lParam)
{
return CMDIFrameWnd::OnCommand(wParam,lParam);
}

Voila, @+
0
grorel Messages postés 6 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 30 octobre 2007
30 oct. 2007 à 16:35
Salut, c'est remoi et je fais un double post parce que j'ai dis une connerie


Voila le code le plus simple que j'ai trouvé. Il teste l'extension des
fichiers lors de l'enregistrement (par clic ou lors de la fermeture).
Si le fichier n'est pas de l'extension IMG, le programme propose un
SAVE_AS avc cette extension.


D'abord dans le Doc.cpp
<!-- BEGIN TEMPLATE: bbcode_code -->

Code :
<!--[if !IE]><--><!----><!--[endif]--><!--[if IE]>
<![endif]-->BOOL CMyClassDoc::DoFileSave()
{
CString FileName,FileExt;

FileName = GetPathName();
FileExt=FileName.Right(FileName.GetLength()-FileName.ReverseFind('.') - 1);
FileExt.MakeUpper();
if((FileExt != "IMG") && (FileExt != FileName))
{
CString NewExt;
BOOL result;
CDocTemplate* pTemplate = GetDocTemplate();
FileExt.MakeLower();
NewExt.Format(".%s",FileExt);
FileName.Replace(NewExt,".img");
result=AfxGetApp()->DoPromptFileName(FileName,TRUE ? AFX_IDS_SAVEFILE : AFX_IDS_SAVEFILECOPY, OFN_HIDEREADONLY | OFN_PATHMUSTEXIST, FALSE, pTemplate) ;
if(result == TRUE)
{
SetPathName(FileName);
m_bModified = FALSE;
}
return result;
}
return CDocument::DoFileSave();

}
 

<!-- END TEMPLATE: bbcode_code -->Puis dans le MainFrame.cpp
<!-- BEGIN TEMPLATE: bbcode_code -->

Code :
<!--[if !IE]><--><!----><!--[endif]--><!--[if IE]>
<![endif]--> 
BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
TRY
{
DWORD LowWord = wParam & 0x0000FFFF;

if(LowWord == ID_FILE_SAVE_AS)
{

CMDIFrameWnd *pFrame =
(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;

// Get the active MDI child window.
CMDIChildWnd *pChild =
(CMDIChildWnd *) pFrame->GetActiveFrame();

CMyClassView *pView = (CMyClassView *) pChild->GetActiveView();
CMyClassDoc*pDoc = (CMyClassDoc*)pView->GetDocument();

CString FileName,FileExt;

FileName = pDoc->GetPathName();
FileExt=FileName.Right(FileName.GetLength()-FileName.ReverseFind('.') - 1);
FileExt.MakeUpper();
if((FileExt != "IMG") && (FileExt != FileName))
wParam = ID_FILE_SAVE;

}
return CMDIFrameWnd::OnCommand(wParam, lParam);
}
CATCH(CException, e)
{
return CMDIFrameWnd::OnCommand(wParam, lParam);
}
END_CATCH

}
 
 

<!-- END TEMPLATE: bbcode_code -->Voila, avec ca, je pense avoir pris
en compte tous les cas de sauvegarde et de fermeture pour que la
fenetre SAVE_AS s'ouvre pour tout type de fichier sauf IMG.


@+
0
Rejoignez-nous