rendre une boite de dialogue invisible au lancement [MFC] - Programmation
Marsh Posté le 18-09-2001 à 22:16:44
suffit pas simplement de pas faire de ShowWindow ?
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 ?
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;
}
Marsh Posté le 18-09-2001 à 23:17:38
mon appli se lance et se ferme tout de suite apres sans message d'erreur
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.
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!
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??
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
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)
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?
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..
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.
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??)??..
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.
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..
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?
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??
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..
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 ...
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 !!!
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 ..
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.
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 @+
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
Marsh Posté le 20-09-2001 à 10:47:14
Merci aqwsezsxdr lancer le processing des messages c donc pas si dur!!
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
merci à tous. En esperant que ca aidera d'autre personne
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
Marsh Posté le 26-09-2001 à 11:53:33
a la place du run, essayes RunModalLoop (0)
[edtdd]--Message édité par MiniCooler--[/edtdd]
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 ??