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] [VC6.0] Comment implémenter un contrôle : combo de case à cocher


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 225
    Par défaut [MFC] [VC6.0] Comment implémenter un contrôle : combo de case à cocher
    Bonjour à toutes et à tous,

    J'ai besoin d'avoir un contrôle personnalisé qui gère des case à cocher comme le fait une combo avec des chaînes de caractères.

    Avant de me mettre cette idée dans la tête, j'ai regardé les classes CComboBox et CComboBoxEx mais elles ne répondent pas à mon besoin. J'ai aussi regardé la classe CListCtrl mais elle ne permet pas de masquer la liste des cases à cocher, à moins que je ne me trompe

    Bref, jmême si je peux obtenir un résultat très approchant avec un contrôle existant, j'aimerai bien implémenter mon propre contrôle (pour l'exercice et pouvoir en faire d'autres par la suite) mais je ne sais pas trop comment commencer, est ce que je dois me servir comme classe de base de CComboBox ou CComboBoxEx ? Ou bien est ce que je dois tout faire en partant d'une CView ?

    Je n'attends pas qu'on me fasse le travail, simplement j'aimerai avoir des conseils sur :
    * la meilleur façon d'implémenter un contrôle personnalisé
    * les problèmes techniques qu'il faut prendre en compte
    * les méthodes qu'il faut systématiquement redéfinir

    D'avance merci pour vos idées.

    Bonne soirée à toutes et à tous.

  2. #2
    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
    Par défaut
    salut,
    donc tu veux faire une combobox avec des cases a cocher, c'est bien ça ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 225
    Par défaut
    Oui, c'est ça, pourquoi, ça existe déjà ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 225
    Par défaut
    Après une analyse un peu plus poussée de la classe CComboBox je vais opté pour la méthode suivante afin d'arriver à faire ce que je veux :
    * dériver la classe CComboBox
    * redéfinir la méthode DrawItem

    La méthode DrawItem peut être redéfini pour les contrôles, du coup je pense que c'est une bonne façon de faire. Par contre c'est sur que faut tout faire soi même.

    J'ajouterai le code au fur et à mesure de mon avancement.

    ++ à tous.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 225
    Par défaut
    Salut !

    J'ai avancé un peu sur le sujet. Redéfinir la Méthode DrawItem est une bonne façon de faire je trouve.

    Par contre j'ai un problème avec la méthode SetItemDataPtr. J'ai procédé de la façon suivante :
    * dans la ressource de la boîte de dialogue, j'ai ajouté une combo
    * j'ai modifié la configuration de la combo en la mettant owner draw et en enlevant has string
    * depuis le classe wizard j'ai ajouté une variable de type combo
    * dans le .h j'ai remplacé CComboBox par CMaComboBox
    * dans le .cpp, dans la méthode InitDialog, j'ai le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for(int i=0; i<5; i++)
    {
    combo_data* p = new combo_data;
    p->text.Format("chaine %d", i);
    m_combo.SetItemDataPtr(i, p);
    }
    La structure combo_data est défini dans un fichier à part de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct combo_data
    {
    CString text;
    };
    Dans ma classe CMaCombo j'ai redéfinie la méthode DrawItem de la façon suivante :
    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
     
    ASSERT(lpDrawItemStruct->CtlType == ODT_COMBOBOX);
       combo_data* p = (combo_data) lpDrawItemStruct->itemData;
       CDC dc;
     
       dc.Attach(lpDrawItemStruct->hDC);
     
       // Save these value to restore them when done drawing.
       COLORREF crOldTextColor = dc.GetTextColor();
       COLORREF crOldBkColor = dc.GetBkColor();
     
       // If this item is selected, set the background color 
       // and the text color to appropriate values. Erase
       // the rect by filling it with the background color.
       if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&
          (lpDrawItemStruct->itemState  & ODS_SELECTED))
       {
          dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
          dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
          dc.FillSolidRect(&lpDrawItemStruct->rcItem, ::GetSysColor(COLOR_HIGHLIGHT));
       }
       else
          dc.FillSolidRect(&lpDrawItemStruct->rcItem, crOldBkColor);
     
       // Draw the text.
       dc.DrawText(
          (LPCTSTR)p->text,
          p->text.GetLength(),
          &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();
    Voila pour la code, mais le problème c'est que j'ai une assertion au lancement de l'application, en fait à l'appel de la méthode DrawText dans la méthode DrawItem.

    Je ne vois pas trop ce que je ne fait pas bien alors si quelqu'un peut m'aider à résoudre le problème ça serait cool.

    ++ et bon week end à tout le monde.

  6. #6
    Membre expérimenté Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Par défaut
    yo mat...

    d'après ce que j'ai vu , il faut que la combobox perso doit réimplémenter les fonctions suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // Derived class is responsible for implementing these handlers
    //   for owner/self draw controls (except for the optional DeleteItem)
    void CComboBox::DrawItem(LPDRAWITEMSTRUCT)
    	{ ASSERT(FALSE); }
    void CComboBox::MeasureItem(LPMEASUREITEMSTRUCT)
    	{ ASSERT(FALSE); }
    int CComboBox::CompareItem(LPCOMPAREITEMSTRUCT)
    	{ ASSERT(FALSE); return 0; }
    void CComboBox::DeleteItem(LPDELETEITEMSTRUCT)
    	{ /* default to nothing */ }

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/03/2008, 11h51
  2. Réponses: 4
    Dernier message: 15/04/2007, 23h30
  3. Réponses: 8
    Dernier message: 17/08/2006, 16h16
  4. Réponses: 2
    Dernier message: 05/05/2006, 16h44
  5. Comment récupérer l'état d'une case à cocher
    Par oursquetaire dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 10/01/2006, 08h58

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