2008-11-04 5 views

Répondre

11

La raison pour laquelle cela se produit est que la classe MFC CToolbar utilise une liste d'images interne qui est initialisée à utiliser 16 couleurs seulement. La solution consiste à créer notre propre liste d'images et à indiquer à la barre d'outils de l'utiliser à la place. Je sais que cela fonctionnera pour 256 couleurs, mais je ne l'ai pas testé avec profondeurs de bits plus:

En premier lieu, charger une image bitmap 256 couleurs à partir d'une ressource:

HBITMAP hBitmap = (HBITMAP) ::LoadImage(AfxGetInstanceHandle(), 
    MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_BITMAP, 
    0,0, LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS); 
CBitmap bm; 
bm.Attach(hBitmap); 

Ensuite, créez un liste d'images 256 couleurs et ajouter notre bitmap à elle:

CImageList m_imagelist.Create(20, 20, ILC_COLOR8, 4, 4); 
m_imagelist.Add(&bm, (CBitmap*) NULL); 

Enfin, nous devons dire à la barre d'outils pour utiliser la nouvelle liste d'images:

m_toolbar.GetToolBarCtrl().SetImageList(&m_imagelist); 

Il est également possible que la nouvelle version de MFC dans VS2008 ait résolu ce problème car je sais que de nombreux éléments de l'interface utilisateur ont été mis à jour. Je n'ai pas encore essayé de l'utiliser, donc je ne peux pas en être certain.

+0

Je ne peux pas sembler obtenir ce code de travail. Avec un peu de bricolage j'ai réussi à le faire fonctionner mais j'ai des icônes complètement vides. Des idées? – Konrad

+0

Avez-vous créé une ressource bitmap de taille appropriée dans votre projet et appelée CImageList :: Create avec les paramètres appropriés? –

+0

Oui, j'ai pris une carte de bits de 16 couleurs auparavant et je l'ai convertie en utilisant Visual Studio. Conformément à la création, j'ai suivi vos instructions exactement avec l'exception: CImageList m_imagelist; m_imagelist.Create (20, 20, ILC_COLOR8, 4, 4); ... – Konrad

0

La solution a fonctionné sans défaut, il vous suffit de fixer un peu:

CImageList m_imagelist; 
m_imagelist.Create(20, 20, ILC_COLOR8, 4, 4); 
m_imagelist.Add(&bm, (CBitmap*) NULL); 
Questions connexes