begin process at 2012 05 30 16:59:16
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

MFC

 > 

SAVE_AS en sortant avec la croix


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

SAVE_AS en sortant avec la croix

mardi 30 octobre 2007 à 10:41:22 | SAVE_AS en sortant avec la croix

Grorel

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....
mardi 30 octobre 2007 à 13:06:49 | Re : SAVE_AS en sortant avec la croix

Grorel

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, @+
mardi 30 octobre 2007 à 16:35:03 | Re : SAVE_AS en sortant avec la croix

Grorel

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
Code :
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();

}
 
Puis dans le MainFrame.cpp
Code :
 
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


}
 
 
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.

@+


Cette discussion est classée dans : file, id, document, close, save


Répondre à ce message

Sujets en rapport avec ce message

ID_FILE_MRU_FILE1 [ par xakal ] Bonjour a tous.Il faut que je recupere la pathname d'un fichier ouvert par une appli lors d'une utilisation anterieure a l'actuelle.Il me semble que c Impression en MFC [ par ketchupy45 ] Bonjour, je programme sous visual studio .net 2003 et j'utilise les MFC.Dans le cadre de cette source http://www.cppfrance.com/code.aspx?ID=35554Je vo visual c++ strings [ par zouippy ] Bon je vous explique mon problème rapidement: J'ai fais un petit programme en MFC sous visual c++. Je récupère les donnée d'un fichier via une classe Problème de sauvegarde de fichiers en gtk [ par tony952 ] Bonjour j'ai un soucis pour la sauvegarde de fichiers en GTK. Lorsque j'ouvre le fichier que j'ai enregistré, le programme m'affiche des symboles inco menu déroulant POPUP [ par artichaud ] hello, je découvre les joies des MFC (VC++6) au boulot (stagiaire, personne qui connait Visual, super)j'ai un popup menu IDR_MAINFRAME dans lequel il probleme a la con [ par flatou ] slt a tousj'ai une fenetre, avec un menu. j'ai un identifiant de menu qui est IDR_FILE_SAVEa un moment dans mon programme, je dois executé le code qui VC++ et erreurs de compilations :( [ par morpheus83z ] Bonjour tout le monde !Voilà, je ne comprends pas, j'ai un programme qui ne veut pas se compiler et je désespère vraiment ...#include // iostream.h e Prob Création de plusieurs fichiers [ par malik7934 ] Hello!J'ai un programme qui crée et remplit un fichier texte ainsi:hDestFile = CreateFile("C:/WINDOWS/Temp/this-is-a-temporary-file.crypt",GENERIC_WRI Manipulation de date [ par alphaone ] Bonjour, j'ai fait une fonction pour copier la date d'un fichier vers un autre:[code]/** \brief change file time with system time\param file File name Insérer la valeur d'une variable entre deux balise XML. [ par 2eio ] Bonjour.J'ai créé un programme en Langage C, qui crée un fichier XML avec sa DTD, sous Paradigm C++.Mon problème est que je n'arrive pas à y inclure l


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,655 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales