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 :

[MFC] CDialog + Icone Systray + Menu


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut [MFC] CDialog + Icone Systray + Menu
    Bonjour tout le monde,

    J'ai remarqué que l'on pouvait mettre une icone dans le systray avec une CMainFrame.
    Je désire faire la même chose avec une CDialog. C'est chose faite. Le code est légèrement différent par rapport à ce qui a été posté dans le post [FAQ Visual C++] Demande de collaboration des membres.

    1)
    Par contre, l'ajout d'un menu ainsi que la création des event handler est différente avec une CDialog. Je ne sais pas comment faire.

    Selon la FAQ, il est suggéré d'utiliser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void CMyDialog::OnMenuReduction()
    {
    	m_nCmdShow = SW_SHOWMINIMIZED;
    	m_pMainWnd->ShowWindow(m_nCmdShow);
    	m_pMainWnd->UpdateWindow();
    }
    Les variables pour la CDialog ne sont pas les bonnes. Ce sont celles d'une CMainframe. Savez vous celles qu'il faut utiliser ?

    2) L'icone reste là après la fermeture de l'application malgré l'ajout d'un OnSysCommand(). Il s'agit bien de ON_WM_SYSCOMMAND() dans MESSAGE_MAP ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bon je vois que personne m'a répondu...
    Avec l'avancée de mes travaux ce qui m'intéresse se situe juste au niveau des fonctions de restauration, d'agrandissement et de réduction d'objets CDialogs. Comme je ne connais toujours pas les variables... La fenêtre de propriétés c'est bien mais je voudrais des contrôles dynamiques, pas limités qu'à l'initialisation.

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut Re: [MFC] CDialog + Icone Systray + Menu
    Citation Envoyé par rockthat
    Bonjour tout le monde,

    J'ai remarqué que l'on pouvait mettre une icone dans le systray avec une CMainFrame.
    Je désire faire la même chose avec une CDialog. C'est chose faite. Le code est légèrement différent par rapport à ce qui a été posté dans le post [FAQ Visual C++] Demande de collaboration des membres.

    1)
    Par contre, l'ajout d'un menu ainsi que la création des event handler est différente avec une CDialog. Je ne sais pas comment faire.

    Selon la FAQ, il est suggéré d'utiliser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void CMyDialog::OnMenuReduction()
    {
    	m_nCmdShow = SW_SHOWMINIMIZED;
    	m_pMainWnd->ShowWindow(m_nCmdShow);
    	m_pMainWnd->UpdateWindow();
    }
    Les variables pour la CDialog ne sont pas les bonnes. Ce sont celles d'une CMainframe. Savez vous celles qu'il faut utiliser ?

    2) L'icone reste là après la fermeture de l'application malgré l'ajout d'un OnSysCommand(). Il s'agit bien de ON_WM_SYSCOMMAND() dans MESSAGE_MAP ?
    salut,
    quelles variables ?
    la mainframe pour une application boite de dialogue c'est ... la dialogue elle meme .
    on peut affirmer la chose suivante dans la dialogue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ASSERT(AfxGetMainWnd()==this);	 // ne provoque pas d'erreur en debug.
    tu peux donc enlever m_pMainWnd.


  4. #4
    Invité
    Invité(e)
    Par défaut
    Je m'en doutais un peu mais ca ne répond pas au but de la question: Comment je fais alors
    D'accord je peux recupérer la Dialog et l'actualiser, mais comment utiliser SW_SHOWMINIMIZED ?
    Car mon problème il est là.

    Merci encore Farscape de m'aider, il en faudrait plusieurs comme toi dans ce forum

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    ben ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void CMyDialog::OnMenuReduction()
    {
       m_nCmdShow = SW_SHOWMINIMIZED;
       ShowWindow(m_nCmdShow);
       UpdateWindow();
    }
    ça devrait fonctionner , non ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    BOOL CMainDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
            //[..]
    }
     
    void CMainDlg::OnMenuR()
    {
       m_nCmdShow = SW_SHOWMINIMIZED;
       ShowWindow(m_nCmdShow);
       UpdateWindow(); 
    }
    c:\..\MainDlg.cpp(170): error C2065: 'm_nCmdShow' : undeclared identifier
    c:\..\MainDlg.cpp(171): error C3861: 'm_nCmdShow': identifier not found, even with argument-dependent lookup

    J'ai du rater quelque chose... ou bien quoi ? La classe CDialog n'a pas ce type de variable, sinon j'aurais pas posé la question

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    ah j'ai pas tout lu lol,
    cette variable fait partie de la classe CWinApp.
    AfxGetApp()->m_nCmdShow

  8. #8
    Invité
    Invité(e)
    Par défaut
    On avance, enfin
    Ca marche !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void CMainDlg::OnMenuR()
    {
       AfxGetApp()->m_nCmdShow = SW_SHOWMINIMIZED;
       ShowWindow(AfxGetApp()->m_nCmdShow);
       UpdateWindow(); 
    }
    sinon tu sais comment enlever l'icone du programme à sa fermeture ? J'ai pris la fonction conseillée mais je crois qu'il manque un ptit quelquechose, surement dans MESSAGE_MAP... (c'est ce que je pense)
    Sinon il faut passer la souris dessus pour que ca s'enlève. (et c pas la première fois que je vois ca avec des programmes).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void CMainDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
       if (nID == SC_CLOSE)
       {
          Shell_NotifyIcon(NIM_DELETE, &TrayIcon);
       }
       CDialog::OnSysCommand(nID, lParam);
    }

  9. #9
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    la structure TrayIcon est correctement remplie ?

  10. #10
    Invité
    Invité(e)
    Par défaut
    copier coller...

    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
     
    BOOL CMainDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
     
    	//[le code d'init, blablabla]
     
    	TrayIcon.cbSize = sizeof (NOTIFYICONDATA);
    	TrayIcon.hWnd = this->m_hWnd;
    	TrayIcon.uID = 1;
    	TrayIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
    	TrayIcon.uCallbackMessage = WM_TRAY_MESSAGE;
    	TrayIcon.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE (IDI_ICON1));
    	strcpy(TrayIcon.szTip, "mon info bulle");
    	Shell_NotifyIcon(NIM_ADD, &TrayIcon);
     
    	return TRUE;
    }

  11. #11
    Invité
    Invité(e)
    Par défaut
    L'icone s'affiche bien et dans MESSAGE_MAP je sais pas si c'est important j'ai mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    BEGIN_MESSAGE_MAP(CMainDlg, CDialog)
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	ON_BN_CLICKED(IDCLOSE, OnBnClickedClose)
    	ON_COMMAND(ID_MENU_FERMETURE, OnMenuFermeture)
    	ON_MESSAGE(WM_TRAY_MESSAGE, OnTrayNotify)
    	ON_COMMAND(ID_MENU_R, OnMenuR)
    	ON_WM_SYSCOMMAND()
    END_MESSAGE_MAP()
    Je pense à un autre truc, la fonction fermeture avec un seul OnCancel() ca suffit ou pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void CMainDlg::OnMenuFermeture()
    {
    	AfxMessageBox("Je ferme");
    	OnCancel();
    }

  12. #12
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    ou EndDialog(IDCANCEL).
    je ne pense pas que le probleme vienne de la .

  13. #13
    Invité
    Invité(e)
    Par défaut
    ben tant pis. C'est déjà pas mal. On va mettre résolu et je vais relire le post où il y a l'astuce.

    Sinon ton tuto c'est vrai c'est de la balle.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MFC] : CDialog resizeable , pas d'icone ;
    Par sivaller dans le forum Windows
    Réponses: 1
    Dernier message: 11/10/2010, 23h47
  2. [MFC] Comment mettre des icones au menu ?
    Par ksoft dans le forum MFC
    Réponses: 1
    Dernier message: 10/05/2006, 09h48
  3. [MFC]Intercepter evenement sur icone systray
    Par 0xYg3n3 dans le forum MFC
    Réponses: 1
    Dernier message: 29/04/2005, 21h53
  4. [MFC][CDialog] interception du focus
    Par r0d dans le forum MFC
    Réponses: 5
    Dernier message: 14/01/2005, 16h00
  5. [MFC] Appli en systray - MAJ du TIP ?
    Par Gothico dans le forum MFC
    Réponses: 2
    Dernier message: 19/11/2003, 22h48

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