CRÉEZ VOTRE PREMIÈRE TRAY ICON . CODE TRÈS SIMPLE ET ACCESSIBLE...

magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011 - 20 mars 2006 à 10:37
cs_kalvados Messages postés 14 Date d'inscription mardi 15 février 2005 Statut Membre Dernière intervention 2 décembre 2008 - 10 juin 2006 à 01:51
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/36629-creez-votre-premiere-tray-icon-code-tres-simple-et-accessible

cs_kalvados Messages postés 14 Date d'inscription mardi 15 février 2005 Statut Membre Dernière intervention 2 décembre 2008
10 juin 2006 à 01:51
Ha oué ben moi je suis bien content de trouver du code Borland, plutôt que de devoir passer un temps fou à décrypter du WC++ surtout que quand je vais chercher des sources sur le net c'est pour comprendre un truc que j'ai pas pigé... alors si en plus il faut deviner ce qui fait partie du code pur et ce qui est spécifique au compilo, bonjour la galère !
Donc tant que je coderais sur Borland, dsl mais je releaserai du Borland, et il y aura toujours des heureux... (y'a qu'à lire les commentaires précédant les tiens...)

PS : Le "W" à la place du V, c'est pas un hasard ;)
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
9 juin 2006 à 21:37
je ne vois pas l'interet de release du borland car il n'est pas accepter par tout les compilateur, contrairement a VC++ ou encore DevC++
@+
cs_neria Messages postés 319 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 16 février 2009
14 mai 2006 à 11:01
Merci ! C'est exactement ce que je cherchais !!
cs_budo Messages postés 5 Date d'inscription mercredi 3 mars 2004 Statut Membre Dernière intervention 7 juillet 2015
27 mars 2006 à 20:58
->olbal
bon je te remerci d'abord pour avoir repris ce que j'ai dit

tu trouveras tout http://wxformbuilder.sourceforge.net/index_en.html#downloads

bref un vrais regale avec la lib wxwidgets
de plus c'est ecrit pour ** bcc ** et vc+= ainsi que devc++

je me suis mis a VC2005 express pour son enviroment ainsi que son debugeur puis je recompile le tous avec devc++ pour voir la portabilitée

@plus
cs_kalvados Messages postés 14 Date d'inscription mardi 15 février 2005 Statut Membre Dernière intervention 2 décembre 2008
27 mars 2006 à 17:29
Oui, bien sur j'ai vérifié le prototype ^^, et j'ai oublié de signaler que j'ai aussi essayé avec le TApplicationEvents et sa fonction OnMessage...
Décidemment j'ai dû faire une bourde quelquepart mais j'ai pas trouvé pour l'instant.
Dans l'immédiat j'ai une lettre de motivation à écrire, ça va me prendre un moment, mais après je me remets sur builder et si je trouve toujours pas je te donnerais le code :)
olbal Messages postés 20 Date d'inscription vendredi 16 mai 2003 Statut Membre Dernière intervention 29 septembre 2006
27 mars 2006 à 16:40
-> kalvados

Perso, j'ai toujours employé les 2 premières méthodes qui m'ont jamais posé de problème.

Si tu fait un squelette de fonction vide ça marche ou pas? Si ça marche c'est le traitement du message qui est à revoir, si ça marche pas, ça doit être le prototype de AppMessage qui doit pas être celui attendu. (mais bon je suppose que tu as déjà vérifier!)
void __fastcall TForm1::FormCreate(TObject *Sender)

{
Application->OnMessage = AppMessage;
}

void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
{
//
}

Autrement, j'ai jamais eu de problème avec la solution 2, et il faut 2s pour la mettre en oeuvre:
Tu poses sur la fiche de ta fenêtre, un objet ApplicationEvents (Onglet supplement)
Tu affiche le concepteur d'objet pour ce nouvel objet posé
Tu double clic sur OnMessage de l'onglet Evénements pour te creer la fonction et tu copies le code de traitement de ton message.

Si ça marche toujours pas, tu peux publier le code provisoire pour que je le regarde
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
27 mars 2006 à 16:10
Olbal> j'utilise dans le contexte des études VS et continue à l'utiliser dans le monde du travail
après, tout dépend des besoins...

et sinon,
je suis tout comme la majorité ici pour un 0 error 0 warning (d'ou la non utilisationdes STL avec VS6)
et actuellement, nous étudions la possibilité d'utilisation d'une librairie graphique portable (wxWidget)
mais toujours en utilisant VS8 (on a les licences & c'est un bon produit quoi qu'il en soit)

@ te relire
++
B
cs_kalvados Messages postés 14 Date d'inscription mardi 15 février 2005 Statut Membre Dernière intervention 2 décembre 2008
27 mars 2006 à 14:11
Tiens Olbal, puisque tu es dans le coin...
Avec la troisième solution que tu m'as proposée, j'ai l'impression de me rapprocher du but : Après kill et reboot de explorer, j'ai un message d'erreur 1400, Handle de fenetre invalide... et bien sur mon icône ne revient pas mais là je sais pas où ça coince...

Bien entendu, dans mon code j'ai remplacé "const WM_FILEREADY WM_USER + 2000;" par "const WM_TASKBAR_CREATED RegisterWindowMessage("TaskbarCreated")"

Mais j'ai l'impression que ça plante avant même l'entrée dans la fonction de traitement du message, et je sais aussi que cette même fonction est bien appelée par Application->OnMessage puisque j'ai mis un MessageBox dans la fonction et qu'en une seconde mon écran était couvert de MessageBox :P

J'ai fait d'autres essais mais rien ne marche jusqu'à présent, pourtant mon code ne me semble pas différent de tous ceux que j'ai pu trouver sur le net.

Si tu as une idée, elle sera la bienvenue :)
olbal Messages postés 20 Date d'inscription vendredi 16 mai 2003 Statut Membre Dernière intervention 29 septembre 2006
27 mars 2006 à 13:08
->Budo

Je connais pas l'outil que tu cite mais pour un developpement multi plateforme le suis d'accord avec toi.

A propos des Warning, je suis doublement d'accord.

Pour ce qui est de la compacité, faut voir si c'est neccessaire et dans quelle proportion cela va jouer.

Maintenant effectivement, les compilateurs C++ doivent se valoir plus ou moins. Par contre je pense qu'il faut bien choisir son environnement en fonction du domaine dans lequel on travaille. Par ex, les utilisateurs de mes logiciels imposent Windows, donc je vais choisir des outils parmis les plus productifs pour ce SE. Mais il faut aussi tenir compte du contexte d'utilisation. Par ex pour une appli devant tourner sur un système embarqué avec peu de mémoire sous windows, faut certainement pas utiliser C++ Builder et la VCL. VC++ et les MFC bien utilisés doneront, certes avec bien plus d'effort, (mais le contexte l'oblige) un bien meilleur resultat du point de vue occupation mémoire et temps de réponse avec un processeur lent.

J'ai écrit que C++Builder était certainement plus productif dans bien des cas que VC++, pour relever la cote de ce bon environnement sur ce site car j'ai trouvé beaucoup de critiques négatives à son propos faite par des utilisateurs de VC++ qu n'en connaisait visiblement que le nom.
cs_budo Messages postés 5 Date d'inscription mercredi 3 mars 2004 Statut Membre Dernière intervention 7 juillet 2015
27 mars 2006 à 08:58
utiliser C++ BUILDER OU DEVC++ OU VC+++ peut importe mais utiliser une interface avec WXFORMBUILDER qui genere du code tres simple, wxwidgets biblihotèque qui fonctionne sur toutes les plateformes et tres épurée. L'importance du compilateur est qu'il doit pas laisser de probleme en suspend (warning ect...) et rester compact.
donc le plus important est que le source doit fonctionner sous toutes les plateformes sans retouche.

@bientôt de te lire.
olbal Messages postés 20 Date d'inscription vendredi 16 mai 2003 Statut Membre Dernière intervention 29 septembre 2006
23 mars 2006 à 18:27
->Magic_Nono

Les 3 méthodes que j'ai décrites sont des méthodes que j'ai utilisé en c++ builder.
Les MFC, je l'ai au utilisées pendant un peu plus d'un an et je n'ai eu aucun regret à les laisser tomber car le problème c'est que VC++ n'a rien de "visual" donc on perd un temps fou à creer à chaque fois des fonctions qui gère l'interface utilisateur si on veut faire une interface au look moderne. Sous Builder tu mixes comme tu veux les avantages de la conception "visuelle" et la liberté/rapidité du C/C++. Quand tu es étudiant, VC++ est idéal pour apprendre la prog sous windows puisqu'il faut écrire beaucoup donc étudier plein de fonctionnalité de Windows, par contre quand tu dois être rentable pour ton patron, il faut chercher à optimiser le temps d'écriture!
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
23 mars 2006 à 17:16
la 3e méthode est en effet en utilisant les mfc...
cs_kalvados Messages postés 14 Date d'inscription mardi 15 février 2005 Statut Membre Dernière intervention 2 décembre 2008
22 mars 2006 à 19:19
Haaa là je crois que je commence à comprendre... enfin la 3e méthode en tout cas... je vais faire avec celle-là. Pour le reste je m'y pencherais une autre fois.
Quand au "Sleep", je sais effectivement que ça stoppe tout le process donc je ne l'utilise généralement pas : là j'ai fait un truc vite fait dont le seul but était de tester la création et l'utilisation du systray...
Par contre je vais noter ta méthode (assez ingénieux)

Merci pour tout :)
olbal Messages postés 20 Date d'inscription vendredi 16 mai 2003 Statut Membre Dernière intervention 29 septembre 2006
22 mars 2006 à 14:12
Pour intercepter un message dans le no est connu qu'à l'éxécution, il faut surcharger la fonction virtuelle WndProc de la fenêtre.

Si noMessTaskbar_created contient le no du message désiré:

void __fastcall TForm1::WndProc(TMessage& Message)

{
if (Message.Msg==noMessTaskbar)
{
traitement
}
else
TForm::WndProc(Message);
}

Cela marchera si le message est considéré par la VCL comme étant un message fenêtre. Si la VCL que c'est un message application alors tu peux l'intercepter tout de même dans ta fenêtre en posant un objet TApplicationEvents:

void __fastcall TFenApp::AppEventsMessage(tagMSG &Message,
bool &Handled)
{
if (Message.Msg==noMessTaskbar)
{
traitement
Handled = true;
}
else
Handled = false;
}


Ou tu change l'adresse du gestionnaire OnMessage de l'objet Application:
Exemple de l'aide:
const WM_FILEREADY = WM_USER + 2000;
void __fastcall TForm1::FormCreate(TObject *Sender)

{
Application->OnMessage = AppMessage;
}

void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
{
if (Msg.message == WM_FILEREADY)
{
Memo1->Lines->LoadFromFile(AnsiString((char *)Msg.lParam));
Handled = true;
}
/* pour tous les autres messages, Handled conserve la valeur False pour que les autres gestionnaires de messages puissent répondre */
}


A propos de
Form1->Hide();
Sleep(1000);
Form1->Show();
Quand tu veux marquer une pause pour voir ce qui se passe, Sleep ne convient pas forcément car pendant ce temps la l'application est complétement bloquée, et donc elle ne répond pas a des messages externes.

Je préfère utiliser une autre méthode. Par exemple

DWORD AncTickCount = GetTickCount();
while (GetTickCount()-AncTickCount<1000u)
Application->ProcessMessages();
cs_kalvados Messages postés 14 Date d'inscription mardi 15 février 2005 Statut Membre Dernière intervention 2 décembre 2008
22 mars 2006 à 12:45
Désolé... d'une part je découvre tout juste les message_map et l'interception des message windows, et d'autre part ça marche pour le callback_message donc j'ai pensé qu'il suffisait de faire pareil pour taskbar_created...
Tant pis, me reste plus qu'à retourner fouiller le net pour trouver le fonctionnement de maudit truc...
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 mars 2006 à 12:38
Je te l'ai déjà dit deux fois ....
la valeur du message n'est pas connue à le compilation !

#define AM_TASKBAR_CREATED WM_APP + 409

c'est faux...
cs_kalvados Messages postés 14 Date d'inscription mardi 15 février 2005 Statut Membre Dernière intervention 2 décembre 2008
22 mars 2006 à 12:26
J'ai rajouté ça dans mon .h :
//------------------------------------
#define AM_TASKBAR_CREATED WM_APP + 409
void __fastcall TaskbarCreated ( TMessage &message );
VCL_MESSAGE_HANDLER(AM_TASKBAR_CREATED, TMessage, TaskbarCreated);
//------------------------------------

et ça dans mon .cpp
//------------------------------------
void __fastcall TForm1::TaskbarCreated ( TMessage &message )
{
Shell_NotifyIcon(NIM_ADD,&NI_Data);
}
//------------------------------------

Ca compile, ok, mais... j'ai testé en killant et recréant explorer dans le gestionnaire de tâches et l'icône est pas revenue, donc ça doit pas être bon.
Qu'est-ce que t'en penses, est-ce que tu vois ce qui ne vas pas ?
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 mars 2006 à 17:56
j'ai juste copier-coller ^^

ca n'ira pas, avec ce message... les macros ne vont pas aimer : la valeur du message n'est connue qu'a l'execution, et pas a la compilation
cs_kalvados Messages postés 14 Date d'inscription mardi 15 février 2005 Statut Membre Dernière intervention 2 décembre 2008
21 mars 2006 à 17:54
Tu veux dire : VCL_MESSAGE_HANDLER( TaskbarCreated, TMessage, OnTaskbarCreated); plutot non ??
Parce que si j'ai bien compris le AM_CALLBACK_MESSAGE est dédié à recevoir les interactions de la souris sur l'icône...
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 mars 2006 à 17:44
je pense qu'il te faut ajouter un

VCL_MESSAGE_HANDLER( AM_CALLBACK_MESSAGE, TMessage, NotifyCallback);

avec ce message là... seul pbm, on n'a la valeur du message qu'a l'execution...
n0ne Messages postés 24 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 23 mars 2006
21 mars 2006 à 17:39
Pas mal, pas mal :). Code propre, simple, efficace. Que demander de plus.
cs_kalvados Messages postés 14 Date d'inscription mardi 15 février 2005 Statut Membre Dernière intervention 2 décembre 2008
21 mars 2006 à 17:35
Ravi que ça vous aide :D

@ Renfield : Bon ben finalement il semble que je me sois un peu trop avancé...
J'ai bien compris le principe mais je ne sais pas ce qu'est la "boucle de message principale".
Pourrais-tu m'expliquer ça plus en détail ici ou par mail (kalvados30@hotmail.fr) ??
Et dès que j'aurai mis ça en oeuvre je mettrais à jour ma source...
Utilisateur anonyme
21 mars 2006 à 17:19
Je te remercie,
il est vrai que pour le builder on a pas des sources à gogo ;)

ça ma pas mal aidé

++
cs_kalvados Messages postés 14 Date d'inscription mardi 15 février 2005 Statut Membre Dernière intervention 2 décembre 2008
20 mars 2006 à 16:15
Ok merci, ça devrait aller avec ça :)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 mars 2006 à 16:13
tu fait un RegisterWindowMessage de "TaskbarCreated"
ca va te retourner un numéro de message (disons 'a')

il te suffit ensuite, juste d'attendre le message 'a' dans ta boucle de message principale...
quand il surviens, réinstalle ton icône
cs_kalvados Messages postés 14 Date d'inscription mardi 15 février 2005 Statut Membre Dernière intervention 2 décembre 2008
20 mars 2006 à 15:29
Oui en effet c'est pour Borland (je suis sur C++ Builder 6) et c'est pas plus mal parce que sur le net j'ai trouvé beaucoup de sources pour Visual C++ et peu pour Borland...
@Renfield : Oui j'ai vaguement vu ça sur un forum en anglais mais le mec était vraiment pas précis dans ses explications donc peut-être que tu pourrais m'expliquer, ça m'interesse :)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 mars 2006 à 11:53
pensez a recréer vos icones, en cas de crash de Explorer...

(event "TaskbarCreated")
cs_norton Messages postés 215 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 21 août 2011
20 mars 2006 à 11:35
Hello, bravo pour cette source simple d'utilisation elle m'a beaucoup aidé.
Merci
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
20 mars 2006 à 11:31
précision : le code publié ici est pour BORLAND uniquement !!!

TForm....
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
20 mars 2006 à 10:37
:)
amusant, c'est quasi la meme logique que dans ce source...un peu plus complet :

http://www.cppfrance.com/codes/WIN32-MFC-VC6-PLACE-APPLI-BARRE-TACHES-OU_29682.aspx

d'ailleur, ça serai sympa de le compléter,
ça doit pas etre trop dur, je vais voir ça...

++
amateur de cachecache
Nono.
Rejoignez-nous