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 538
    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 538
    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