Membres inscrits :2359
Membres en ligne : 0
Invités en ligne : 5


|
Menu Snippets (navigation): |
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: 1390
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.
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"));
N'oubliez pas que pour utiliser certains types de fichiers graphiques, il faut (par exemple dans la fonction wxApp::OnInit()), appeler wxInitAllImageHandlers().
@+ Xav'
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
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à ... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
|
Menu Snippets (navigation): |
|