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 :

[MFC] parametrage d'une listbox


Sujet :

MFC

  1. #41
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    oui, tout marche bien,
    ca clignote a la selection comme je veux.
    le clignotement lors du defilement: j'ai reussi a le limiter.
    restera plus qu'a optimiser et nettoyer tout le code car a force de tatoner y a des bouts de code de partout.
    puis trouver comment insérer des images dans la list box (un petit indice??)
    je met resolu, et pour l'insertion des images je verrai plus tard.

    encore merci Farscape

  2. #42
    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
    pour les bitmaps ,vu que tu maitrise le dessin de la ligne il suffit de dessiner un bitmap a l'emplacement donné .
    avec les methodes classiques :
    creation d'un dc en memoire compatible.
    selection du bitmap dedans.
    transfert avec CDC::BitBlt dans le DC final.

    un exemple simple tiré de MSDN:
    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
     
    void CBlat2View::OnDraw(CDC* pDC)
    {
      CBlat2Doc* pDoc = GetDocument();
      ASSERT_VALID(pDoc);
     
      // Load IDB_BITMAP1 from the resources.
      CBitmap bmp;
      if (bmp.LoadBitmap(IDB_BITMAP1))
      {
        // Get the size of the bitmap.
        BITMAP bmpInfo;
        bmp.GetBitmap(&bmpInfo);
     
        // Create an in-memory device context compatible with the
        // display device context that is used to paint.
        CDC dcMemory;
        dcMemory.CreateCompatibleDC(pDC);
     
        // Select the bitmap into the in-memory device context.
        CBitmap* pOldBitmap = dcMemory.SelectObject(&bmp);
     
        // Find a center point for the bitmap in the client area.
        CRect rect;
        GetClientRect(&rect);
        int nX = rect.left + (rect.Width() - bmpInfo.bmWidth) / 2;
        int nY = rect.top + (rect.Height() - bmpInfo.bmHeight) / 2;
     
        // Copy the bits from the in-memory device context to the on-
        // screen device context to do the painting. Use the computed center 
        // point for the target offset.
        pDC->BitBlt(nX, nY, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory, 
          0, 0, SRCCOPY);
     
        dcMemory.SelectObject(pOldBitmap);
      }
      else
        TRACE0("ERROR: Where is IDB_BITMAP1?\n");
    }
    il faut juste adapter la partie concernant les coordonnées finales .


  3. #43
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    merci,

    "maitrise" est un bien grand mots pour moi
    mais je devrai y arriver le moment venu.

    ++

  4. #44
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    c'est encore moi... lol

    bon c'est la premiere fois que je manipule les bitmap et pour afficher mes image j'ai complété la fonction DrawItem de ma listBox

    en fonction d'une variable globale j'affiche des images sinon du texte et pour l'instant ca ressemble à ça:
    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
    void CMyListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
    {
    	if(bIHMEnfant)
    	{
    		CDC* pdc;
    		pdc=new CDC();
    		pdc->Attach(lpDrawItemStruct->hDC);
    		// Load BITMAP from the file.
    		CBitmap *bmp;
    		for(int i=1; i<5;i++)
    		{
    			HBITMAP hBitmap = (HBITMAP)LoadImage( 0,TabBitmapName[i][0],IMAGE_BITMAP,0,0,LR_LOADFROMFILE | LR_LOADMAP3DCOLORS|LR_SHARED ); 
    			bmp = CBitmap::FromHandle(hBitmap);
    			// Get the size of the bitmap.
    			BITMAP bmpInfo;
    			bmp->GetBitmap(&bmpInfo);
     
    			// Create an in-memory device context compatible with the
    			// display device context that is used to paint.
    			CDC dcMemory;
    			dcMemory.CreateCompatibleDC(pdc);
     
    			// Select the bitmap into the in-memory device context.
    			CBitmap* pOldBitmap = dcMemory.SelectObject(bmp);
     
    			// Find a center point for the bitmap in the client area.
    			CRect rect;
    			GetClientRect(&rect);
    			int nX = rect.left + (rect.Width() - bmpInfo.bmWidth) / 2;
    			int nY = rect.top + (rect.Height() - bmpInfo.bmHeight) / 2;
     
    			// Copy the bits from the in-memory device context to the on-
    			// screen device context to do the painting. Use the computed center
    			// point for the target offset.
    			pdc->BitBlt(nX, nY, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory,
    			0, 0, SRCCOPY);
     
    			dcMemory.SelectObject(pOldBitmap);
    		}//end for
    	}else	
    	{
    		ASSERT(lpDrawItemStruct->CtlType == ODT_LISTBOX);
     
    		LPCTSTR lpszText=NULL ;
    		CString str;
    		// si le style est different de LBS_HASSTRINGS on considère que la valeur à afficher 
    		//est dans ItemData.
    		if(lpDrawItemStruct->itemID!=CB_ERR && !(GetStyle() & LBS_HASSTRINGS))
    			lpszText=(LPCTSTR) lpDrawItemStruct->itemData;
    		else
    		{
    			// Récupération de la chaîne grâce à l'index stocké dans ItemID.        
    			GetText(lpDrawItemStruct->itemID,str);
    			lpszText= str;
    		}
     
    		ASSERT(lpszText != NULL);
    		CDC dc;
     
    		dc.Attach(lpDrawItemStruct->hDC);
     
    		//si item selectionné
    		if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&
    		  (lpDrawItemStruct->itemState & ODS_SELECTED) )
    		{       
    			if(m_bBlink && m_bFlipFlap)//clignotement?
    			{
    			   dc.SetTextColor(crTextColor);
    			   dc.FillSolidRect(&lpDrawItemStruct->rcItem,crBkColor);
    			}else
    			{
    			  dc.SetTextColor(crBkColor);
    			  dc.FillSolidRect(&lpDrawItemStruct->rcItem, crTextColor);
    			}
    		}
    		else //si item non selectionné
    		{
    			dc.SetTextColor(crTextColor);
    			dc.FillSolidRect(&lpDrawItemStruct->rcItem,crBkColor);
    		}
     
    		// If this item has the focus, draw a red frame around the
    		// item's rect.
    		/*  if ((lpDrawItemStruct->itemAction | ODA_FOCUS) &&
    		  (lpDrawItemStruct->itemState & ODS_FOCUS))
    		{
    		  CBrush br(RGB(255, 0, 0));
    		  dc.FrameRect(&lpDrawItemStruct->rcItem, &br);
    		}*/
     
    		// Draw the text.
    		dc.DrawText(lpszText,
    					strlen(lpszText),
    					&lpDrawItemStruct->rcItem,
    					DT_CENTER|DT_SINGLELINE|DT_VCENTER);
     
    		// Reset the background color and the text color back to their
    		// original values.
    		//dc.SetTextColor(crOldTextColor);
    		//dc.SetBkColor(crOldBkColor);
    		dc.Detach();
    	}//end if(bIHMEnfant)
     
    }
    bon toutes les image s'affiche au centre mais c'est normal j'ai pas encore travaillé sur les coordonnée.

    je voudrai juste savoir si c'est la bonne methode de mettre ca dans le DrawItem ou si je doit le mettre ailleur?

  5. #45
    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
    salut,
    presque ...
    La lecture des bitmaps ne doit être effectuée qu’un seule fois ,
    pour gagner du temps à l’affichage.

    Ils doivent donc être déclarés dans la classe en tant que données membres.

    Note :Le rectangle de dessin pour la ligne c’est lpDrawItemStruct->rcItem

  6. #46
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    merci,
    justement ces deux points je venai de les voir et je commencai tout juste a chercher comment arranger ca.
    je vai modifier ca

  7. #47
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    cool j'ai modifier les deux point précedent.

    ca donne ca:
    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
    void CMyListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
    {
    	if(bIHMEnfant)//si IHM numero 2
    	{
    		CDC* pdc;
    		pdc=new CDC();
    		pdc->Attach(lpDrawItemStruct->hDC);
    		CBitmap *bmp;
    		int nY=0;
    		for(int i=1; i<7;i++)
    		{
    			bmp = CBitmap::FromHandle(m_hBitmap[i][0]);//m_hBitmap est un tableau contenant tout les handles de mes bitmap
    			// Get the size of the bitmap.
    			BITMAP bmpInfo;
    			bmp->GetBitmap(&bmpInfo);
     
    			// Create an in-memory device context compatible with the
    			// display device context that is used to paint.
    			CDC dcMemory;
    			dcMemory.CreateCompatibleDC(pdc);
     
    			// Select the bitmap into the in-memory device context.
    			CBitmap* pOldBitmap = dcMemory.SelectObject(bmp);
     
    			// affichage du bmp à l'emplacement voulu
    			GetClientRect(&(lpDrawItemStruct->rcItem));
    			int nX = lpDrawItemStruct->rcItem.left + bmpInfo.bmWidth;
    			if(i!=1)
    				nY += (bmpInfo.bmHeight)+20;
     
    			// Copy the bits from the in-memory device context to the on-
    			// screen device context to do the painting. Use the computed center
    			// point for the target offset.
    			pdc->BitBlt(nX, nY, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory,
    			0, 0, SRCCOPY);
    			dcMemory.SelectObject(pOldBitmap);
    		}//end for
    	}else	
    	{
    		........//code pour affichage du texte
     
    	}//end if(bIHMEnfant)
     
    }
    tout saffiche bien comme il faut mais j'ai l'impression que les dessin ne font pas partie de la list box. je m'explique:
    quand les dessins sont affichés, il en reste 2 qui sont censés etre affichés mais pas visible dans la list box car il faut descendre pour les voir. seulement pas moyen de descendre... comme si la listbox etait vide!
    avec du texte ca marche, on descend et on affiche bien le texte mais pas avec les dessins

  8. #48
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    ha et au fait personne ne sait comment desactiver certaine fonction de la list box comme:
    -l'appui sur une lettre dirige la selection vers la premiere chaine de caractere qui commence par cette lettre
    -le clic sur une chaine de caractere deplace la selection sur cette derniere

    en gros je voudrai que quand je clic ou quand j'appui sur une touche ca ne fasse rien (sauf le traitement que je défini exemple touche "b": on descend 3 par trois ...)

  9. #49
    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
    salut,
    a priori voir MSDN:
    CListBox::CharToItem
    virtual int CharToItem( UINT nKey, UINT nIndex );


  10. #50
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    rhaaa zut, c'etait parfait comme fonction mais helas ma list box est de style LBS_HASSTRINGS...

    dommage

    mais la je travaille sur un hook (pour l'instant uniquement un hook mouse mais je l'étandrai par la suite au clavier comme ca je bloquerai les evenements correspondant à des touches précises)

    sinon pas d'idée pour mon probleme de defilement d'image qui marche pas?


    (c'est plus une list box que je vais avoir c'est une usine a gaz... )


    edit: je vien de trouver CListBox::VKeyToItem qui devrait marcher, je vais tester

    edit 2: et bien non ca ne marche pas, j'ai surcharger les 2 fonction avec le wizard et il n'y passe jamais en debug...

  11. #51
    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
    alors intercepte wm_keydown directement ..

  12. #52
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    oui c'est ce que je vais faire... mais quand mon hook marchera

  13. #53
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    triste nouvelle....

    le wizard a planté, plus rien ne marche, aucune fenetre naffiche son contenu, plus aucun evenent n'est intercepté... meme en réinplémentant la fonction Ontimer() jamais l'evt du timer n'est déclanché....

    saloperi de wizard faut tout que je refasse de a à z...

    je vai y passer la journée

  14. #54
    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
    quelles fenetres ?
    celle du wizard ? y a une solution dans la faq

  15. #55
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    ben non le wizard je peu m'en servir encore

    par exemple je lui demande d'implémenter WM_ONTIMER et il me crer la fonction OnTimer() mais meme si je fait un settimer il y passe jamais.

    mon appli ne detecte meme plus par defaut les touche enter et escape

    ma listbox ne réagie meme plus a l'appui sur une fleche ou page up page down

    etc etc....

    j'ai l'impression que toutes mes variables se sont emmeler les pinceaux!

  16. #56
    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
    a mon avis ça un rapport avec ton hook ou traitement mis dans pretranslate message ..

  17. #57
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    ben non, le hook il est plus la depuis deja qquelque temps.

    ca a merdé apres avoir utiliser le wizard pour faire du menage dans le code, supprimer les petite fonction de traitement dont je n'avai plus besoin

  18. #58
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    je vous presente le du jour!!!!

    je suis trop stupide, je vien de trouver et tu n'avais pas tor.
    hier en utilisant le classwizard j'ai aussi essayer de desactiver la gestion des touche et du clic dans ma listbox...
    et comme un j'ai changer la toute derniere ligne de pretranslate message...
    en mettant return NULL;

    donc c'est logique, plus d'evenenment du tout!!! plus de timer plus rien!!

    bon j'ai perdu 5-6 heures mais au moins j'ai trouver une solution pour desactiver les evenements souhaités...

    trop mort de rire, j'obtien le boulet d'or là je crois!!


    bon on va pouvoir recentrer le sujet du topic sur mon probleme d'affichage d'image.

    petit rappel:

    j'affiche des images dans ma liste box mais je n'arrive pas a les faire defiler. (cf code plus haut)


  19. #59
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    pour mes images, le principe n'est pas le bon je pense.
    en effet pour du texte: on lui dis addstring dans la classe de ma dialog et ca appele drawtem de ma classe CMylistBox.
    par contre pour des images à la place du texte, on ajoute les images dans Drawitem de CMyListBox donc on dessine toujours les memes items au meme endroit.
    il faudrait lui dir d'ajouter les images dans la classe de ma dialog (comme pour du texte), ainsi drawitem ne s'occupe que de la mise en forme.

    mais je ne vois pas comment faire ca

  20. #60
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    pas d'idée?

    si un modo peu faire le menage dans cette page pour supprimer totu ce qui est en rapport avec le hook et autre plantage

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. Réponses: 16
    Dernier message: 13/07/2007, 17h26
  2. [MFC] clic droit sur une listbox ?
    Par julien.nasser dans le forum MFC
    Réponses: 1
    Dernier message: 07/06/2006, 15h53
  3. [MFC] initialisation d'une Listbox
    Par kitsune dans le forum MFC
    Réponses: 6
    Dernier message: 15/11/2005, 15h26
  4. [MFC] Probleme d'actualisation d'une listbox
    Par Robleplongeur dans le forum MFC
    Réponses: 5
    Dernier message: 13/05/2004, 15h15
  5. [MFC] CPropertySheet dans une CFormView ???
    Par Lofwyr dans le forum MFC
    Réponses: 2
    Dernier message: 30/07/2003, 17h49

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