Win32 - mfc - vc6 - place d'une appli : barre des taches ou systray (heure) icone avec menu et action

Soyez le premier à donner votre avis sur cette source.

Vue 12 632 fois - Téléchargée 1 428 fois

Description

Voici une classe qui permet de faire apparaitre simplement votre application dans la systray (à coté de l'heure) et / ou dans la barre des taches (entre l'heure et le bouton démarrer)

Dans la systray, à l'icone est associé une bulle d'aide, des actions et un menu

les actions sont :
au double clic gauche: affichage au premier plan de l'appli
au clic droit : l'apparition du menu

Cette classe permet en outre de réduire l'appli uniquement dans la systray

procédure pour l'utiliser:

1>inclure les fichiers BSystray.cpp & hpp à votre projet
et en particulier dans votre fenetre principale

2> Dans votre fenetre principale
definir un pointeur sur un BSystray
ne l'instancier qu'une fois que la fenetre est effectivement créée (dans le OnInitDialog par exemple)
et ne pas oublier de le détruire dans le destructeur ...

ex:
m_pSysTray=new BSystray (m_hWnd,IDI_TRAY,IDM_MENU_SYSTRAY,m_hIconSystray,_T("Salut !!!"));

parametre :
/// ----- HWND hWnd : fenêtre associée à l'icone
/// ----- const unsigned int uIconID : id de l'icone
/// ----- const unsigned int idMenu : id du menu
/// ----- HICON hIcon : handle sur l'icone pour éviter des effets de bord d'affichage
/// ----- LPCSTR lpToolTip : texte bulle a afficher sur l'icone

3> récupérez et transmettez les évenements WM_B_CREATION_ICONE_SYSTRAY & WM_B_NOTIFICATON_ICONE_SYSTRAY

dans la MessageMap : rajouter
ON_REGISTERED_MESSAGE(WM_B_CREATION_ICONE_SYSTRAY, OnTaskBarCreated)
ON_REGISTERED_MESSAGE(WM_B_NOTIFICATON_ICONE_SYSTRAY, OnNotifyIcon)

4> déclarer et définissez les fonctions associées:
LRESULT CPlaceAppliDlg::OnTaskBarCreated(WPARAM wParam, LPARAM lParam)
{
return (m_pSysTray->OnTaskBarCreated(wParam, lParam) );
}
void CPlaceAppliDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
m_pSysTray->OnNotifyIcon(wParam, lParam);
}

5> c'est fini, appelez m_pSysTray->addIcone()
éventuellement après la construction de m_pSysTray ou à tout autre endroit.

bonus : si vous souhaitez réduire l'appli uniquement dans la systray, il faut modifier une fonction préhexistante de votre classe : OnSysCommand

et la rendre similaire à la suivante:

void CPlaceAppliDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
UpdateData(true);
switch(nID)
{
case SC_MINIMIZE:
if(m_bTraySeul) //condition optionnelement si vous souhaitez laisser les deux modes...
{
//forcer l'affichage de l'icone
if(!m_pSysTray->isPresent())
{
m_pSysTray->addIcone();
m_bTray=true;
UpdateData(false);
}
ShowWindow(SW_HIDE);
break;
}
default:
CDialog::OnSysCommand(nID, lParam);
}
}
}

j'espere que cette classe pourra vous etre utile
et n'hésitez pas à critiquer, proposer, suggérer, améliorer...
Magicalement.
Nono.

Conclusion :


MaJ : intégration du bouton bistable afficher/masquer appli ds "Barre des taches"

grace à un source de BruNews (merci à toi)

1> l'implémentation du bouton bistable "Barre des taches"
permettant d'afficher/masquer l'appli dans la barre des taches. alors qu'elle est affichée.

reste à faire

1> idem pour la section gestionnaire des taches (CTRL ALT SUPPR)
2> idem pour la section Zappage (Alt Tab)

Au Passage, merci à Vic pour l'idée de départ....

et n'hesitez pas à contribuer aux deux developpement cités ci dessus
merci

++

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_Zulark
Messages postés
2
Date d'inscription
lundi 24 novembre 2008
Statut
Membre
Dernière intervention
10 décembre 2008

ok merci. :)
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
Bonjour,

effectivement, depuis visual 2003, le paramètre de sortie de la fonction OnNotifyIcon a été modifié.

il est passé de "void "
à "LRESULT "

il suffit de les remplacer et de simuler un retour dans l'appelant qui devient ainsi :

LRESULT CPlaceAppliDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
/// --------------------------------------------------------------------------------------------
/// ---------------- CPlaceAppliDlg::OnNotifyIcon(WPARAM wParam ,LPARAM lParam) ----------------
/// --------------------------------------------------------------------------------------------
/// ----- Objectif : notification sur l'icone de la systray
/// ----- PreCond : /
/// ----- PostCond : /
/// --------------------------------------------------------------------------------------------
/// ----- WPARAM wParam : param
/// ----- LPARAM lParam : param complémentaire
/// --------------------------------------------------------------------------------------------
m_pSysTray->OnNotifyIcon(wParam, lParam);
return 0;
}

une mise à jour portable sera prochainement publiée ici.

Magicalement
cs_Zulark
Messages postés
2
Date d'inscription
lundi 24 novembre 2008
Statut
Membre
Dernière intervention
10 décembre 2008

Bonjours
j'ai essayer ce code mais il me met l'erreur :
error C2440: 'static_cast' : cannot convert from 'void (__thiscall CSauveMails2Dlg::* )(WPARAM,LPARAM)' to 'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)'

sur la ligne :
ON_REGISTERED_MESSAGE(WM_B_NOTIFICATON_ICONE_SYSTRAY, OnNotifyIcon)

il me la met aussi dans ta source :c
je suis sous visual studio 2005.
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
Bonjour,

Effectivement, je ne la trouve pas non plus dans la version en ligne des msdn.

En fait, dans l'exemple de ce code elle est construite sur l'exemple des OnNotify

CWnd::OnNotify

The framework calls this member function to inform the parent window of a control that an event has occurred in the control or that the control requires some kind of information.

virtual BOOL OnNotify(
WPARAM wParam,
LPARAM lParam,
LRESULT* pResult
);

Dans notre exemple, dans la classe, voici sa description:

/// --------------------------------------------------------------------------------------
/// ---------------- BSystray::OnNotifyIcon(WPARAM wParam ,LPARAM lParam) ----------------
/// --------------------------------------------------------------------------------------
/// ----- Objectif : réponse sur action ou autre sur l'icone
/// ----- PreCond : /
/// ----- PostCond : /
/// ----- Etat : 2 (-1<0<1<2)
/// --------------------------------------------------------------------------------------
/// ----- WPARAM wParam : id de l'icone
/// ----- LPARAM lParam : paramètre complémentaire : action
/// --------------------------------------------------------------------------------------

lParam correspond aux évènements habituels :
WM_LBUTTONCLK
WM_LBUTTONDBLCLK
WM_RBUTTONDOWN
...

Bonne prog :)
unionx
Messages postés
190
Date d'inscription
dimanche 17 avril 2005
Statut
Membre
Dernière intervention
18 mars 2009

bonjour
je veux savoir ou je vais trouver la fonction
::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
j'ai bien chercher dans la partie ClassWizard et events mais je la trouve pas.

merci avance pour l'aide.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.