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 :

I.E. souscis dans l'écriture d'une toolbar


Sujet :

MFC

  1. #1
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut I.E. soucis dans l'écriture d'une toolbar
    N'ayant pas eu de réponse dans le forum Développement Windows, je poste ici, si un modo veut supprimer le message dans l'autre forum.

    J'ai développé une barre d'outil pour IE à partir de ce code
    Celà fonctionne bien mais j'ai deux soucis :

    Lorsque je passe la souris sur les boutons de la barre, l'info-bulle n'apparait pas.

    Voilà ce que j'ai mis comme style à la toolbar:
    /*Window styles:*/ WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | WS_TABSTOP |
    /*Toolbar styles:*/ TBSTYLE_TOOLTIPS | TBSTYLE_FLAT | TBSTYLE_TRANSPARENT | TBSTYLE_CUSTOMERASE | TBSTYLE_LIST |
    /*Common Control styles:*/ CCS_TOP | CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_NORESIZE;

    Voilà ce quz j'ai mis en style étendu TBSTYLE_EX_MIXEDBUTTONS | TBSTYLE_EX_DRAWDDARROWS

    Et volà le style de mes boutons : BTNS_BUTTON | BTNS_AUTOSIZE | BTNS_DROPDOWN | BTNS_SHOWTEXT ;

    Qu'est-ce qui ne va pas ?


    D'autre part, le bouton sur la barre des boutons standarts qui permet d'afficher ma barre lorsqu'elle n'est pas affichée (oui, ce n'est pas très clair ), ce bouton disais-je n'a pas de bitmap, je n'arrive pas à lui en attribuer un.
    Comment fait-on ?

    Merci

    PS Je travaille sous WinXP Pro, Visual Studio 2005

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    salut,

    pour les tooltips de ta toolbar, je ne sais pas

    Mais pour l'image dans ton bouton, tout est dans la faq: http://c.developpez.com/faq/vc/?page...awBitmapInCtrl

    Hope it helps.

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Merci, mais le problème est que je ne contrôle rien
    Le bouton est automatiquement créé par IE, moi je me contente de créer la barre avec les contrôles nécessaires.
    Je voudrais mettre une image dans le bouton créé par IE mais je ne sais absolument pas comment y accéder.

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Je m'excuse, je ne comprends pas trop comment fonctionne ton appli . Tu génère du code html? Tu utilises une CHTMLDialog?

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Non, j'ai créé une Dll qui affiche une barre comme celle-ci (Motley Fool)


    Tu vois en haut à droite, dans la barre au-dessus du "Go", un bouton, ce bouton est créé automatiquement par IE, et je n'arrive pas à lui attribuer une image, comme j'ai modifié le projet initial, l'image ne s'affiche plus et je suis incapable de la faire réafficher, j'ai relu deux fois de suite le code, j'ai repris les mêmes caractéristiques pour le bitmap, nada
    Donc si une bonne âme peut me dépanner...

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    En regardant de manière plus approfondie, j'ai trouvé le moyen d'afficher l'icone du fameux bouton, c'était dans le .rgs associé. Ca ne marche qu'à moitié puisque une bonne icône s'affiche sur les deux (celle du roll est incorrecte, mais c'est un début).

    Pour l'info bulle, il faut gérer le tooltip soi-même avec la notification, je pensais que c'était fait automatiquement (j'avais compris comme celà la doc .

    Il ne reste plus qu'à gérer le roll sur les boutons de ma barre.

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Ça avance : je gère maintenant le roll sur les boutons, il suffisait d'inclure le manifest adéquat, celui mis par défaut par Visual Studio n'inclut pas les thème XP. Sauf que je n'ai plus les infos bulles ...
    Donc si quelqu'un sait coment faire ...
    Pour le bouton dans la barre des boutons, je l'ai enlevé de l'installation dans le .rgs comme ça, plus de problèmes...
    To be continued.

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    C'est résolu.
    Pour ceux que ça pourrait intéresser :
    Dans la fonction de création de la Toolbar j'ai mis ce code:
    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
    // Obtention du handle de la fenêtre du Tooltip associé à la Toolbar
    HWND tool_Hwnd = (HWND)::SendMessage(m_hWnd, TB_GETTOOLTIPS, 0, 0);
     
    if (tool_Hwnd != NULL)
    {		
    	TOOLINFO ti;
     
    	// Pour utiliser la structure TOOLINFO, il faut indiquer la taille de la structure,
    	ZeroMemory(&ti, sizeof(ti));
    	ti.cbSize= sizeof(ti);
     
    	// l'ID du bouton associé
    	ti.uId = (UINT_PTR)ID_BUTTON1;
     
    	// et le handle de la fenêtre mère
    	ti.hwnd = m_hWnd;
    	if (::SendMessage(tool_Hwnd, TTM_GETTOOLINFO ,   0,  (LPARAM) (LPTOOLINFO) &ti) == TRUE)
    	{
    		// il suffit juste d'indiquer ici l'information impérissable que vous voulez transmettre.
    		ti.lpszText = _T("Toto Lariflette");
    		::SendMessage(tool_Hwnd, TTM_SETTOOLINFO ,   0,  (LPARAM) (LPTOOLINFO) &ti);
    	}
     
            // autre méthode possible
    	ti.uId = (UINT_PTR)ID_BUTTON2;
    	if (::SendMessage(tool_Hwnd, TTM_GETTOOLINFO ,   0,  (LPARAM) (LPTOOLINFO) &ti) == TRUE)
    	{
    		// On indique ici l'ID du message dans les ressources
    		ti.lpszText = (LPSTR) IDS_STRING1;
                    // et le handle des ressources.
                    ti.hinst = _Module.GetResourceInstance();
    		::SendMessage(tool_Hwnd, TTM_SETTOOLINFO ,   0,  (LPARAM) (LPTOOLINFO) &ti);
    	}
     
    }

  9. #9
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Félicitations!! Et merci d'avoir posté la solution, cela pourrait me servir bientôt
    Et désolé de n'avoir pu t'aider

  10. #10
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Et bien tant mieux que ça puisse servir à quelqu'un

  11. #11
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Finalement, dans ma Toolbar j'ai mis un Combobox au lieu d'un Edit pour pouvoir mémoriser les saisies.
    Après quelques atermoiements et de jolies plantes de IE, voici une façon de procéder :
    Je travaille toujours à partir du source trouvé à cette adresse : http://www.codeproject.com/atl/ietoolbartutorial.asp

    Dans le fichier "EditQuote.h" j'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //	DECLARE_WND_SUPERCLASS(TEXT("EDITQUOTE"), TEXT("EDIT"))
    	DECLARE_WND_SUPERCLASS(TEXT("MYCOMBOBOX"), TEXT("COMBOBOX"))
    (on peut laisser "EDITQUOTE" si on veut)

    J'ai modifié ainsi le gestionnaire de messages :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	BEGIN_MSG_MAP(CEditQuote)
    		COMMAND_CODE_HANDLER(EN_SETFOCUS, OnSetFocus)
    		MESSAGE_HANDLER(WM_LBUTTONDOWN, MessageHandler)
    	END_MSG_MAP()
    Le EN_SETFOCUS est toujours pris en compte, cette fois par le champ Edit du ComboBox.
    le prototype du handler MessageHandler est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    J' ai enfin rajouté en membre privé de la la classe CEditQuote, le Handle du champ de saise, indispensable sinon jolies plantes dans IE lors de lancements d'autres instances de IE par lui-même, et les corrdonnées du bouton de la flèche du Combobox pour repérer les clic gauches dessus.

    Les accesseurs publics sont de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // dans la déclaration de classe CEditQuote 
    inline HWND GetEditBox() {return hWndEdit;};
     
    // dans le EditQuote.cpp
    void CEditQuote::SetEdit(HWND hWnd)
    {
    	hWndEdit = hWnd;
    }
     
     
    void CEditQuote::SetButton(RECT &rct)
    {
    	rcbutton = rct;
    }
    A remarquer que le code OnSetFocus et de TranslateAcceleratorIO ne sont pas modifiés.

    Le code pour gérer le clic sur la fenêtre du ComboBox est celui-ci:
    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
    LRESULT CEditQuote::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
    	DWORD xPos = LOWORD(lParam); 
            DWORD yPos = HIWORD(lParam);
     
            //  le clic est détecté sur toute la toolbar (sauf sur le champ Edit du Combobox), 
    	// il faut donc repérer l'endroit de la flèche du Combobox.
     
    	// a priori on ne fait rien
    	bHandled = FALSE;
    	if (xPos > rcbutton.left && xPos < rcbutton.right && yPos > rcbutton.top && yPos < rcbutton.bottom)
    	{
                    // s'il y a des mots mémorisés dans la liste, on affiche cette liste
    		if (::SendMessage(this->m_hWnd, CB_GETCOUNT, 0, 0) > 0)
    		{
    			::PostMessage(this->m_hWnd, CB_SHOWDROPDOWN, (WPARAM) (BOOL) TRUE, 0); 
                            // et on signale que le clic a été géré.
    			bHandled = TRUE;
    		}
    	}
    	return 0;
    }
    Il faut maintenant créer la ComboBox dans le fichier MFToolbar.cpp.
    Dans la méthode OnCreate j'ai rajouté ces lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	m_ComboWnd.Create(m_hWnd, rect, NULL, 
    	WS_CHILD|WS_VISIBLE | CBS_DROPDOWN | BS_AUTOHSCROLL | WS_TABSTOP | WS_VSCROLL | CBS_OEMCONVERT ,
    	WS_EX_OVERLAPPEDWINDOW | WS_EX_TOPMOST | WS_EX_CONTROLPARENT);
    	{
    		COMBOBOXINFO cbi = {sizeof(COMBOBOXINFO)};
     
    		// mémorisation du handle du champ Edit de la Combobox.
    		if (0 != GetComboBoxInfo(m_ComboWnd, &cbi))
    		{
    			m_ComboWnd.SetEdit(cbi.hwndItem);
    		}
    	}
    	m_ComboWnd.SetFont(static_cast<HFONT>(GetStockObject(DEFAULT_GUI_FONT)));
    Pour obtenir les coordonnées de la flèche du Combobox, j'ai rajouté ces lignes dans OnSize :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	m_ComboWnd.MoveWindow(&wndRect, FALSE);
    	{
    		COMBOBOXINFO cbi = {sizeof(COMBOBOXINFO)};
    		if (0 != GetComboBoxInfo(m_ComboWnd, &cbi))
    			m_ComboWnd.SetButton(cbi.rcButton);
    	}
    Enfin, dans la fonction GetQuote de ce même fichier, pour mémoriser la saisie j'ai rajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // à partir de cet endroit
    if (m_ComboWnd.GetWindowTextLength())
    {
    	BSTR bstrTickers = NULL;
    	TCHAR buff[256];
    	m_ComboWnd.GetWindowText(&bstrTickers);
     
            // on extrait la chaîne de caractères du BSTR
    	ZeroMemory(buff, sizeof(buff));
    	::WideCharToMultiByte (CP_ACP,0,bstrTickers, -1, buff, sizeof(buff) - 1,NULL,NULL);
    	if (::SendMessage(m_ComboWnd.m_hWnd, CB_FINDSTRINGEXACT, (WPARAM) -1, (LPARAM)(LPCSTR) buff) 
                == CB_ERR)
    		::SendMessage(m_ComboWnd.m_hWnd, CB_INSERTSTRING, 0, (LPARAM)(LPCSTR) buff);
    	.........................................
    Pour gérer le focus, j'ai modifié le code de HasFocus dans stockbar.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    STDMETHODIMP CStockBar::HasFocusIO(void)
    {
    	// if any of the windows in our toolbar have focus then return S_OK else S_FALSE.
    	if (m_ReflectWnd.GetToolBar().m_hWnd == ::GetFocus())
    		return S_OK;
    	if (m_ReflectWnd.GetToolBar().GetComboBox().m_hWnd == ::GetFocus())
    		return S_OK;
    	if (m_ReflectWnd.GetToolBar().GetEditBox() == ::GetFocus())
    		return S_OK;
     
    	return S_FALSE;
    }
    Les définitions des méthodes sont dans la définition de classe CMFToolbar dans le fichier CMFTollbar.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	inline CEditQuote& GetComboBox() {return m_ComboWnd;};
    	inline HWND GetEditBox() {return m_ComboWnd.GetEditBox();};
    Comme j'ai eu pas mal de difficultés pour trouver tout ça, j'ai pensé que ça pourrait être utile aux autres.

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

Discussions similaires

  1. Langage pour l'écriture d'une toolbar
    Par Sophie 2015 dans le forum Google Chrome
    Réponses: 3
    Dernier message: 06/06/2015, 17h24
  2. [XL-2003] Aller à la ligne dans l'écriture d'une macro
    Par martinmacfly dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/12/2009, 11h42
  3. Ré-écriture d'une ligne dans la fenetre
    Par Yorel2006 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 24/03/2009, 18h47
  4. problème dans l'écriture d'une formule
    Par jackall dans le forum Macros et VBA Excel
    Réponses: 29
    Dernier message: 19/06/2008, 14h50
  5. Réponses: 17
    Dernier message: 09/03/2007, 18h13

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