|
Dernière réponse | |
---|---|
Sujet : [MFC] rendre une boite de dialogue invisible au lancement | |
MiniCooler | a la place du run, essayes RunModalLoop (0) [edtdd]--Message édité par MiniCooler--[/edtdd] |
Aperçu |
---|
Vue Rapide de la discussion |
---|
MiniCooler | a la place du run, essayes RunModalLoop (0) [edtdd]--Message édité par MiniCooler--[/edtdd] |
la viper | il fo utiliser : DestroyWindow( ); |
la viper | 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: |
Rebel | Super, j'vais essayer ! |
la viper | 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: |
H4dd3R | Merci aqwsezsxdr lancer le processing des messages c donc pas si dur!! :) |
la viper | merci pour l'aide :p je teste ça ce soir.. |
aqwsezsxdr | 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 |
la viper | 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 @+ |
aqwsezsxdr | 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. |
la viper | 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 .. |
Rebel | 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 !!! |
la viper | 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 |
H4dd3R | 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.. |
la viper | 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? |
H4dd3R | 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.. :??: |
la viper | 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. |
H4dd3R | 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??)??.. :) |
la viper | ok je regarde ca ce soir merci pour le coup de main.
tu as un exemple de code chez toi ??? ca pourrait m'interresser. |
H4dd3R | 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.. :) |
la viper | 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? |
H4dd3R | 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) ;) |
la viper | 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 :) |
H4dd3R | 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?? ;) |
la viper | 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! |
aqwsezsxdr | tu fais le ShowWindow au mauvais endroit
appele cette methode dans le OnInitDialog de la classe dialogue et ca ira mieux je pense. |
la viper | mon appli se lance et se ferme tout de suite apres sans message d'erreur |
la viper | 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; } |
la viper | 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 ? |
antp | suffit pas simplement de pas faire de ShowWindow ? :D |
la viper | 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 ?? |