2009-10-07 7 views
6

J'utilise Visual Studio 2008, j'ai le fichier PNG chargé dans la vue des ressources, lui assigné IDB_BANG_PNG.Définition par programme d'un fichier PNG dans un contrôle d'image dans les API Win32

Le contrôle d'image est appelé IDC_STATIC15.

J'ai des problèmes pour charger le PNG dans le contrôle d'image.

LRESULT CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 

// Way of loading a bmp with a mask perhaps? Or a PNG file programatically? 

static HBRUSH hBrushStatic; 
HBITMAP hBmp = LoadBitmap(hDlg,MAKEINTRESOURCE(IDB_BANG_PNG)); 

switch(message) 
{ 
case WM_INITDIALOG:  
    CheckDlgButton(hDlg, IDC_CHECK, FALSE); 
    EnableWindow(GetDlgItem(hDlg, IDOK), FALSE); 
    // Bitmap version is IDB_BANG, PNG is at IDB_BANG_PNG 
    // IDC_STATIC15 is the picture frame 
    HWND item = GetDlgItem(hDlg,IDC_STATIC15); 
    SendMessage(item,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hBmp); 
    return TRUE; 

// .... snip 

Je suis assez naïf en matière de développement Win32/GUI, faire un projet rapide et son resté coincé, toute aide est appréciée.

+0

Vous avez besoin d'un fichier bitmap. Vous voulez convertir l'image PNG en image BMP. – anno

+0

J'ai lu que vous pouvez supporter le format PNG mais vous devez le faire par programmation. Lorsque j'ajoute des images, en utilisant le filtre d'image hte, * .png est l'un des éléments listés. –

+0

Problème, j'aime maintenir l'arrière-plan transparent, d'où la raison pour laquelle je veux utiliser le format PNG. Sauf, je peux créer un masque en utilisant BMP, ou permettre au fichier ICO d'utiliser l'icône de plus grande taille plutôt que 32x32. –

Répondre

0

Personnellement, j'utilise la classe CPictureEx. Je pense qu'il ne supporte pas le png, mais le bmp, le jpeg et le gif animé.

J'utilise également Cairo graphiques pour un rendu spécial. Cairo supporte le format png.
Bien sûr, le Caire est un peu plus difficile à utiliser.

+0

Ce projet sur lequel je travaille est en C, pas en C++. Les classes, CImage, MFC, et cetera ne seront pas possibles et ne compileront pas. Comment est-ce que j'utilise peindre le bmp dans un contrôle d'image, dans une boîte de dialogue à l'exécution? –

4

Cela fonctionne à l'aide GDI+ et bitmap class:

Bitmap oBmp(L"D:\\test.png"); 
HBITMAP hBmp; 
oBmp.GetHBITMAP(0, &hBmp); 
SendMessage(item,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hBmp); 

Un certain contrôle caveats.Your a besoin d'un style SS_BITMAP. N'oubliez pas d'inclure gdiplus.h et sa bibliothèque. Vous devez initialiser (GdiplusStartup) et arrêter GDI +. Libérer toutes les ressources du système est sur vous.

0

Avez-vous vérifié la bibliothèque DevIL/OpenIL? Il suit le style OpenGL de nommage de fonction et est écrit dans le bon vieux C.

J'ai utilisé dans le passé, avec succès. C'est très portable aussi.

Check it out ici: http://openil.sourceforge.net/features.php

2

Je ne pense pas LoadBitmap ou toute autre fonction GDI simple (comme LoadImage) chargera un PNG.

Vous pouvez enregistrer votre ressource dans un BMP 32 bits avec un outil d'édition d'image, puis utiliser LoadImage avec LR_CREATEDIBSECTION.

Ou vous pouvez utiliser une bibliothèque qui chargera le fichier PNG dans une DIBSECTION. GDI + chargera PNG et JPG en plus de BMP.

Les bibliothèques d'automatisation OLE disposent également d'une interface IPicture que vous pouvez instancier avec différents types d'image, puis obtenir la DIBSECTION sous-jacente. C'est difficile à utiliser, surtout si vous n'êtes pas familier avec COM. Voir OleLoadPicture pour un point de départ.

Questions connexes