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] Fusionner deux CImageList


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 3
    Par défaut [MFC] Fusionner deux CImageList
    Bonjour,

    Je galère un poil avec les images.
    Le soucis : l'éditeur de VC++ ne sait pas gérer les bitmaps au dela d'une certaine taille : une bitmap contenant plus de 128 icones de 16 pixels de large.
    Donc dans les ressources j'ai découpé en plusieurs bitmaps.

    Initialement j'avais ce code :

    ----------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      COLORREF crMask = RGB(255,0,255);
     
      CImageList* pList1 = new CImageList();
      pList1->Create(IDB_BITMAP1,16,1,crMask);
     
      CImageList List2;
      List2.Create(IDB_BITMAP2,16,1,crMask);
     
      for(int i=0; i<List2.GetImageCount();i++)
      {
         pList1->Add( List2.ExtractIcon(i) );
      }
    ...
    ----------------
    Cela fonctionne, tous mes icones sont dispos dans mes controles (exemple CTreeCtrl). Mais .... le soucis est que ce code consomme beaucoup d'objets GDI (visible dans le TaskManager) : +2 à chaque transfert d'icones.
    ( Dans mon applis j'ai 500 icones ...en petite taille 16 pix et grande taille 32 pix ) .. on est à l'arrivé à 2 000 objets GDI une fois l'appli démarrée.

    J'aimerai réduire ce nombre d'objets GDI par ce code qui compile (mais ne fonctionne pas).
    ----------------
    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
     
      COLORREF crMask = RGB(255,0,255);
     
      CImageList* pList1 = new CImageList();
      pList1->Create(IDB_BITMAP1,16,1,crMask);
     
      CImageList List2;
      List2.Create(IDB_BITMAP2,16,1,crMask);
     
      int n = pList1->GetImageCount();
      pList1->SetImageCount( n + List2.GetImageCount());
     
      for(int i=0; i<List2.GetImageCount();i++)
      {
        pList1->Copy( n+i, &List2, i );
      }
    ----------------

    Dans mes controles (CTreeCtrl par ex.) , les icones de IDB_BITMAP1 sont visibles .. mais pas ceux copiés depuis IDB_BITMAP2 (l'icone est blanche ou absente de la liste .. je ne sais pas).

    J'ai l'impression que c'est un problème de couleur de fond ou de mask ... mais je galère à trouver. Quelqu'un à une idée ???
    La prochaine fois pense à mettre la balise de code ,Merci Farscape

  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,
    a première vue ça semble correcte.
    que renvoi List2.Create ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 3
    Par défaut
    Le deuxième bout de code compile et s'éxécute proprement : pas de plantage.
    Mais les élements de controles (type CTreeCtrl) faisant référence aux icones provenant du deuxième bitmap n'ont justement pas d'icone de visible : rien ne s'affiche.

    Bref .... j'ai quand même trouvé une parade à mon problème. En reprenant le premier code, je passe par une variable intermédiaire de type HICON.
    Une fois l'icone ajouter à la liste ... j'appel l'API "DestroyIcon" qui me libère les deux objets GDI crée par l'appel à ExtractIcon.
    Au final j'ai ce que je veux ... mais c pas optimal en soit : la création/destruction d'objets GDI n'est pas ce qu'il y de plus rapide. Mais malgrés mes +de 500 icones (en petite et grande taille) ... le temps d'exécution est ridicule.
    Un code similaire au dernier que j'ai posté aurait été la cerise sur le gateau


    Edit :
    List2.Create renvois bien TRUE.
    Désolé pour la balise code ... je ne savais pas. En tout cas bonne idée cette balise .. je n'oublierai pas la prochaine fois

Discussions similaires

  1. FUSIONNER DEUX COLONNES : est ce posible ?
    Par ePoX dans le forum Langage SQL
    Réponses: 5
    Dernier message: 20/12/2005, 20h59
  2. Fusionner deux tables
    Par rdjema dans le forum Langage SQL
    Réponses: 5
    Dernier message: 30/11/2005, 18h42
  3. [Debutant] [JTable] Fusionner deux cellules
    Par devil26 dans le forum Composants
    Réponses: 4
    Dernier message: 03/05/2005, 13h39
  4. [TreeMap] comparer et fusionner deux TreeMap
    Par LoLoSS dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 06/09/2004, 11h49

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