IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Insertion d'une icone dans le SystemTray [FAQ]


Sujet :

MFC

  1. #1
    Vow
    Vow est déconnecté
    Membre expérimenté Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    Points : 1 584
    Points
    1 584
    Par défaut Insertion d'une icone dans le SystemTray
    Bonjour,

    J'ai commencé un projet Visual C++ 6 avec utilisation des MFC et je voudrais créer une icone dans le SystemTray.
    Voici ce que j'ai ajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //CMonAppli.h
    ...
    protected :
    	NOTIFYICONDATA IconeT;
    public:
    	CMonAppliApp::~CMonAppliApp()
    	{
    		Shell_NotifyIcon(NIM_DELETE, &IconeT);
    	}
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    //CMonAppli.cpp
    #define MYWM_SYSTRAY (WM_USER+2)
     
    ...
    BOOL CMonAppliApp::InitInstance()
    {
    ...
    	IconeT.cbSize = sizeof(NOTIFYICONDATA);
    	IconeT.uID = IDI_TRAY;
    	IconeT.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
    	IconeT.uCallbackMessage = NULL;
    	IconeT.hIcon = LoadIcon(IDI_TRAY);
    	strcpy(IconeT.szTip, "Bonjour");
    	IconeT.hWnd = dlg;
    	IconeT.uCallbackMessage = MYWM_SYSTRAY;
    	Shell_NotifyIcon(NIM_ADD, &IconeT);
    ...
    IDI_TRAY est l'ID de l'icone dans ma resource.

    J'ai deux questions (dont un problème) :
    * Pourquoi lorsque le pointeur de la souris approche de l'icone du SystemTray, celle-ci disparaît ? Pourtant il me semble que le code est bon. Peut-être faut-il mettre le code dans CMonAppliDlg plutôt que dans CMonAppliApp ?
    * Comment ajouter un menu sur cette icone ?

    Merci d'avance.
    @++

  2. #2
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Tu as plusieurs problèmes dans ton code.

    Le + grave qui fait que l'icone disparait : tu n'as pas initialisé le membre hWnd de la structure. Il doit recevoir le handle de la fenêtre qui va traiter les message de l'icone.

    Ensuite si tu veux que ton icone génère des messages en direction de cette fenêtre, uCallbackMessage doit avoir la valeur d'un message personnalisé (> WM_USER) qui sera envoyé à la fenêtre

    Enfin uID est un identifiant de l'icone dans ton application. il est unique par icone et par application. Donne lui la valeur 1 par exemple. si tu as une deuxieme icone dans l'appli donne lui la valeur 2.


    pour le intercepter les messages de l'icone un exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    // Cette fonction est appelée lors de l'envoie du message uCallbackmessage de l'icone. C'est à toi de déclarer ce message dans BEGIN_MESSAGE_MAP
    LRESULT CSleMissFutDlg::OnSysTrayIconClick(WPARAM wParam, LPARAM lParam)
    {
    	switch (wParam) 
    	{ 
    	case SYSTRAY_QUICK_ID : // ID de notre Icone dans la systray. La valeur de uID
     
    	   switch (lParam)
    	   {
    		  case WM_LBUTTONDBLCLK :	// Message souris à intercepter
    			   ShowWindow(SW_RESTORE);
    			   SetForegroundWindow();
    			   break ;
    	   }
    	   break ;
     
    	default:
    	   ASSERT(false);
    	   break ;
    	}
    	return 0;
    }

  3. #3
    Vow
    Vow est déconnecté
    Membre expérimenté Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    Points : 1 584
    Points
    1 584
    Par défaut
    En fait, j'ai fait une erreur dans mon copier/coller du code. On devrait avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IconeT.uCallbackMessage = MYWM_SYSTRAY;
    Ce qui revient à ce que tu viens de dire.


    Puis je venais de déplacer le code dans CMonAppliDlg.
    Plus exactement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //CMonAppliDlg.h
    ...
    #define MYWM_SYSTRAY (WM_USER + 2)
    	//Permet création d'icône et intéraction avec la souris 
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    //CMonAppliDlg.cpp
    ...
    int CMonAtomicClockDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    	if (CDialog::OnCreate(lpCreateStruct) == -1)
    		return -1;
     
    	IconeT.cbSize = sizeof(NOTIFYICONDATA);
    	IconeT.uID = 2; //IDI_TRAY;
    	IconeT.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
    	IconeT.uCallbackMessage = MYWM_SYSTRAY ;
    	IconeT.hIcon = AfxGetApp()->LoadIcon(IDI_TRAY);
    	strcpy(IconeT.szTip, "test");
    	IconeT.hWnd = m_hWnd;
    	Shell_NotifyIcon(NIM_ADD, &IconeT);
     
    	return 0;
    }
     
     
    void CMonAtomicClockDlg::OnDestroy() 
    {
    	CDialog::OnDestroy();
     
    	Shell_NotifyIcon(NIM_DELETE, &IconeT);
     
    }


    Par contre, je n'ai pas encore trouvé comment référencer MYWM_SYSTRAY avec OnSysTrayIconClick. Je vais chercher...

    Vivement les vacances...

  4. #4
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Dans la macro de ventilation des message dans CMonAppliDlg.cpp ajoute

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON_MESSAGE(MYWM_SYSTRAY, OnSysTrayIconClick)
    La signature de OnSysTrayIconClick

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Avec MFC 7. X VS.NET
    afx_msg LRESULT OnSysTrayIconClick(WPARAM wParam, LPARAM lParam);
    // Avec VC6
    afx_msg void OnSysTrayIconClick(WPARAM wParam, LPARAM lParam);

  5. #5
    Vow
    Vow est déconnecté
    Membre expérimenté Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    Points : 1 584
    Points
    1 584
    Par défaut
    Pas eu le temps de chercher
    Merci en tout cas

    Ma 2eme question était de savoir comment ajouter facilement un menu sur l'icone du SysTray. Faut-il obligatoirement passer par l'événement WM_RBUTTONDOWN (par exemple) ? Ou y a-t-il une option rapide qui lit le SysTrayIcon avec un menu ?

  6. #6
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par Vow
    Faut-il obligatoirement passer par l'événement WM_RBUTTONDOWN (par exemple)
    Obligatoirement, et dans la fonction OnSysTrayClick afficher le menu

  7. #7
    Vow
    Vow est déconnecté
    Membre expérimenté Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    Points : 1 584
    Points
    1 584
    Par défaut
    Merci Monsieur le Modérateur
    @++

  8. #8
    Vow
    Vow est déconnecté
    Membre expérimenté Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    Points : 1 584
    Points
    1 584
    Par défaut
    Arf, j'ai du mal à mettre le menu là où il faut

  9. #9
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par Vow
    Arf, j'ai du mal à mettre le menu là où il faut
    : : :

  10. #10
    Vow
    Vow est déconnecté
    Membre expérimenté Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    Points : 1 584
    Points
    1 584
    Par défaut
    Je veux dire l'afficher là où il faut. Il apparaît en haut de l'écran.

  11. #11
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Déjà il te faut un objet CMenu que tu créé avec CMenu::CreatePopupMenu(), ou plus vraisemblablement tu charge une resource menu que tu aa édité avec CMenu::LoadMenu()

    Puis Il faut utiliser la fonction CMenu::TrackPopupMenu pour l'afficher ou tu désires. Regarde dans MSDN.

    Si tu fais déjà tout ça et que ça ne fonctionne pas, poste ton code

  12. #12
    Vow
    Vow est déconnecté
    Membre expérimenté Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    Points : 1 584
    Points
    1 584
    Par défaut
    Le code se trouve au passage du message WM_RBUTTONDOWN, toujours dans la fonction OnSysTrayIcon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    HMENU       hMenu = NULL, hMenuRes = NULL;
    hMenuRes=LoadMenu((HINSTANCE)GetWindowLong(m_hWnd, GWL_HINSTANCE), MAKEINTRESOURCE(IDR_TRAYMENU));
    if (hMenuRes == NULL)
    	return;
    hMenu = CreatePopupMenu();
    if (hMenu == NULL)
    	return;
    for (int i=0; i<GetMenuItemCount(hMenuRes); i++)
    {
    	TCHAR       szTemp[80];
    	int         id, uFlags;
    	GetMenuString(hMenuRes, i, szTemp, sizeof(szTemp), MF_BYPOSITION);
    	id=GetMenuItemID(hMenuRes, i);          
    	uFlags=(0==id) ? MF_SEPARATOR : MF_STRING | MF_ENABLED;         
    	AppendMenu(hMenu, uFlags, id, szTemp); 
    }
     
    POINT p;
    p.x = LOWORD(lParam);
    p.y = HIWORD(lParam);
    TrackPopupMenu(hMenu, TPM_RIGHTALIGN | TPM_BOTTOMALIGN | TPM_LEFTBUTTON,  p.x, p.y, 0, 0, NULL);
    Entre le TrackPopupMenu et l'initialisation de p.y, j'avais mis ClientToScreen(&p);, mais ça ne change rien.

  13. #13
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Pour x et y, si tu essayes avec ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    xPos = GET_X_LPARAM(lParam); 
    yPos = GET_Y_LPARAM(lParam);

  14. #14
    Vow
    Vow est déconnecté
    Membre expérimenté Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    Points : 1 584
    Points
    1 584
    Par défaut
    C'est exactement pareil.
    Entre parenthèse, j'ai dû définir GET_X_LPARAM et GET_Y_LPARAM...

    Merci pour ton aide en tout cas

  15. #15
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par abelman
    Pour x et y, si tu essayes avec ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    xPos = GET_X_LPARAM(lParam); 
    yPos = GET_Y_LPARAM(lParam);
    C'est une connerie ça oublie. C'est la même chose que tu fais.
    Et puis dans lparam tu n'as que le message WM_RBUTTONDOWN.

    Pour avoir les cordonnées de la souris essaye GetCursorPos

  16. #16
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Up ... Pour avoir les coord de la souris c'est GetCursorPos. (On en apprend tous les jours)

  17. #17
    Vow
    Vow est déconnecté
    Membre expérimenté Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    Points : 1 584
    Points
    1 584
    Par défaut
    Voici le code corrigé de cette partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    case WM_RBUTTONUP :
    	HMENU hMenu = NULL, hMenuRes = NULL;
        hMenuRes=LoadMenu((HINSTANCE)GetWindowLong(m_hWnd, GWL_HINSTANCE), MAKEINTRESOURCE(IDR_TRAYMENU));
    	if (hMenuRes == NULL)
    		return;
    	hMenu = CreatePopupMenu();
    	if (hMenu == NULL)
    		return;
    	for (int i=0; i<GetMenuItemCount(hMenuRes); i++)
    	{
            TCHAR       szTemp[80];
    		int         id, uFlags;
    		GetMenuString(hMenuRes, i, szTemp, sizeof(szTemp), MF_BYPOSITION);
    		id=GetMenuItemID(hMenuRes, i);          
    		uFlags=(0==id) ? MF_SEPARATOR : MF_STRING | MF_ENABLED;         
    		AppendMenu(hMenu, uFlags, id, szTemp); 
    	}
     
    	POINT p;
    	GetCursorPos(&p);
    	TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON,  p.x, p.y, 0, m_hWnd, NULL);
     
    	// Détruire le menu
    	if (IsMenu(hMenu))
    		DestroyMenu(hMenu);
     
    	break;

    Encore merci Grand AbelMan.
    Je crois que ça s'est vu que j'étais assez débutant en MFC, non ?

  18. #18
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par Vow
    Encore merci Grand AbelMan.
    Je crois que ça s'est vu que j'étais assez débutant en MFC, non ?
    Nous sommes tous des débutants quelques part

  19. #19
    Vow
    Vow est déconnecté
    Membre expérimenté Avatar de Vow
    Inscrit en
    Janvier 2003
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 259
    Points : 1 584
    Points
    1 584
    Par défaut
    Encore un grand merci

  20. #20
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 62
    Points : 43
    Points
    43
    Par défaut
    Bonjour

    J'essaie d'utiliser ce code afin de rajouter une icône dans le system tray.
    Mon application n'a pas de fenêtre, le programme fonctionne en mode service, je ne peux donc pas utiliser le

    NOTIFYICONDATA.hWnd, je le mets donc à NULL au départ.

    Du coup j'ai le même problème que le premier poste, lorsque je passe la souris dessus l'icône disparaît.

    Donc est-il possible d'utiliser ce code en mode service ??????

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/05/2006, 23h27
  2. Insertion d'une image dans la une base mysql...
    Par Angeldu74 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 01/06/2005, 14h00
  3. insertion d'une date dans visual foxpro
    Par yvescollet dans le forum Bases de données
    Réponses: 4
    Dernier message: 10/05/2005, 15h39
  4. Ajouter une icone dans la barre des titres (cme emule)
    Par Crisanar dans le forum Windows
    Réponses: 7
    Dernier message: 12/12/2004, 12h08
  5. Afficher une icone dans DBgrid
    Par boyerf dans le forum Bases de données
    Réponses: 4
    Dernier message: 29/02/2004, 15h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo