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 :

comment recevoir les evenement BN_CLICKED sur CBitmapButton


Sujet :

MFC

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 21
    Points : 9
    Points
    9
    Par défaut comment recevoir les evenement BN_CLICKED sur CBitmapButton
    Bonjour,



    je suis debutant dans le monde des MFC et j'aurais besoin d'aide svp.



    En effet, je souhaite creer des boutons avec une bitmap dans une form (CFormView) ou dialog (CDialog).



    1) Je cree donc un bouton, auquel j'associe l'identificant IDC_BITMAP_BUTTON_PLAY, le nom m_bitmapPlayButton et le type CBitmapButton.

    2) La fonction OnBnClickedBitmapButtonPlay() est chargée de recevoir les evenements BN_CLICKED.

    3) je fais un loadBitmaps dans la fonction OnInitialUpdate()

    4) je mets ownerdraw à TRUE.



    Le resultat graphique est bon, c'est a dire que les bitmaps sont bien dessinées, par contre je ne recois jamais l'evenement clicked dans la fonction OnBnClickedBitmapButtonPlay() .



    Si je mets ownerDraw a FALSE, alors les bitmaps ne sont pas dessinées mais je recois bien l'evenement.



    Qulequ'un pourrait il m'aider a trouver la solution a ce probleme. Etant debutant, toute aide sera appréciée.



    Merci

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Tu peux regarder du côte du tutoriel de farscape.
    Sinon, peux-tu nous montrer comment tu ajoute la fonction dans la message map.

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 21
    Points : 9
    Points
    9
    Par défaut
    Bonjour 3DArchi,

    merci pour ta reponse. Alors voici comment j'ajoute la fonction dans le message map :

    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
    BEGIN_MESSAGE_MAP(CTVPlayerView, CFormView)
    	ON_WM_LBUTTONUP()
    	ON_WM_KEYUP()
    	ON_WM_MBUTTONUP()
    	ON_BN_CLICKED(IDC_BITMAP_BUTTON_PLAY, &CTVPlayerView::OnBnClickedBitmapButtonPlay)
    END_MESSAGE_MAP()
     
     
    void CTVPlayerView::DoDataExchange(CDataExchange* pDX)
    {
    	DDX_Control(pDX, IDC_BITMAP_BUTTON_PLAY, m_bmpPlayButton);
    	CFormView::DoDataExchange(pDX);
     
    }
     
    void CTVPlayerView::OnInitialUpdate()
    {
    	CFormView::OnInitialUpdate();
     
    	m_bmpPlayButton.LoadBitmaps(IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3,IDB_BITMAP4);
     
    }
     
    void CTVPlayerView::OnBnClickedBitmapButtonPlay()
    {
    	// TODO: Add your control notification handler code here
    }
    Le probleme c'est que je ne passe jamais dans la fonction OnBnClickedBitmapButtonPlay() quand j'appuie sur le bouton. Par contre les bitmaps sont bien dessinées sur le bouton quand je mets ownerdraw à TRUE.

    rq :
    - Ce code est essentiellement auto généré quand j'ajoute le bouton depuis le fichier.rc (avec notamment le nom du bouton, la definition en CBitmapButton, le handler OnBnClickedBitmapButtonPlay, et ownerDraw=TRUE).
    - j'ai rajouté LoadBitmaps à la main, elle permet d'afficher les bitmaps avec succes.
    - si je mets ownerdraw à False, les bitmaps ne sont pas dessinées mais l'evenement clicked est bien recu.

    J'espere que tu pourras m'aider, sinon je vais essayer le tutorial.

    A+

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    m_bmpPlayButton est bien un CBitmapButton, j'imagine.
    Par contre, dans ON_BN_CLICKED, il n'y a pas de &:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ON_BN_CLICKED(IDC_BITMAP_BUTTON_PLAY, OnBnClickedBitmapButtonPlay)
    Erreur de recopie?

  5. #5
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Par contre, dans ON_BN_CLICKED, il n'y a pas de &:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ON_BN_CLICKED(IDC_BITMAP_BUTTON_PLAY, OnBnClickedBitmapButtonPlay)
    Heu... Je ne vois pas d'erreur à cet endroit là, moi.

  6. #6
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 21
    Points : 9
    Points
    9
    Par défaut
    hé non ce n'est pas une faute de recopie, ce code est auto généré. Par contre si je mets le nom de la fonction comme tu le suggeres, le comportement est le meme.

    Je viens d'essayer de creer le CBitmapButton en utilisant CDialog a la place de CFormView, et je viens de voir que l'appui sur le CBitmapButton sort de l'application car on passe dans :

    CDialog::OnOK()

    voici le code compilé du fichier cpp :

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    // TvPlayer2Dlg.cpp : fichier d'implémentation
    //
     
    #include "stdafx.h"
    #include "TvPlayer2.h"
    #include "TvPlayer2Dlg.h"
     
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
     
    // Boîte de dialogue CTvPlayer2Dlg
     
    CTvPlayer2Dlg::CTvPlayer2Dlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CTvPlayer2Dlg::IDD, pParent)
    {
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
     
    void CTvPlayer2Dlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	DDX_Control(pDX, IDC_BITMAP_BUTTON_PLAY, m_BitmapButtonPlay);
    	DDX_Control(pDX, IDC_BITMAP_BUTTON_SETTINGS, m_BitmapButtonSettings);
    }
     
    BEGIN_MESSAGE_MAP(CTvPlayer2Dlg, CDialog)
    	//}}AFX_MSG_MAP
    	ON_BN_CLICKED(IDC_BITMAP_BUTTON_PLAY, OnBnClickedBitmapButtonPlay)
    	ON_BN_CLICKED(IDC_BITMAP_BUTTON_SETTINGS, OnBnClickedBitmapButtonSettings)
    END_MESSAGE_MAP()
     
     
    // Gestionnaires de messages pour CTvPlayer2Dlg
     
    BOOL CTvPlayer2Dlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
     
    	// Définir l'icône de cette boîte de dialogue. L'infrastructure effectue cela automatiquement
    	//  lorsque la fenêtre principale de l'application n'est pas une boîte de dialogue
    	SetIcon(m_hIcon, TRUE);			// Définir une grande icône
    	SetIcon(m_hIcon, FALSE);		// Définir une petite icône
     
    	if (!m_dlgCommandBar.Create(this) ||
    	    !m_dlgCommandBar.InsertMenuBar(IDR_MAINFRAME))
    	{
    		TRACE0("Impossible de créer CommandBar\n");
    		return FALSE;      // échec de la création
    	}
    	// TODO*: ajoutez ici une initialisation supplémentaire
     
    	//m_BitmapButtonPlay.AutoLoad(IDC_BITMAP_BUTTON_PLAY, this);
    	m_BitmapButtonPlay.LoadBitmaps(IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3,IDB_BITMAP4);
    	m_BitmapButtonPlay.SubclassDlgItem(IDC_BITMAP_BUTTON_PLAY, this);
     
    	m_BitmapButtonSettings.LoadBitmaps(IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3,IDB_BITMAP4);
    	m_BitmapButtonSettings.SubclassDlgItem(IDC_BITMAP_BUTTON_SETTINGS, this);
     
    	return TRUE;  // retourne TRUE, sauf si vous avez défini le focus sur un contrôle
    }
     
     
    void CTvPlayer2Dlg::OnBnClickedBitmapButtonPlay()
    {
    	// TODO: Add your control notification handler code here
    }
     
    void CTvPlayer2Dlg::OnBnClickedBitmapButtonSettings()
    {
    	// TODO: Add your control notification handler code here
    }

    Et le code dans le fichier .h :

    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
    // TvPlayer2Dlg.h : fichier d'en-tête
    //
     
    #pragma once
    #include "afxext.h"
     
    // Boîte de dialogue CTvPlayer2Dlg
    class CTvPlayer2Dlg : public CDialog
    {
    // Construction
    public:
    	CTvPlayer2Dlg(CWnd* pParent = NULL);	// constructeur standard
     
     
    // Données de boîte de dialogue
    	enum { IDD = IDD_TVPLAYER2_DIALOG };
     
    protected:  // membres incorporés de la barre de contrôle
    	CCommandBar m_dlgCommandBar;
     
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);	// Prise en charge de DDX/DDV
     
    // Implémentation
    protected:
    	HICON m_hIcon;
     
    	// Fonctions générées de la table des messages
    	virtual BOOL OnInitDialog();
    #if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
    	afx_msg void OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/);
    #endif
    	DECLARE_MESSAGE_MAP()
    public:
    	CBitmapButton m_BitmapButtonPlay;
    	afx_msg void OnBnClickedBitmapButtonPlay();
    	CBitmapButton m_BitmapButtonSettings;
    	afx_msg void OnBnClickedBitmapButtonSettings();
    };
    ici je crée 2 boutons bitmap. La bitmap change quand on change bien quand on change le focus, il ne reste plus qu'a intercepter l'evenement clicked... et la c'est dur.

    Merci pour vos reponses

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par PetitPapaNoël Voir le message
    Heu... Je ne vois pas d'erreur à cet endroit là, moi.
    C'était son code modifié.

    Citation Envoyé par kikekoikan Voir le message
    Je viens d'essayer de creer le CBitmapButton en utilisant CDialog a la place de CFormView, et je viens de voir que l'appui sur le CBitmapButton sort de l'application car on passe dans :

    CDialog::OnOK()
    Je travaille de mémoire là, donc je vais peut être dire une bêtise. Mais en supprimant le bouton IDOK, ton bouton ne serait-il pas devenu tout simplement le bouton par défaut?

  8. #8
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 21
    Points : 9
    Points
    9
    Par défaut
    Je ne pense pas avoir supprimer un quelconque bouton. J'ai juste redefini le CButton en CBitmapButton et mis ownerdraw à TRUE.

    je constate egalement que si j'utilise la fonction :
    m_BitmapButtonPlay.AutoLoad(IDC_BITMAP_BUTTON_PLAY, this);
    elle renvoie 0, ce qui correspond a un echec d'apres la doc.

    par contre la fonction :
    m_BitmapButtonPlay.SubclassDlgItem(IDC_BITMAP_BUTTON_PLAY, this);
    renvoie 1, ce qui correspond a un succes.

    J'ai testé l'appel de ces 2 fonction dans OninitDialog en copiant des samples applications trouvées sur le neT. Malheureusement ca ne marche pas

    Merci 3DArchi pour tes reponses

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    A priori, je dirais que tu devrais faire le subclassDlgItem avant d'autres opérations sur ton bouton.

  10. #10
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 21
    Points : 9
    Points
    9
    Par défaut
    je viens de trouver une solution au probleme en surchargeant la fonction PreTranslateMessage.

    voici le code que 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    BOOL CTvPlayer2Dlg::PreTranslateMessage(MSG* pMsg) 
    {
    	if(pMsg->message == WM_KEYFIRST || pMsg->message == WM_HOTKEY) 
    	{
    		if (pMsg->wParam == 13) //button pressed
    		{
    			if(pMsg->hwnd == m_BitmapButtonFullscreen) 
    			{
    				m_BitmapButtonFullscreen.SendMessage(pMsg->message, pMsg->wParam, pMsg->lParam);
    				return TRUE;
    			}
    			else if (pMsg->hwnd == m_BitmapButtonPlay)
    			{
    				m_BitmapButtonPlay.SendMessage(pMsg->message, pMsg->wParam, pMsg->lParam);
    				return TRUE;
    			}
    			else if (pMsg->hwnd == m_BitmapButtonSettings)
    			{
    				m_BitmapButtonSettings.SendMessage(pMsg->message, pMsg->wParam, pMsg->lParam);
    				return TRUE;
    			}
    		}
    	}
     
    	return CDialog::PreTranslateMessage(pMsg);
    }
    et ca marche trop bien

    Merci pour votre aide et vos interventions en tous cas!

    Bonne journée

  11. #11
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 21
    Points : 9
    Points
    9
    Par défaut
    je rajoute que la valeur 13 dans le code correspond à VK_RETURN.

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

Discussions similaires

  1. Comment différencier les événements sur wxButton ?
    Par Eldered dans le forum wxWidgets
    Réponses: 7
    Dernier message: 24/04/2008, 18h54
  2. Réponses: 7
    Dernier message: 23/08/2007, 10h57
  3. Réponses: 3
    Dernier message: 07/02/2007, 18h39
  4. Réponses: 2
    Dernier message: 03/08/2006, 00h54
  5. Réponses: 2
    Dernier message: 13/07/2006, 10h21

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