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 :

Aide bitmap MFC


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 23
    Par défaut Aide bitmap MFC
    Bonjour à tous

    Situation : Je suis une quiche en visual c++ (c'est juste pour prévenir )

    Besoin : j'ai besoin sur une Dialog d'insérer un bitmap "dynamique".Je travaille avec une MFC(je travaille en visual 6).

    En effet en fonction de certains paramètres, je veux pouvoir changer chaque pixel indépendamment d'une couleur a une autre (noir ou blanc par exemple) et cela de manière dynamique.
    Je me suis penché sur l'objet CBitmap. Est ce a votre avis un choix judicieux?

    Autre souci :
    J'aimerais également créer un bouton dynamiquement. Comment faire??
    Pour le moment mon code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CButton test;
    CRect rect;
     
    test.Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 
       CRect(10,10,100,30), this, 1);
    Cependant comment fait on pour l'afficher SUR LA FENETRE????
    Je pense qu'il faut récupérer un pointeur.. mais étant en manque de connaissance en visual :s... j'ai besoin d'aide (merci d'avance )

  2. #2
    Membre éclairé
    Profil pro
    System Integration Project Manager
    Inscrit en
    Octobre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : System Integration Project Manager
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 219
    Par défaut
    Bonjour

    Citation Envoyé par Xaladra Voir le message
    Bonjour à tous
    En effet en fonction de certains paramètres, je veux pouvoir changer chaque pixel indépendamment d'une couleur a une autre (noir ou blanc par exemple) et cela de manière dynamique.
    Je me suis penché sur l'objet CBitmap. Est ce a votre avis un choix judicieux?
    Pour moi, CBitmap n'est pas le plus adapté pour changer la couleur d'un (ou plusieurs) pixel(s) car il n'y a pas de methode du genre GetPixel(x,y). De plus, CBitmap peut stocker des images de differentes profondeurs (8 bits/16 bits luminance ou couleur/24 bits RGB ou 32 bits RGBA).
    Si tu dois modifier des images et les afficher 'de temps en temps', pourquoi ne pas utiliser des tableaux 2D "fait maison" ?
    Citation Envoyé par Xaladra Voir le message
    Autre souci :
    J'aimerais également créer un bouton dynamiquement. Comment faire??
    Pour le moment mon code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CButton test;
    CRect rect;
     
    test.Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 
       CRect(10,10,100,30), this, 1);
    Cependant comment fait on pour l'afficher SUR LA FENETRE????
    Je pense qu'il faut récupérer un pointeur..
    Pas nécessairement
    Citation Envoyé par Xaladra Voir le message
    mais étant en manque de connaissance en visual :s... j'ai besoin d'aide (merci d'avance )
    recuperer le pointeur de ton objet n'est pas spécifique a MFC, c'est C/C++...

    pour afficher ton bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test.ShowWindow(SH_SHOW);
    . Personnellement j'utilise

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 23
    Par défaut
    Pour moi, CBitmap n'est pas le plus adapté pour changer la couleur d'un (ou plusieurs) pixel(s) car il n'y a pas de methode du genre GetPixel(x,y). De plus, CBitmap peut stocker des images de differentes profondeurs (8 bits/16 bits luminance ou couleur/24 bits RGB ou 32 bits RGBA).
    Si tu dois modifier des images et les afficher 'de temps en temps', pourquoi ne pas utiliser des tableaux 2D "fait maison" ?
    Je suis en train de porter un "moteur graphique" d'une appli embarqué sur windows donc.. j'ai besoin d'un bitmap afin d'y travailler dedans (pixel par pixel).
    As tu une idée de la classe Bitmap que je dois utilisé

    Merci pour le code poru le button, seul hic ca amrche pas :s

    Voila mon code placé dans un boutton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CButton test;
    CRect rect;
    test.Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(10,10,100,30), this, 1);
    test.ShowWindow(true);

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 23
    Par défaut
    Bon pourl bouton tout est oki

    Pour le bitmap, y a t il quelqu'un qui a des idées? je viens de faire un createbitmap, seulement comment l'affiche t'on dans la dialog (pas de méthode showwindows).

    Je précise que le Bitmap en question n'est pas un fichier .bmp, mais plus une zone pour dessiné bit a bit

  5. #5
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut,

    pour le bouton, ça vient du fait que ta variable CButton est local, donc le destructeur est appelé en sortant de la fonction.
    Ta variable doit etre membre de la classe CDialog, donc persistante tant que la boite de dialogue existe

    CBitmap est très bien adapté pour faire ce que tu veux:

    deux façon de faire:

    avec GetPixel() et SetPixel() en sélectionnant ton bitmap dans un Memory Device Context (CDC :: CreateCompatibleDC() )

    ou bien faire une DIB Section, et avoir accès directement au buffer de l'image, peut être mieux dans ton cas
    --> regarde bien la MSDN à la fonction CreateDIBSection()
    puis avec le handle retourné par cette fonction, tu fais un CBitmap::Attach()

    @+

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 23
    Par défaut
    LE hic c'est que mon Bitmap n'est pas un fichier.

    Je voudrais définir une zone de dessin de ma Dialog, ou je pourrait piloter les pixels 1 par 1, en switchant la couleur du blanc au noir.

    Avez vous une idée?

  7. #7
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    Citation Envoyé par Xaladra Voir le message
    LE hic c'est que mon Bitmap n'est pas un fichier.

    Je voudrais définir une zone de dessin de ma Dialog, ou je pourrait piloter les pixels 1 par 1, en switchant la couleur du blanc au noir.

    Avez vous une idée?
    Il vaut mieux utiliser directement les API du GDI alors.
    Je n'ai jamais utiliser CBitmap cette classe ne sert pas à grand chose..
    regarde dans les FAQ.
    Il faut que tu utilises SetDIBBits() regarder dans le MSDN aussi.
    Sinon pour faire simple tu peux utiliser GDI+ mais avec VS2005 et plus.
    Je ne crois pas que tu puisses appeler GDI+ avec VC6

  8. #8
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    LE hic c'est que mon Bitmap n'est pas un fichier.
    je vois pas le rapport avec ma réponse

    je parlais de buffer en mémoire, ou on accède aux pixels avec un simple pointeur, et on lit et écrit ce qu'on veux ...

    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
     
    static const BITMAPINFOHEADER bmih={
      sizeof(BITMAPINFOHEADER),
      320,  // largeur
      240,  // hauteur
      1,
      24,  // pour du 24 bits par pixel
      BI_RGB,
      0,0,0,0,0
    };
     
    BYTE *pBuffer;
     
    CBitmap bitmap;
    bitmap.Attach(CreateDIBSection(NULL,(const BITMAPINFO*)&bmih,DIB_RGB_COLORS,(VOID**)&pBuffer,NULL,0));
     
    // exemple pour écrire un pixel à (x=57,y=45) pour les 3 composants R,G,B
     
    pBuffer[(45*320+57)*3+0]=0xFF;
    pBuffer[(45*320+57)*3+1]=0xFF;
    pBuffer[(45*320+57)*3+2]=0xFF;
    j'ai un doute sur le paramètre HDC, si ça passe étant NULL ou pas. Sinon faudra lui en fournir un. Si la fonction renvoie NULL, essaye avec un HDC valide, celui de l'écran par exemple, ou un Memory DC.

    @+

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 23
    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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    bitmap.Attach(CreateDIBSection((HDC)CApplicationGraphiqueDlg::GetDC(),(const BITMAPINFO*)&bmih,DIB_RGB_COLORS,(VOID**)&pBuffer,NULL,0));
     
    //exemple pour écrire un pixel à (x=57,y=45) pour les 3 composants R,G,B
    pBuffer[(45*320+57)*3+0]=0x00;
    pBuffer[(45*320+57)*3+1]=0x00;
    pBuffer[(45*320+57)*3+2]=0x00;
     
    pBuffer[(46*320+57)*3+0]=0x00;
    pBuffer[(46*320+57)*3+1]=0x00;
    pBuffer[(46*320+57)*3+2]=0x00;
     
    pBuffer[(47*320+57)*3+0]=0x00;
    pBuffer[(47*320+57)*3+1]=0x00;
    pBuffer[(47*320+57)*3+2]=0x00;
     
    pBuffer[(48*320+57)*3+0]=0x00;
    pBuffer[(48*320+57)*3+1]=0x00;
    pBuffer[(48*320+57)*3+2]=0x00;
     
    pBuffer[(49*320+57)*3+0]=0x00;
    pBuffer[(49*320+57)*3+1]=0x00;
    pBuffer[(49*320+57)*3+2]=0x00;
     
    pBuffer[(50*320+57)*3+0]=0x00;
    pBuffer[(50*320+57)*3+1]=0x00;
    pBuffer[(50*320+57)*3+2]=0x00;
     
    pBuffer[(51*320+57)*3+0]=0x00;
    pBuffer[(51*320+57)*3+1]=0x00;
    pBuffer[(51*320+57)*3+2]=0x00;
     
    CString recup;
    recup.Format("error = %d",GetLastError());
    MessageBox(recup);
    Je ne vois rien se faire sur ma fenetre View (tu parlais d'un HDC (je sais meme pas ce que c'est ), j'ai remplacé le null par (HDC)CApplicationGraphiqueDlg::GetDC() => je sais pas si c'est bon dans tout les cas avec NULL ou (HDC)CApplicationGraphiqueDlg::GetDC() ca marche pas, j'ai aucun dessin qui se fait, je devrait cependant avoir une ligne non?

  10. #10
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    ben là tu ne fais que créer le bitmap. il n'y a pas le code pour l'afficher.
    il faut avoir un controle "static" dans ta boite de dialogue, régler le HBITMAP pour ce controle (CStatic :: SetBitmap() ), et faire un Invalidate() sur le controle static à chaque fois que tu modifies le buffer.

    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
     
    BOOL CApplicationGraphiqueDlg::OnInitDialog()
    {
      CDialog::OnInitDialog();
     
      // m_Bitmap est une variable membre de la classe de type CBitmap
      // IDC_BITMAP est un controle statique défini dans la ressource avec le style SS_BITMAP et SS_REALSIZEIMAGE
     
      static const BITMAPINFOHEADER bmih={
        sizeof(BITMAPINFOHEADER),
        320,  // largeur
        240,  // hauteur
        1,
        24,  // pour du 24 bits par pixel
        BI_RGB,
        0,0,0,0,0
      };
     
      BYTE *pBuffer;
     
      if (m_Bitmap.Attach(CreateDIBSection(NULL,(const BITMAPINFO*)&bmih,DIB_RGB_COLORS,(VOID**)&pBuffer,NULL,0)))
      {
        memset(pBuffer,0,320*240*3);    // initialisation du buffer
     
        CStatic *pStatic=(CStatic*)GetDlgItem(IDC_BITMAP);
        pStatic->SetBitmap(m_Bitmap.m_hObject);
      }
      else
        AfxMessageBox(_T("Erreur lors de la création du bitmap"));
     
      return TRUE;
    }
    je ne peux pas t'aider plus ; je te conseille de faire un tour vers des tutos MFC, comme celui dans la FAQ.

    @+

Discussions similaires

  1. Aide multithreading MFC
    Par gpcbitnik38 dans le forum MFC
    Réponses: 0
    Dernier message: 22/10/2014, 14h51
  2. Opencv Rafraichissement bitmap MFC
    Par masteronboard dans le forum MFC
    Réponses: 7
    Dernier message: 17/09/2010, 14h15
  3. Aide pour MFC
    Par tonyhv dans le forum IHM
    Réponses: 6
    Dernier message: 22/03/2010, 18h58
  4. [MFC] bouton bitmap!!
    Par ventreapatte dans le forum MFC
    Réponses: 4
    Dernier message: 29/05/2008, 19h22
  5. Réponses: 2
    Dernier message: 20/01/2004, 14h27

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