[MFC] rendre une boite de dialogue invisible au lancement

rendre une boite de dialogue invisible au lancement [MFC] - Programmation

Marsh Posté le 18-09-2001 à 20:53:48    

je voudrais rendre invisible (SW_HIDE) ma boite de dialogue à son lancement. Mais quand je met  
ShowWindow(SW_MINIMIZE) dans OnInitDialog ca fonctionne par contre ShowWindow(SW_HIDE) non :(
 
pkoi ??

Reply

Marsh Posté le 18-09-2001 à 20:53:48   

Reply

Marsh Posté le 18-09-2001 à 22:16:44    

suffit pas simplement de pas faire de ShowWindow ? :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 18-09-2001 à 22:54:28    

non apparement il faut lancer la boite de dialogue en modeless (non modal) donc .. je viens de testé mais c'est pas concluant .. qq un pourrait-il me filer un bout de code ?

Reply

Marsh Posté le 18-09-2001 à 23:17:07    

pkoi ceci ne fonctionne pas ??
BOOL CTimeNetApp::InitInstance()
{
 AfxEnableControlContainer();
 
 // Standard initialization
 // If you are not using these features and wish to reduce the size
 //  of your final executable, you should remove from the following
 //  the specific initialization routines you do not need.
 
#ifdef _AFXDLL
 Enable3dControls();   // Call this when using MFC in a shared DLL
#else
 Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
 
 CTimeNetDlg *pDlg;
 pDlg = new CTimeNetDlg();
 pDlg->Create(IDD_TIMENET_DIALOG, (CWnd*)this);
 pDlg->ShowWindow(SW_SHOW);
 
 return TRUE;
}

Reply

Marsh Posté le 18-09-2001 à 23:17:38    

mon appli se lance et se ferme tout de suite apres sans message d'erreur

Reply

Marsh Posté le 18-09-2001 à 23:19:09    

tu fais le ShowWindow au mauvais endroit
appele cette methode dans le OnInitDialog de la classe dialogue et ca ira mieux je pense.

Reply

Marsh Posté le 19-09-2001 à 00:40:21    

deja testé dans le OnInitDialog.
 
le SW_MINIMIZE fonctionne mais pas le SW_HIDE apparement c'est 'normal' et pour cacher une boite de dialogue a son lancement il faut la lancer en non-modal mais le code que j'utilise n'a pas l'air de fonctionner :( l'appli se lance et se ferme tout de suite apres.
par contre si tu as une methode en domodal ca m'interresse!

Reply

Marsh Posté le 19-09-2001 à 11:44:34    

Je pense que c normal que ça marche pas en modal (même si j´ai tjrs essayé en non modal)..
 
Ben oui une modalbox hidden ça fait que l´utilisateur peut pas la fermer (plus de messages pour la fenêtre).. Et alors ton prog est coincé et sortira jamais du DoModal()..
 
Me trompe-je?? ;)


---------------
Athlon64 s754 10*200MHz - R9800Pro - 512MB DDR200MHz - ZX6RR - Q2[SupOp] - Tutorial Video: multilangues, multisstitres
Reply

Marsh Posté le 19-09-2001 à 13:17:19    

ba ouhai . c'est pour ca que ca fonctionne pas en domodal. Ca ne me derange pas de pas lancer ma boite en non modal .. le hic c'est que je code que j'applique n'est pas complet. Apparement, il faut que je rajoute kkchose dans la fonction create mais je c pas quoi.
donc en fait, maintenant je cherche de l'aide pour faire une  boite de dialogue en non modal :)

Reply

Marsh Posté le 19-09-2001 à 14:06:35    

Est-ce que par hazard tu aurais utilisé le wizzard de création de dialog box app de visual??
 
Car dans ce cas c normal que ton app quitte de suite, elle sort de InitInstance() et détruit l´instance de ton dialogue..
 
En gros ton dialogue est fille d´une autre fenêtre ou tu as uniquement une fenêtre que tu veux câcher?? (en gros l´app invisible) ;)

Reply

Marsh Posté le 19-09-2001 à 14:06:35   

Reply

Marsh Posté le 19-09-2001 à 14:28:53    

ah j'ai p'etre trouver la personne qui va me renseigner. bon alors j'ai effectivement crée un application mfc avec le wizard en selectionnant une simple boite de dialog comme projet.
Bon dans j'ai une classe derivée de Wnd et une classe derivée de DlgDialog.
 
la classe app lance ma boite de dialog en modal normalement et moi je voudrais la lancer en non-modal. Donc j'avais fait des modif
 
rajouté un create dans le InitInstance mais aussi forcer le InitInstance a renvoyer TRUE. Arrives tu as voir ce que j'essaye de dire ? apparement il faut que je rajoute des modifs dans le create de ma boite de dialog ..  
 
pourrais tu m'eclairer?

Reply

Marsh Posté le 19-09-2001 à 14:53:29    

Oui c exactement ce que je voulais dire..
 
Si tu veux un exemple d´InitInstance() qui quitte pas tt de suite va voir le résultat du wizzard pour une app single document.. :)

Reply

Marsh Posté le 19-09-2001 à 15:00:53    

ok je regarde ca ce soir merci pour le coup de main.
 
tu as un exemple de code chez toi ??? ca pourrait m'interresser.

Reply

Marsh Posté le 19-09-2001 à 15:09:59    

tu as un exemple de code chez toi ??? ca pourrait m'interresser.
Ben je sais pas tjrs exactement ce que tu veux faire..
Tu as une window mère (genre avec des menus et tout) et tu souhaite pouvoir rendre un dialogue fille parfois visible parfois invisible (auquel cas c tt simple), ou tu veux faire une app sans aucune fenêtre visible (auquel cas pquoi une fenêtre??)??.. :)

Reply

Marsh Posté le 19-09-2001 à 15:19:04    

oulla non.
 
en fait, j'ai ecris un compteur de tps passé sur internet. quand je minimise la boite de dialogue se met dans le systray. par contre elle se lance en mode SW_SHOW (je la vois) hors moi je voudrais juste la lancer au demarrage directement dans le systray sans voir la boite de dialogue d'ou l'utilité de lancer la boite de dialog en SW_HIDE.
 
mon projet se compose seulement du class app et d'une class dialog. L'app lance la dialog (logique) en mode modal. Et moi je voudrais modifier ce lancement pour que la boite de dialog soit en non modal et donc s'afficher directement dans le systray.
 
Arrive tu as me comprendre? ce qui n'est pas forcement evidement vu que je fais plusieurs chose en mm tps.
 
merci pour ton aide en tout cas.

Reply

Marsh Posté le 19-09-2001 à 15:36:31    

Je comprends pas si qd tu la minimise elle va ds le systray un ShowWindow(SW_MINIMIZE) dans OnInitDialog() devrait suffire..
Et tu dis au début que ça marche..  :??:

Reply

Marsh Posté le 19-09-2001 à 15:45:16    

hum quand je dis systemtray je parle de l'endroit ou il y a l'heure et le HP de windows (en bas à droite).
j'ai un classe CDialog derivée qui fait ca.
donc tout fonctionne impec, sauf que je souhaiterais lancer mon appli directement dans le systray et non pas le lancer en SW_SHOW pour apres le minimiser manuellement par moi meme.
Pour cela, il ne me suffit juste que de rendre ma boite de dialogue en mode SW_HIDE et d'afficher l'icode dans le systray, ce qui est possible car j'ai une fonction qui me permet ca.
Le hic, c'est que pour rendre ma boite de dialogue invisible au demarrage, je suis obligé de la lancer en non modale.. d'ou le probleme que j'ai actuellement.
 
compris?

Reply

Marsh Posté le 19-09-2001 à 16:20:26    

Je crois que cette fois ça y est!! ;)
 
ShowWindow(SW_MINIMIZE) dans OnInitDialog() ça a le défaut d´afficher ds le systray ET ds la barre des taches c ça??  :D  
 
Malheureusement je sais pas trop comment faire soi même le processing des messages..
Je viens d´essayer de bidouiller une app crée en single doc pour remplacer la fenêtre pricinpale par un CDialog ça marche mais pas moyen de détecter la fermeture du dialogue.. C certainement possible en programmant comme un porc (le dialogue qui envoie un message de fin de thread) mais si qqun avait une solution propre je suis curieux de savoir..


---------------
Athlon64 s754 10*200MHz - R9800Pro - 512MB DDR200MHz - ZX6RR - Q2[SupOp] - Tutorial Video: multilangues, multisstitres
Reply

Marsh Posté le 19-09-2001 à 16:29:00    

bah apparement c simple et surtout connu .. enfin c ce qu'on m'a dit, je devrais avoir un bout de code demain. En fait l'astuce consiste à lancer la boite de dialogue en non modal et de surcharger la methode create de la boite de dialogue. j'en c pas plus !
 
attention, moi je ne pars pas d'un "single document" mais d'un "dialog based".. ce qui doit surement changer qq chose.
 
enfin des que j'ai la soluce, je l'affiche ici
 
merci encore. @+
 
bien entendu si tu as la soluce avant moi ...  :D

Reply

Marsh Posté le 19-09-2001 à 22:00:08    

Ouais, parce que moi ça m'interesse aussi, j'ai tout ce qu'il faut, mais je suis confronté au même problème, et il me manque plus que ca pour finir mon appli !!!

Reply

Marsh Posté le 19-09-2001 à 22:07:10    

je m'approche du but .. voici le code .
 
BOOL CTimeNetApp::InitInstance()
{
 ......
 
 CTimeNetDlg *pDlg;
 pDlg = new CTimeNetDlg();
 pDlg->Create(IDD_TIMENET_DIALOG, (CWnd*)this);
 pDlg->ShowWindow(SW_HIDE);
 
 Sleep(10000); -> ici l'appli fonctionne pdt  10 secondes
 
 return TRUE; -> là l'appli quitte :(
}
 
il manque plus qu'à trouver comment ne pas quitter l'appli à la fin de InitInstance ..

Reply

Marsh Posté le 20-09-2001 à 01:57:43    

BOOL CTimeNetApp::InitInstance()  
{  
......  
 
CTimeNetDlg *pDlg;  
pDlg = new CTimeNetDlg();  
pDlg->Create(IDD_TIMENET_DIALOG, NULL); //fais gaffe, (CWnd *)this est une aberation, CWinApp ne derive pas de CWnd
pDlg->ShowWindow(SW_HIDE);  
 
Run(); //ca enclenche la pompe a message
 
return TRUE; -> là l'appli quitte    
}  
 
PS: le run est virtuel => si t'as besoin de tripatouiller c'est faissable. Pour la boite de dlg modale, j'ai regarde le code des MFC et effectivement billou y tiens à la visibilité de la boite de dialogue modale, il est donc bcp plus simple de contourner leur code que de vouloir ruser.

Reply

Marsh Posté le 20-09-2001 à 07:32:11    

merci pour ta reponse, malheureusement elle n'a pas l'air de fonctionner chez moi .. ou il manque encore qq chose car le resultat est le meme .. l'application quitte.
 
quel est le but de run() exactement ?
 
merci encore @+

Reply

Marsh Posté le 20-09-2001 à 08:32:42    

rajoute  m_pMainWnd = pDlg;  
avant l'appel à create
c'est Run, et cette methode + la doc tu la trouve dans la classe CWinApp.
Le Run a en gros ce code :
int CWinApp::Run()
{
 if (m_pMainWnd == NULL && AfxOleGetUserCtrl())
 {
  // Not launched /Embedding or /Automation, but has no main window!
  TRACE0("Warning: m_pMainWnd is NULL in CWinApp::Run - quitting application.\n" );
  AfxPostQuitMessage(0);
 }
 return CWinThread::Run();
}
 
et le CWinThread::Run, c'est a peu de choses pres une boucle infinie qui scrute l'ensemble des msg en povenance de win et les dispatche cf MSDN+code source

Reply

Marsh Posté le 20-09-2001 à 10:07:32    

merci pour l'aide :p  
je teste ça ce soir..

Reply

Marsh Posté le 20-09-2001 à 10:47:14    

Merci aqwsezsxdr lancer le processing des messages c donc pas si dur!! :)

Reply

Marsh Posté le 20-09-2001 à 20:43:20    

solution finale :
 
BOOL CTimeNetApp::InitInstance()
{
 AfxEnableControlContainer();
 
 // Standard initialization
 // If you are not using these features and wish to reduce the size
 //  of your final executable, you should remove from the following
 //  the specific initialization routines you do not need.
 
#ifdef _AFXDLL
 Enable3dControls();   // Call this when using MFC in a shared DLL
#else
 Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
 
 // Creation
 CTimeNetDlg *pDlg;
 pDlg = new CTimeNetDlg();
 m_pMainWnd = pDlg;
 int hWnd = pDlg->Create(IDD_TIMENET_DIALOG, NULL);
 pDlg->ShowWindow(SW_HIDE);
 pDlg->TrayShow();
 
 Run();
 
 // Destruction
 pDlg->TrayHide();
 delete pDlg;
 
 return TRUE;
}
 
ca marche  :pt1cable:  :pt1cable:  
 
merci à tous. En esperant que ca aidera d'autre personne   :jap:

Reply

Marsh Posté le 20-09-2001 à 21:15:41    

Super, j'vais essayer !

Reply

Marsh Posté le 20-09-2001 à 21:25:20    

arggg !! apparement ... y'a un prob  :(  
 
quand je clique sur la X pour fermer mon appli .. elle disparait bien mais elle reste presente dans les process de windows, so .. fo trouver un moyen arreter l'appli maintenant  :crazy:

Reply

Marsh Posté le 20-09-2001 à 21:30:18    

il fo utiliser : DestroyWindow( );

Reply

Marsh Posté le 26-09-2001 à 11:53:33    

a la place du run, essayes RunModalLoop (0)

 

[edtdd]--Message édité par MiniCooler--[/edtdd]


---------------
SetiCommander, le setiseur à la chaîne ...
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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