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 :

bouton et bitmap - a pas tout compris


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2004
    Messages : 25
    Points : 16
    Points
    16
    Par défaut bouton et bitmap - a pas tout compris
    Je viens de lire les différents sujets traitant de l'affichage d'un bitmap sur un CBitmapButton et après avoir adapté les diverses solutions à mon problème, ça me donne un bouton vierge...

    Voilà la fonction qui me permet d'acquérir mon image puis de l'afficher
    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
     
    void OnButton2() {	
                    NomBmp=CheminEnregistrement;
    		NomBmp=CheminEnregistrement+".bmp";
    		m_num.Format("Acquisition en cours");
    		UpdateData(FALSE);
    		_GetImage();
    		m_num.Format("Recherche du centre morphologique...");
    		m_msg.Format("");
                    UpdateData(FALSE);
                    _SearchMorphoCentre();
    		hBitmap = (HBITMAP)::LoadImage(NULL,NomBmp, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
    		if (hBitmap == NULL){
    			m_msg.Format("Erreur de chargement de l'image");
    		}else{		
    		BoutonAvecPict.SetBitmap(hBitmap);
    		m_VisuDoigt.ShowWindow(SW_HIDE);
    		m_start.ShowWindow(SW_HIDE);
    		BoutonAvecPict.ShowWindow(SW_SHOW);
    		}
    }
    Si quelqu'un pouvait me donner un indice sur la raison pour laquelle ça n'affiche rien...

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Points : 35
    Points
    35
    Par défaut
    Voila comment je m'y prends pour afficher un bitmap dans un CButton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    HINSTANCE resource;
    resource = AfxGetResourceHandle();
    RECT tailleBouton;
     
    m_btn.GetClientRect(&tailleBouton);
    m_bmp = (HBITMAP)LoadImage(resource,MAKEINTRESOURCE(IDB_BMP),IMAGE_BITMAP,tailleBouton.right,tailleBouton.bottom,LR_DEFAULTSIZE);
    m_btn.SetBitmap(m_bmp);

    avec m_btn de type CButton et m_bmp de type HBITMAP
    Les Bitmaps ont ete inserées dans les resources du projet (IDB_BMP)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2004
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    ça je sais le faire, mais ce n'est pas possible ici...
    L'image à afficher est créée par la capture (fonction _GetImage() dans le code) et donc puisqu'elle n'existe pas au moment de la création du prog, je ne peut pas l'inclure dans les ressources.

    J'ai bien essayer de le faire avec les classes Picture et CBtPicture comme dans la FAQ mais j'obtiens des erreurs de links...
    J'ai fait pourtant les choses de façon simple:
    1/ J'ai pris le code de la FAQ sur le CBtPicture pour créer le fichier CBtPicture.h
    2/ J'ai créé une appli MFC dialog-based.
    3/ J'ai ensuite ajouté une variable de type CBtPicture pour un des boutons (et j'ai bien sur copié les fichiers Picture.h, Picture.cpp et CBtPicture.h dans le répertoire)
    4/ je compile : paf, erreur de link

    Voici le log obtenu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Compiling...
    essai1Dlg.cpp
    Generating Code...
    Compiling...
    essai1.cpp
    Generating Code...
    Linking...
    essai1Dlg.obj : error LNK2005: "public: __thiscall CBtPicture::CBtPicture(void)" (??0CBtPicture@@QAE@XZ) already defined in essai1.obj
    essai1Dlg.obj : error LNK2005: "public: virtual __thiscall CBtPicture::~CBtPicture(void)" (??1CBtPicture@@UAE@XZ) already defined in essai1.obj
    essai1Dlg.obj : error LNK2005: "protected: static struct AFX_MSGMAP const * __stdcall CBtPicture::GetThisMessageMap(void)" (?GetThisMessageMap@CBtPicture@@KGPBUAFX_MSGMAP@@XZ) already defined in essai1.obj
    essai1Dlg.obj : error LNK2005: "protected: virtual struct AFX_MSGMAP const * __thiscall CBtPicture::GetMessageMap(void)const " (?GetMessageMap@CBtPicture@@MBEPBUAFX_MSGMAP@@XZ) already defined in essai1.obj
    essai1Dlg.obj : error LNK2005: "public: virtual void __thiscall CBtPicture::DrawItem(struct tagDRAWITEMSTRUCT *)" (?DrawItem@CBtPicture@@UAEXPAUtagDRAWITEMSTRUCT@@@Z) already defined in essai1.obj
    Debug/essai1.exe : fatal error LNK1169: one or more multiply defined symbols found
    A l'aide!!!

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    c'est quoi ton chemin pour ton fichier ?

    moi avec loadimage j'ai eu une erreur similaire , pour cette fonction le compilateur fait une diférence entre \ et /. si tu mets \ comme separateur , aucune image s'affiche.

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    tu as du inclure le .h de la classe
    CBtPicture plusieurs fois.
    il faut rajouter dans ce .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #ifndef CBTPICTURE_H 
    #define CBTPICTURE_H 
    #include "Picture.h"
    class CBtPicture : public CButton
    {
    ///....
    };
    #endif //CBTPICTURE_H

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2004
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    Le chemin est sans "/" ni "\" puisque mon prog créé l'image dans le repertoire où il s'éxécute.
    Donc le problème ne vient pas de là...
    D'ailleurs, j'ai mis un test pour détecter le mauvais chargement de l'image. J'aurais été prévnu si c'était ça... Mais merci quand même

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2004
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    Hélas non, Farscape, J'avais déjà pensé à ça et j'avais déja mis en place les #define...

    Je reste perplexe sur la cause de l'erreur...

    pour plus de comprhension, je mets les contenus des différents fichiers:

    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
     
    // essai1Dlg.h : fichier d'en-tête
    //
     
    #pragma once
    #include "afxwin.h"
    #include "CBtPicture.h"
     
     
     
    // boîte de dialogue Cessai1Dlg
    class Cessai1Dlg : public CDialog
    {
    // Construction
    public:
    	Cessai1Dlg(CWnd* pParent = NULL);	// constructeur standard
     
    // Données de boîte de dialogue
    	enum { IDD = IDD_ESSAI1_DIALOG };
     
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);	// Prise en charge DDX/DDV
     
     
    // Implémentation
    protected:
    	HICON m_hIcon;
        //CPicture cp;
    	// Fonctions générées de la table des messages
    	virtual BOOL OnInitDialog();
    	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    	afx_msg void OnPaint();
    	afx_msg HCURSOR OnQueryDragIcon();
    	DECLARE_MESSAGE_MAP()
    public:
    	CBtPicture ppp;
    };
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
     
    // essai1Dlg.cpp : fichier d'implémentation
    //
     
    #include "stdafx.h"
    #include "essai1.h"
    #include "essai1Dlg.h"
     
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
     
     
    // boîte de dialogue CAboutDlg utilisée pour la boîte de dialogue 'À propos de' pour votre application
     
    class CAboutDlg : public CDialog
    {
    public:
    	CAboutDlg();
     
    // Données de boîte de dialogue
    	enum { IDD = IDD_ABOUTBOX };
     
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // Prise en charge DDX/DDV
     
    // Implémentation
    protected:
    	DECLARE_MESSAGE_MAP()
    };
     
    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    }
     
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
     
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    END_MESSAGE_MAP()
     
     
    // boîte de dialogue Cessai1Dlg
     
     
     
    Cessai1Dlg::Cessai1Dlg(CWnd* pParent /*=NULL*/)
    	: CDialog(Cessai1Dlg::IDD, pParent)
    {
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
     
    void Cessai1Dlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
     
    	DDX_Control(pDX, IDC_BUTTON1, ppp);
    }
     
    BEGIN_MESSAGE_MAP(Cessai1Dlg, CDialog)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
     
     
    // gestionnaires de messages pour Cessai1Dlg
     
    BOOL Cessai1Dlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
     
    	// Ajouter l'élément de menu "À propos de..." au menu Système.
     
    	// IDM_ABOUTBOX doit se trouver dans la plage des commandes système.
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
     
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		CString strAboutMenu;
    		strAboutMenu.LoadString(IDS_ABOUTBOX);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
     
    	// 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
     
    	// TODO : ajoutez ici une initialisation supplémentaire
     
    	return TRUE;  // retourne TRUE, sauf si vous avez défini le focus sur un contrôle
    }
     
    void Cessai1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialog::OnSysCommand(nID, lParam);
    	}
    }
     
    // Si vous ajoutez un bouton Réduire à votre boîte de dialogue, vous devez utiliser le code ci-dessous
    //  pour dessiner l'icône. Pour les applications MFC utilisant le modèle Document/Vue,
    //  cela est fait automatiquement par l'infrastructure.
     
    void Cessai1Dlg::OnPaint() 
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // contexte de périphérique pour la peinture
     
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
     
    		// Centrer l'icône dans le rectangle client
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
     
    		// Dessiner l'icône
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialog::OnPaint();
    	}
    }
     
    // Le système appelle cette fonction pour obtenir le curseur à afficher lorsque l'utilisateur fait glisser
    //  la fenêtre réduite.
    HCURSOR Cessai1Dlg::OnQueryDragIcon()
    {
    	return static_cast<HCURSOR>(m_hIcon);
    }
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    #ifndef CBTPICTURE_H 
    #define CBTPICTURE_H 
    #include "Picture.h"
    class CBtPicture : public CButton
    {
    // Construction
    public:
       CBtPicture();
     
        // Attributes
    public:
    CPicture m_Picture;
    CString m_sFilePathName;
     
    // Operations
    public:
        bool LoadImg(CString sFilePathName)
        {
            m_sFilePathName=sFilePathName;
            return (m_Picture.Load(sFilePathName)?true:false);
        }
     
        CString GetPictureName(){return m_sFilePathName;}
    // Overrides
       // ClassWizard generated virtual function overrides
       //{{AFX_VIRTUAL(CBtPicture)
       public:
       virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);  
       //}}AFX_VIRTUAL
     
    // Implementation
    public:
     
       virtual ~CBtPicture();
     
       // Generated message map functions
    protected:
       //{{AFX_MSG(CBtPicture)
          // NOTE - the ClassWizard will add and remove member functions here.
       //}}AFX_MSG
     
       DECLARE_MESSAGE_MAP()
    };
     
     
     
    CBtPicture::CBtPicture()
    {
    }
     
    CBtPicture::~CBtPicture()
    {
    }
     
    BEGIN_MESSAGE_MAP(CBtPicture, CButton)
     
       //{{AFX_MSG_MAP(CBtPicture)
       // NOTE - the ClassWizard will add and remove mapping macros here.
       //}}AFX_MSG_MAP
     
    END_MESSAGE_MAP()
    /////////////////////////////////////////////////////////////////////////////
    // CBtPicture message handlers
     
     
    void CBtPicture::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
       // TODO: Add your code to draw the specified item
       ASSERT(lpDrawItemStruct != NULL);
       CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
       //UINT nState = lpDrawItemStruct->itemState;
       CRect itemRect = lpDrawItemStruct->rcItem;
       if(m_Picture.m_IPicture)   
       {
           // Get Picture Dimentions In Pixels
            m_Picture.UpdateSizeOnDC(pDC); 
            m_Picture.Show(pDC, CPoint(0,0),
                            CPoint(m_Picture.m_Width,
                                   m_Picture.m_Height), 0,0);
            // Change Original Dimentions  
            m_Picture.Show(pDC,itemRect); 
       }
    }
    #endif
    Peut-être que cela aménera une lumiére nouvelle sur le problème

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2004
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    Y'a des fois, je me surprend moi-même par ma bétise...

    J'ai résolu le pb... J'ai mis la partie déclaration de CBtPicture dans le .h de mon prog et la partie implé dans le .cpp de mon prog. et paf, ça a fait des chocapics!

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

Discussions similaires

  1. Liste chainée j'ai pas tout compris
    Par SPACHFR dans le forum Débuter
    Réponses: 4
    Dernier message: 13/03/2009, 16h30
  2. [AJAX] Transmission de variable, j'ai pas tout compris
    Par msg_dracula dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/07/2007, 00h15
  3. Réponses: 1
    Dernier message: 28/03/2007, 19h13
  4. je n ai pas tout compris dans le script
    Par letigre dans le forum Langage
    Réponses: 2
    Dernier message: 19/08/2006, 10h44

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