wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

Membres en ligne : 0
Invités en ligne : 1
Pub hébergeur
Pourquoi cette pub ?

Valid XHTML 1.0 Transitional

Valid CSS2

Menu Snippets (navigation):
Pages: 1    Accueil » Snippets » Graphique
» [Windows] - Intégrer et utiliser tout type d'image dans les ressources
Détails du snippet : [Windows] - Intégrer et utiliser tout type d'image dans les ressources
Informations sur l'auteur de ce snippet :


Hors ligne
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1368
Snippets: 25
Tutoriels: 6
Introduction / Description :
Bonjour à tous.

Une question fréquente lorsque l'on programme sous Windows : Comment intégrer (et surtout récupérer) une image de type png dans les fichiers ressources (fichiers ".rc") ?

De manière plus générale, voici un petit code qui vous permettra de faire cela avec n'importe quel type d'image dont le type est reconnu par wxWidgets.

Comme les ressources sont une fonctionnalité spécifique à Windows, le code qui va suivre contiendra une majorité d'appels aux fonctions de l'API Windows.
Contenu du snippet :
Tout d'abord, il faut bien entendu ajouter l'image dans le fichier ressource :

Code:

image1 RCDATA "C:\\Chemin\\vers\\le\\fichier.png"
image2 RCDATA "C:\\Chemin\\vers\\le\\fichier.jpg"


Code wxWidgets:

#include <wx/mstream.h>
#include <wx/bitmap.h>
wxBitmap ExtractBitmapFromRessources(const wxString& name)
{
    // Le handle de l'application (nécessaire pour les fonctions d'accès aux ressources)
    HMODULE hApp=GetModuleHandle(NULL);
    // Le handle du bloc d'infos de la ressource concernée
    HRSRC hRes=FindResource(hApp, name.c_str(), RT_RCDATA);
    // Si on ne l'a pas trouvée, on sort en renvoyant un wxBitmap vide
    if (hRes==NULL) return wxNullBitmap;
    // Le handle de la ressource à proprement parler
    HGLOBAL hgRes=LoadResource(hApp, hRes);
    // Si on ne l'a pas trouvé, on sort en renvoyant un wxBitmap vide
    if (hgRes==NULL) return wxNullBitmap;
    // La taille (en octets) des données contenues par cette ressource
    DWORD dwSize=SizeofResource(hApp, hRes);
    // On obtient l'adresse en mémoire où sont placées les données
    char* buff=(char*)LockResource(hgRes);
    if (buff==NULL) return wxNullBitmap;
    // On construit un wxMemoryInputstream à partir de cette adresse
    wxMemoryInputStream mstrm(buff, dwSize);
    // On peut maintenant créer une wxImage à partir du wxMemoryInputStream
    // en laissant wxWidgets déterminer le type d'image automatiquement
    wxImage img(mstrm, wxBITMAP_TYPE_ANY);
    // En cas de problème (format inconnu, ...) on sort en renvoyant un wxBitmap vide
    if (!img.IsOk()) return wxNullBitmap;
    // On peut maintenant renvoyer un wxBitmap créé à partir de l'image
    return wxBitmap(img);
}


Et maintenant, il suffit d'appeler cette fonction avec en paramètre le nom quel 'on a mis dans le fichier ressource, et le tour est joué :

Code wxWidgets:

wxBitmap imagePng=ExtractBitmapFromRessources(_T("image1"));
wxBitmap imageJpg=ExtractBitmapFromRessources(_T("image2"));
Explications finales :
N'oubliez pas que pour utiliser certains types de fichiers graphiques, il faut (par exemple dans la fonction wxApp::OnInit()), appeler wxInitAllImageHandlers().

@+
Xav'
Commentaires
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1368
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Hello.

Juste une petite remarque : pour ceux qui ne sont pas sous Windows, ou simplement qui préfèrent avoir un code "portable" (sous linux, par exemple), il est possible de faire la même chose avec cet utilitaire.

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà...
Menu Snippets (navigation):
Pages: 1    Accueil » Snippets » Graphique
» [Windows] - Intégrer et utiliser tout type d'image dans les ressources