Chargement d'un bitmap, curseur ou icône

Restera à l'afficher après !

 

 

 

Le chargement ou l'affichage d'une image se limitera ici aux BMP ou DIB. Ce sont en effet les seuls formats compréhensibles par Windows. Pour les autres formats, il vous faudra soit développer le code permettant de les convertir en BMP, soit utiliser une librairie (si elle existe).

Nous verrons aussi comment charger une icône ou un curseur, qui sont des images un peu particulières...

On passe par le GDI, ce qui veut donc toujours dire que vous ne connaissez pas et n'accédez pas au périphérique. Par conséquent, ce sera au GDI de se débrouiller. Entre autre, si le périphérique n'est pas capable d'afficher le bitmap dans toutes ses couleurs, le GDI convertira l'image (et donc l'altérera) avec le nombre maximum de couleurs disponibles.

Comme on passe par le GDI, il ne faut surtout pas oublier que les images chargées sont rattachées au GDI. Il ne faut donc pas oublier de les détruires par la fonction DeleteObject() !

Pour charger des images, il y a tout d'abord la fonction:

LoadBitmap:

HBITMAP LoadBitmap(
HINSTANCE hInstance, // handle de l'application
LPCTSTR lpBitmapName // Nom du fichier ou référence à ressource
);

Cette fonction permet de charger une ressource bitmap contenu dans votre exécutable.

Les paramètres sont alors les suivants:

 

hInstance:L'instance du programme exécutable contenant l'image en ressource à charger.

lpBitmapName:Pointeur sur une chaîne de caractères contenant le nom du bitmap ressource à charger ou encore l'identificateur donné lors de la création d'un ressource. On utilisera alors la macro MAKEINTRESOURCE pour convertir l'identificateur comme il faut.

En sortie, la fonction retourne NULL si problème, sinon, un handle de type HBITMAP sur l'image chargée.

LoadBitmap n'est utilisable que pour des affichages à l'écran. Sinon, il faut utiliser LoadImage avec l'option LR_CREATEDIBSECTION pour créer un fichier DIB qui est le seul format utilisable sur tous types de périphériques.

Image non trouvée !Cette fonction peut être utilisée pour afficher les bitmaps systèmes. Il suffit de passer NULL dans hInstance et dans lpBitmapName une des constantes suivantes:

OBM_BTNCORNERS, OBM_OLD_RESTORE, OBM_BTSIZE, OBM_OLD_RGARROW, OBM_CHECK, OBM_OLD_UPARROW, OBM_CHECKBOXES, OBM_OLD_ZOOM, OBM_CLOSE, OBM_REDUCE, OBM_COMBO, OBM_REDUCED, OBM_DNARROW, OBM_RESTORE, OBM_DNARROWD, OBM_RESTORED, OBM_DNARROWI, OBM_RGARROW, OBM_LFARROW, OBM_RGARROWD, OBM_LFARROWD, OBM_RGARROWI, OBM_LFARROWI, OBM_SIZE, OBM_MNARROW, OBM_UPARROW, OBM_OLD_CLOSE, OBM_UPARROWD, OBM_OLD_DNARROW, OBM_UPARROWI, OBM_OLD_LFARROW, OBM_ZOOM, OBM_OLD_REDUCE ou enfin OBM_ZOOMD !

Bitmap commençant par OBM_OLD représente des bitmaps des versions 16 bits de windows.

Pour que soit définies ces constantes, il faut tout d'abord faire #define OEMRESOURCE juste avant #include <windows.h>. En effet, ces constantes sont déclarées dans winuser.h uniquement si OEMRESOURCE est définie.

 

Cliquer ici pour connaître la marche à suivre pour se créer un bitmap ressource sous Windows Visual C++.

 

Les autres fonctions:

LoadIcon:

Pour charger une icône dont la taille correspond aux valeurs SM_CXICON et SM_CYICON (cf. fonction GetSystemMetrics()). Si vous voulez charger des icônes de taille différentes, il faut utiliser LoadImage() (vu un peu plus loin).

HICON LoadIcon(
HINSTANCE hInstance,
LPCTSTR lpIconName
);

C'est 100% identique à LoadBitmap, mais pour une icône...

On peut utiliser des icônes par défaut, il faut alors passer là aussi hInstance à NULL et lpIconName avec:

Valeur  
IDI_APPLICATION Icône par défaut pour les applications
IDI_ASTERISK Voir IDI_INFORMATION
IDI_ERROR Pb...
IDI_EXCLAMATION Voir IDI_WARNING
IDI_HAND idem IDI_ERROR
IDI_INFORMATION Icône information
IDI_QUESTION Icône intérrogation
IDI_WARNING Icône exclamation
IDI_WINLOGO Logo, sous XP, Icône par défaut pour les applications

 

LoadCursor:

Pour un curseur...pareil, cela devient ennuyeux.

HCURSOR LoadCursor(
HINSTANCE hInstance,
LPCTSTR lpCursorName
);

Passons vite fait, il existe là aussi des curseurs par défaut:IDC_APPSTARTING, IDC_ARROW, IDC_CROSS, IDC_HAND, IDC_HELP, IDC_IBEAM, IDC_ICON, IDC_NO, IDC_SIZE, IDC_SIZEALL, IDC_SIZENESW, IDC_SIZENS, IDC_SIZENWSE, IDC_SIZEWE, IDC_UPARROW, IDC_WAIT

Une fonction générique:

Il existe une fonction puissante qui permet de charger une icône, curseur, curseur animé ou bitmap c'est:

LoadImage:

HANDLE LoadImage(
HINSTANCE hinst,
LPCTSTR lpszName,
UINT uType,
int cxDesired,
int cyDesired,
UINT fuLoad
);

Les paramètres sont alors:

hinst Instance du programme qui contient l'image en ressource ou NULL. Si hinst est NULL, alors on veut charger une image de Windows. On utilisera alors la macro MAKEINTRESOURCE avec les constantes préfixées par: OBM_ pour les bitmaps, OIC_ pour les icônes et enfin OCR_ pour les curseurs

lpszName : Nom du fichier image à charger ou référence (dans ce cas ne pas oublier d'utiliser la macro MAKEINTRESOURCE) ou le nom d'une ressource.
Pour charger un fichier, il ne faut pas oublier de positionner fuLoad avec LR_LOADFROMFILE.

uType: Pour indiquer le type d'image à charger. Cette fonction est une fonction à tout faire, mais il faut quand même indiquer quoi faire:

Valeur Désignation
IMAGE_BITMAP Pour charger un bitmap
IMAGE_CURSOR un curseur
IMAGE_ICON ou un icône

cxDesired: largeur de l'image en pixel. Si ce paramètre vaut zéro et que le drapeau LR_DEFAULTSIZE est positionné sur fuLoad, la fonction utilisera les valeurs retournées par SM_CXICON ou SM_CXCURSOR. Si ce paramètre vaut zéro et que le drapeau LR_DEFAULTSIZE n'est pas psoitionné, le système utilisera la largeur actuellement utilisée par l'image.

cyDesired: idem que cxDesired, mais pour la hauteur...

fuLoad: Ce champ peut avoir l'un des drapeaux suivant (que l'on peut combiner grâce au | ...):

Valeur Désignation
LR_DEFAULTCOLOR Image couleur (valeur par défaut).
LR_CREATEDIBSECTION L'image utilise ses propriétés, plutôt que celles du périphérique.
LR_DEFAULTSIZE Utilisation de la taille par défaut pour les icônes ou les curseurs.
LR_LOADFROMFILE Pour indiquer que lpszName contient le nom d'un fichier et non d'une ressource.
LR_LOADTRANSPARENT Cette option va permettre de d'indiquer que l'image est transparente. En fait, Windows récupère la couleur du premier point de l'image et remplace toutes les couleurs dans cette couleur avec la couleur par défaut COLOR_WINDOW. Ne pas utiliser si les couleurs sont codées sur plus de 8bpp.
LR_LOADMAP3DCOLORS Remplacement de couleurs. Ne pas utiliser si les couleurs sont codées sur plus de 8bpp.
LR_MONOCHROME Charger l'image en noir et blanc.
LR_SHARED Cette fonction permet de ne pas recharger plusieurs fois la même image. D'où le partage...


En sortie: Si la fonction retourne 0, c'est qu'il y a une erreur. Sinon, il s'agit du handle de l'image.

 

Structure d'un fichier BMP

Voir le chapitre consacré à ce sujet...

 

Annexes

Complément sur les contextes de périphériques et les bitmaps