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 :

Afficher des icones ( bitmap ) dans un CMenu


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Par défaut Afficher des icones ( bitmap ) dans un CMenu
    Bonjour,

    Je travaille actuellement sous Visual C++ 6.0 avec MFC et je recherche un moyen d'avoir des icones en face de mes menus.

    J'ai cherché un peu partout sur le net et j'ai rien trouvé de concluant.

    Soit ils mettent des thèmes XP ou autres alors que moi je ne veux pas avoir de thème, je veux qu'ils s'adaptes automatiquement.
    Soit ils ont des mappage tout bizarre "IMPLEMENT_MENUEX".
    Soit ils sont liés avec les barres d'outils, alors que je ne veux pas jouer avec les barre d'outils.
    Soit encore il ont un nombre impressionnant de classe pour faire fonctionner le tout.

    Ba vous l'avez peut être compris en lisant ce message. Je suis exigeant et surtout très chiant.
    Effectivement, je voudrais juste une simple extension de CMenu qui tienne sur 1 classe qui n'utilise pas de barre d'outils. Et qui puisse etre également utilisé en menu contextuel.

    Si quelqu'un a déjà trouvé le perle rare, je suis preneur.

    Encore désolé d'être aussi pointilleux mais c'est pour mon bien.

    Merci d'avance

  2. #2
    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

  3. #3
    Membre éclairé Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Par défaut
    Ba en fait c'est marrant mais je suis en ce moment même dessus.

    Je pense que ce code me parait vraiment pas mal. Mais le seul soucis sur lequel je suis c'est qu'il me faudrait le menu contextuel.

    Je suis entrain de mettre le Template avec la Vue. ( Oui je sais à la base c'est prévu pour la Frame, mais toutes les méthodes appartiennent au CWnd, donc on peut y croire ).
    Mais là j'ai un problème au link.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BmpMenuView.obj : error LNK2001: unresolved external symbol "public: __thiscall BitmapMenu<class CView>::BitmapMenu<class CView>(void)" (??0?$BitmapMenu@VCView@@@@QAE@XZ)
    BmpMenuView.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall BitmapMenu<class CView>::~BitmapMenu<class CView>(void)" (??1?$BitmapMenu@VCView@@@@UAE@XZ)
    Et je ne sais pas pourquoi j'ai ce message là. Mistère.

    Mais je persiste. Surtout qu'une personne à poser la question sur CodeProject et il n'a eu aucune réponse. Dommage.

    P.S. Le code source n'est plus disponible sur CodeGuru. Par contre il est disponible sur CodeProjet http://www.codeproject.com/menu/bmpmenu.asp

  4. #4
    Membre éclairé Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Par défaut
    A y est c'est bon.

    J'ai fait un truc mais c'est pas très propre. J'ai fait une petite modif dans le code fourni et j'ai créé un Template pour simplifier l'ajout.

    Dans BitmapMenu.h, ajouter :
    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
    public:
     
    	void InitMenuPopup(CMenu *pPopupMenu, UINT nIndex, BOOL bSysMenu) 
    	{ 
    		OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu );
    	};
     
    	void MeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
    	{
    		OnMeasureItem(nIDCtl, lpMeasureItemStruct );
    	};
     
    	void DrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
    	{ 
    		OnDrawItem(nIDCtl, lpDrawItemStruct );
    	};
    Et à la fin de ce même fichier, ajouter ceci :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    template <class T_Wnd, class T_FrameWnd>
    class CTplBitmapMenuWnd : public T_Wnd
    {
    protected:
     
     
     
    	CTplBitmapMenuWnd()
    	: T_Wnd()
    	{
     
    	}
     
    	virtual ~CTplBitmapMenuWnd()
    	{
     
    	}
     
    	afx_msg void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMIS)
    	{
    	   if(lpMIS->CtlType == ODT_MENU)
    		  ((T_FrameWnd *) AfxGetMainWnd( ))->MeasureItem ( nIDCtl, lpMIS );
    	   else
    		  T_Wnd :: OnMeasureItem(nIDCtl, lpMIS);
    	}
     
    	afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDIS)
    	{
    	   if(lpDIS->CtlType == ODT_MENU)
    		 ((T_FrameWnd *) AfxGetMainWnd( ))->DrawItem ( nIDCtl, lpDIS );
    	   else
    		 T_Wnd :: OnDrawItem(nIDCtl, lpDIS);
    	}
     
    	afx_msg void OnInitMenuPopup(CMenu *pPopup, UINT nIndex, BOOL bSysMenu)
    	{
    	   T_Wnd :: OnInitMenuPopup(pPopup, nIndex, bSysMenu);
     
    	   if( !bSysMenu )
    		 ((T_FrameWnd *) AfxGetMainWnd( ))->InitMenuPopup(pPopup, nIndex,bSysMenu );
     
    	}
    };
    Et pour finir, il faut définir la vue ou la CWnd comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    class CBmpMenuView : public CTplBitmapMenuWnd < CView, CMainFrame >
    Par contre, il n'y a aucune modification à faire au moment du TrackMenuPopup.

    Ca fonctionne correctement avec un CView ( affichage des icones, et interception dans uniquement dans le CView ), maintenant il faudrait le confirmer avec une CWnd.

    Par finir si quelqu'un à un problème ou à un moyen plus propre de gérer ça, je suis preneur.

Discussions similaires

  1. afficher des etats ireports dans une appli jsf
    Par ouedmouss dans le forum Documents
    Réponses: 1
    Dernier message: 09/02/2007, 07h05
  2. Comment afficher un fichier bitmap dans un oledependant en code
    Par Jace le programmeur dans le forum IHM
    Réponses: 4
    Dernier message: 08/01/2007, 14h37
  3. Réponses: 10
    Dernier message: 06/07/2006, 21h57
  4. [PHP-JS] afficher des donnée php dans popup javascript
    Par speedylol dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 05/04/2006, 17h05
  5. Réponses: 6
    Dernier message: 22/12/2004, 11h00

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