[MFC VC++6]Mettre en barre de tache au démarrage...[résolu]

Mettre en barre de tache au démarrage...[résolu] [MFC VC++6] - C++ - Programmation

Marsh Posté le 23-05-2003 à 09:22:22    

Mon application MFC se lance en meme temps que windows (au démarrage donc)...
Je voudrais qu'au moment ou elle se lance, elle soit minimisée.
Cette minimisation est controlée par la fonction OnResize qui, si la fenetre est minimisée, la fait disparaitre de la barre des taches (ShowWindow(SW_HIDE)) et affiche une trayicon.
Le problème est que je n'arrive pas à minimiser cette dialog depuis mon programme. Voici le code que j'ai essayé :
 

Code :
  1. DWORD SystemStart = ::GetTickCount();
  2. if(SystemStart <= 2000000)
  3. {
  4. ShowWindow(SW_MINIMIZE);
  5. ShowWindow(SW_HIDE);
  6. OnSysCommand(SC_MINIMIZE,SC_HOTKEY);
  7. cpt_state=1;
  8. }
  9. else
  10. {
  11. ShowWindow(SW_SHOWNORMAL);
  12. }


 
J'avais essayé juste avec ShowWindow(SW_MINIMIZE) mais ca n'avait aucun effet. En rajoutant ShowWindow(SW_HIDE), la fenetre se mettait en arriere plan, et le trayicon apparaissait (mais la fenetre était toujours en barre des taches :().
J'ai rajouté OnSysCommand(SC_MINIMIZE,SC_HOTKEY), et maintenant, l'application plante : Elle démarre, puis s'arrete aussitot...
 
 
Vous auriez des suggestions ? :jap: Par avance, merci


Message édité par backdafuckup le 26-05-2003 à 10:28:53
Reply

Marsh Posté le 23-05-2003 à 09:22:22   

Reply

Marsh Posté le 23-05-2003 à 09:35:05    

J'ai essayé la fonction CloseWindow() de la manière suivante :
 

Code :
  1. ::CloseWindow(GetSafeHwnd());


 
Mais ca n'a eu aucun effet...

Reply

Marsh Posté le 23-05-2003 à 09:36:33    

tu fais ton bazard a quel moment ? (dans le lancement du programme je cause)

Reply

Marsh Posté le 23-05-2003 à 09:37:33    

ha ouais bien vu, ca se peut que ca m.... si tu le fais rop tot, quand tout n'est pas encore construit.

Reply

Marsh Posté le 23-05-2003 à 09:39:45    

je le fait dans la fonction OnInitDialog(), il faut pas ? (et je le fait tout à la fin de cette fonction...)

Reply

Marsh Posté le 23-05-2003 à 09:40:39    

Space, normalement la fenetre est construite a ce moment la

Reply

Marsh Posté le 23-05-2003 à 09:41:51    

chrisbk a écrit :

Space, normalement la fenetre est construite a ce moment la


t'es sur?
 
backda> t'as qu'a essayer ton code lorsque tu cliques sur un boutton

Reply

Marsh Posté le 23-05-2003 à 09:42:23    

c'est pour ca que je comprends pas...
J'ai mis des msgbox dans OnSize, pour voir si c'était pas ca qui foirait tout, mais non...
Dans le code que j'ai mis plus haut, j'avais integré une messagebox pour savoir si je rentrais dans le if. Au démarrage, la messagebox apparaissait en continu (tu appuies sur OK et elle réapparait quoi)... ca vient d'ou ?

Reply

Marsh Posté le 23-05-2003 à 09:42:47    

polo021 a écrit :


t'es sur?
 
backda> t'as qu'a essayer ton code lorsque tu cliques sur un boutton


 
98% (sinon ton idee de test est pas con)
j'avais deja fait ce genre de blague (minimiser au demarrage) mais je sais pu comment et le code est chez moi [:dawa]

Reply

Marsh Posté le 23-05-2003 à 09:49:16    

J'ai fait le test de polo...
 
Vous avez une corde ?
 
Je le place sur un bouton (le meme code, exactement)
Et la ca marche. La fenetre se minimise, disparait pour laisser la place au trayicon....
 
http://banguy.free.fr/smileys/mort16.gif

Reply

Marsh Posté le 23-05-2003 à 09:49:16   

Reply

Marsh Posté le 23-05-2003 à 09:50:17    

backdafuckup a écrit :

J'ai fait le test de polo...
 
Vous avez une corde ?
 
Je le place sur un bouton (le meme code, exactement)
Et la ca marche. La fenetre se minimise, disparait pour laisser la place au trayicon....
 
http://banguy.free.fr/smileys/mort16.gif


 
ben tu sais pas ce qu'il se passe apres le Oninit aussi, ca se trouve y'a un appel pour montrer la fenetre etc etc
fo que tu approfondisse les messages envoyees lors de la creation d'une fenetre

Reply

Marsh Posté le 23-05-2003 à 09:51:35    

je vais fouiller dans ce sens, merci chris...

Reply

Marsh Posté le 23-05-2003 à 10:06:05    

Est ce que les fonctions que j'ai montrées plus haut sont automatiquement appliquées à ma Dialog ? ou faut il spécifier ?
A mon avis c'est automatique, étant donné que ca fait tout buguer : avec ce qui est la haut, l'icone tray apparait, mais l'icone de la barre des taches clignote :ouch: !

Reply

Marsh Posté le 23-05-2003 à 10:09:36    

le OnInitDialog est appele lors du DoModal mais pour ma part je pense que la fenetre n'apparait que lorsqu'on sort du OnInitDialog. Enfin j'en sais trop rien. Je vais aller tenter de me renseigner la dessus, j'ai pas grand chose d'autre a faire la.

Reply

Marsh Posté le 23-05-2003 à 10:37:22    

Je ne trouve rien de mon coté...
Je ne comprends pas...
Est ce que ca peut marcher si le OnInitDialog appelle une fonction (à la fin du OnInitDialog biens sur) qui elle ferait minimiser la fenetre ?
 
Ou alors y a t'il un moyen de faire executer une fonction juste après le OnInitDialog ?

Reply

Marsh Posté le 23-05-2003 à 10:40:21    

backdafuckup a écrit :

Je ne trouve rien de mon coté...
Je ne comprends pas...
Est ce que ca peut marcher si le OnInitDialog appelle une fonction (à la fin du OnInitDialog biens sur) qui elle ferait minimiser la fenetre ?
 
Ou alors y a t'il un moyen de faire executer une fonction juste après le OnInitDialog ?


je n'ai rien truve non plus sur le fonctionnement du oninitdialog en preofrondeur  :pfff:  
 
Pour la fonction que tu vx appeler a la fin du oninitdialog, ca ne va strictement rien changer a mon avis.
 
Ce que tu vx faire en fait c'est minimiser des que le pgm est lance?

Reply

Marsh Posté le 23-05-2003 à 10:41:09    

Essaye un coup avec la fonction OnInitialUpdate de la View pour voir ce que ca donne.

Reply

Marsh Posté le 23-05-2003 à 10:41:22    

Voila, tout à fait.En fait, je veux qu'il démarre en meme temps que windows (ca c'est dans le regedit, c'est fait), mais qu'il ne s'affiche pas à l'écran, je veux juste qu'il y ait son trayicon....

Reply

Marsh Posté le 23-05-2003 à 10:46:01    

tu pourrais surement trouver ca dans les sources qu'il y a sur le site que je t'avais file ce matin.
 
Sinon, a la bourrin, un ptit timer qui apres X secondes minimize le pgm. Puis tu disables le timer.  :whistle:

Reply

Marsh Posté le 23-05-2003 à 10:46:44    

polo021 a écrit :

tu pourrais surement trouver ca dans les sources qu'il y a sur le site que je t'avais file ce matin.
 
Sinon, a la bourrin, un ptit timer qui apres X secondes minimize le pgm. Puis tu disables le timer.  :whistle:  


ben oui, mais je le placerais ou ce timer ???

Reply

Marsh Posté le 23-05-2003 à 10:52:34    

backdafuckup a écrit :


ben oui, mais je le placerais ou ce timer ???


tu t'en fous de ou tu le place le timer mais c'est quand meme pas tres propre et tres laid de faire ca.
 
Essaye d'abord de tapper ton code de minimisation soit dans le Oninitialupdate de la vue, soit dans le OnCreate du CMainframe. Mais je doute du resultat :sweat:
 
EDIT : essaye aussi dans le InitInstance de ton CxxxApp


Message édité par polo021 le 23-05-2003 à 10:54:38
Reply

Marsh Posté le 23-05-2003 à 10:54:58    

Je n'ai aucune de ces trois fonctions...
 
C'est une appli dialog based, et je crois pas que ce soit pareil qu'une appli sdi...

Reply

Marsh Posté le 23-05-2003 à 10:59:51    

C'est impensable, j'ai un bouquin énorme de MFC professional edition par un mec avec un nom pas d'ici qui apparemment est un pro, et il est meme pas capable de m'expliquer OnInitDialog, à part me dire que c'est la fonction appelée au démarrage de l'application dans mon cas...

Reply

Marsh Posté le 23-05-2003 à 11:36:06    

OnInitDialog est la fonction qui est appelée avant la création de la boite de dialogue.
 
Donc si tu veux que ton programme soit dans le TrayIcon, tu créé ladite TrayIcon dans cette fonction, et juste après tu y colles un ShowWindow(SW_HIDE).
 
Ca fonctionne très bien, j'ai déjà employé cette méthode un paquet de fois.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 23-05-2003 à 11:39:30    

J'ai remplacé mon code par ca :
 

Code :
  1. DWORD SystemStart = ::GetTickCount();
  2. if(SystemStart <= 1000000000000000000)
  3. {
  4. NOTIFYICONDATA nid;
  5. nid.cbSize = sizeof(NOTIFYICONDATA);
  6. nid.hWnd = GetSafeHwnd();
  7. nid.uID = 1;
  8. nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
  9. strcpy(nid.szTip,"Surveillance du CCD..." );
  10. nid.uCallbackMessage = WM_TRAYMESSAGE;
  11. nid.hIcon = (HICON) AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  12. Shell_NotifyIcon(NIM_ADD,(_NOTIFYICONDATAA *)&nid);
  13. ShowWindow(SW_HIDE);
  14. cpt_state=1;
  15. }
  16. else
  17. {
  18. ShowWindow(SW_SHOWNORMAL);
  19. }


 
 
Mais ca ne marche toujours pas !!!
L'icone est créée, mais la dialog reste affichée en premier plan !!! or moi je veux qu'elle ne soit qu'en trayicon, et pas en barre des taches !

Reply

Marsh Posté le 23-05-2003 à 12:44:39    

si j'ai tout compris, faut qu'elle disparaisse de la barre des taches ?
 
en mfc je sais pas, mais en win32 faut handler WM_SYSCOMMAND, et si le wParam == SC_MINIMIZE, faut retourner TRUE pour faire disparaitre l'appli de la barre des taches.
 
le code :

Code :
  1. case WM_SYSCOMMAND:
  2. {
  3. if (wParam == SC_MINIMIZE)
  4. {
  5.  AddTrayIcon();
  6.  ShowWindow(hWndDlg, SW_HIDE);
  7.  return TRUE; // TRUE pour faire disparaitre de la barre des taches
  8. }
  9. return FALSE;
  10. }


 
apres, les gens vont te dire l'equivalent en mfc...
 
edit : raté du return FALSE a la place du return TRUE


Message édité par Konar le 23-05-2003 à 13:18:34
Reply

Marsh Posté le 23-05-2003 à 12:46:34    

Konar a écrit :

si j'ai tout compris,  
apres, les gens vont te dire l'equivalent en mfc...


 
au pif : OnSysCommand ?  


Message édité par chrisbk le 23-05-2003 à 12:46:56
Reply

Marsh Posté le 23-05-2003 à 12:58:55    


 
oui, la fenetre est créée (le m_hWnd est valide) dès le InitDialog().

Reply

Marsh Posté le 23-05-2003 à 15:34:47    

Ceci était implémenté chez moi :
 

Code :
  1. void CPremiereAppliDlg::OnSysCommand(UINT nID, LPARAM lParam)
  2. {
  3.   if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  4.   {
  5. CAboutDlg dlgAbout;
  6. dlgAbout.DoModal();
  7.   }
  8.   else
  9.   {
  10. CDialog::OnSysCommand(nID, lParam);
  11.   }
  12. }


 
Je te remercie Konar (ca fait bizarre de dire ca :lol:), mais mon but est que la fenetre se minimise dès le démarrage de windows, donc de l'application
En fait il faudrait qu'elle se minimise pendant la fonction mfc 'OnInitDialog'. Mais apparement, ca ne peut pas marcher.
Il me faut donc trouver une solution pour qu'une fonction se lance dès la fin de OnInitDialog

Reply

Marsh Posté le 23-05-2003 à 15:41:26    

Lu Back, euh la peut pas recup du code sur mon poste, mais quand je rentre je te poste un morceau de code car c possible de le faire (que ce soit dlg ou xDi based) des le demarrage de l'appli.

Reply

Marsh Posté le 23-05-2003 à 15:42:17    

Par contre gaffe au code ds le SysCommand, testé avant tt chose si les fenetre son valide car c appele 2 ou 3 fois avant que reelement la dlg soit visible.

Reply

Marsh Posté le 23-05-2003 à 15:42:48    

backdafuckup a écrit :

Ceci était implémenté chez moi :
 

Code :
  1. void CPremiereAppliDlg::OnSysCommand(UINT nID, LPARAM lParam)
  2. {
  3.   if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  4.   {
  5. CAboutDlg dlgAbout;
  6. dlgAbout.DoModal();
  7.   }
  8.   else
  9.   {
  10. CDialog::OnSysCommand(nID, lParam);
  11.   }
  12. }


 
Je te remercie Konar (ca fait bizarre de dire ca :lol:), mais mon but est que la fenetre se minimise dès le démarrage de windows, donc de l'application
En fait il faudrait qu'elle se minimise pendant la fonction mfc 'OnInitDialog'. Mais apparement, ca ne peut pas marcher.
Il me faut donc trouver une solution pour qu'une fonction se lance dès la fin de OnInitDialog


 
[mode bourrin on]
heuuu un OnMouseMouse sur la fenetre  :whistle:  
[mode bourrin off]

Reply

Marsh Posté le 23-05-2003 à 15:44:49    

Erf mode tres bourin la :lol:

Reply

Marsh Posté le 23-05-2003 à 15:46:24    

merci visual c'est cool à toi..
J'ai pas compris l'histoire de OnSysCommand
De toute facon, je n'ai pas besoin de l'utiliser ca moi ? si ?
 
edit: ca se dit pas d'ailleurs "c'est cool à toi"... :D


Message édité par backdafuckup le 23-05-2003 à 15:46:45
Reply

Marsh Posté le 23-05-2003 à 15:47:22    

backdafuckup a écrit :


mon but est que la fenetre se minimise dès le démarrage de windows, donc de l'application
En fait il faudrait qu'elle se minimise pendant la fonction mfc 'OnInitDialog'. Mais apparement, ca ne peut pas marcher.
Il me faut donc trouver une solution pour qu'une fonction se lance dès la fin de OnInitDialog


 
OnInitDialog() est appelée pendant le TaFenetre.Create().
 
qq trucs :
 - dans ton OnInitDialog(), est ce que tu appelles le OnInitDialog() de ta classe parent ?
 - quelle est ta valeur de retour de ton OnInitDialog() (c'est important) ?
 - tu fais des trucs apres le .Create() ? (genre des ShowWindow ou autres)
 
pasque bon, cacher la fenetre dès le lancement de l'appli c'est forcement possible...

Reply

Marsh Posté le 23-05-2003 à 15:48:07    

Non je dis juste car il me semble que qqun parlais de mettre du code ds le OnSysCommand, que les messages sont envoyes avant mm que les fenetres soient reelement visible donc de tester si tu devrait mettre du code ds cette fonction avant tt chose que ta fenetre est visible (enfin visible ou pas mais affichee et existante pour pas faire crash)

Reply

Marsh Posté le 23-05-2003 à 15:52:38    

backdafuckup a écrit :

Ceci était implémenté chez moi :
 

Code :
  1. void CPremiereAppliDlg::OnSysCommand(UINT nID, LPARAM lParam)
  2. {
  3.   if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  4. }




 
euh, y a pas un pb sur le nID ? chez moi ca dit ca :
"Specifies the type of system command requested. This parameter can be any one of the following values: ...plein de SC_*** dont le SC_MINIMIZE"
 
donc je vois pas le rapport avec IDM_ABOUTBOX


Message édité par Konar le 23-05-2003 à 15:53:27
Reply

Marsh Posté le 23-05-2003 à 15:53:48    

Non non c bon pour le About, c que les 24 premiers bits correspondent au IDM c une astuces avec la numerotation
 
(enfin c un peu merdique)


Message édité par VisualC++ le 23-05-2003 à 15:54:08
Reply

Marsh Posté le 23-05-2003 à 15:55:38    

Code :
  1. CDialog::OnInitDialog();


Je suppose que ceci est l'appel au oninitdialog du parent..
 
Mon OnInitDialog retourne TRUE (en majuscules, j'insiste.. J'ai essayé de mettre false, sachant que cette valeur était en rapport avec une histoire de focus sur un controle, mais ca n'a rien changé[:spamafote])
 
j'ai pas de .Create() donc je ne sais pas ce que tu entends par la...
 
 
Pour ce qui est de la fonction OnSysCommand, elle a été générée par Visual C++ 6, et ce IDM_ABOUTBOX est pour l'appel (menu système de la fenetre) à la boite de dialogue "a propos", c'est tout...

Reply

Marsh Posté le 23-05-2003 à 15:55:41    

VisualC++ a écrit :

Non non c bon pour le About, c que les 24 premiers bits correspondent au IDM c une astuces avec la numerotation
 
(enfin c un peu merdique)


 
autant pour moi, j'avais pas lu les man jusqu'au bout :
"
In WM_SYSCOMMAND messages, the four low-order bits of the nID parameter are used internally by Windows. When an application tests the value of nID, it must combine the value 0xFFF0 with the nID value by using the bitwise-AND operator to obtain the correct result.
"

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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