A la demande de BruNews, et en réponse à une question du forum, voici un petit code source en C montrant comment afficher une image JPG en utilisant l'interface COM IPicture.
Source / Exemple :
#include <windows.h>
#include <olectl.h>
// Variables globales:
char chemin[260];
WNDPROC OldStaticProc;
// Fonction d'affichage de l'image JPG:
void AfficheImage(char* path, HWND hwndcible)
{
// Variables:
IPicture* pic;
HRESULT hres;
HDC hdc;
RECT rect;
int hauteur, largeur;
WCHAR wpath[260];
// Convertir le chemin en UNICODE:
MultiByteToWideChar(0,0,path,-1,wpath,260);
// Ouverture de l'image:
hres = OleLoadPicturePath(wpath, 0,0, 0, &IID_IPicture, (void**)&pic);
// Obtenir le HDC du controle cible:
hdc=GetDC(hwndcible);
// Obtenir la zone cliente du controle cible:
GetClientRect(hwndcible,&rect);
// Obtenir la largeur et la hauteur de l'image:
hres=pic->lpVtbl->get_Width(pic,&largeur);
hres=pic->lpVtbl->get_Height(pic,&hauteur);
// Afficher l'image:
hres=pic->lpVtbl->Render(pic,hdc,0,0,rect.right,rect.bottom,0,hauteur,largeur,-hauteur,0);
// Libérer le HDC du controle cible:
ReleaseDC(hwndcible,hdc);
//Libérer l'interface IPicture:
pic->lpVtbl->Release(pic);
}
// Procédure de sous-classement de notre Static:
LRESULT WINAPI StaticProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// Traitement du message WM_PAINT:
if(message==WM_PAINT)
{
PAINTSTRUCT ps;
BeginPaint(hwnd,&ps);
// Appeler la fonction d'affichage de l'image:
AfficheImage(chemin,hwnd);
EndPaint(hwnd,&ps);
return 0;
}
// Appeler la procédure par défaut des Statics:
return CallWindowProc(OldStaticProc, hwnd, message, wParam, lParam);
}
// Procédure de notre boite de dialogue:
BOOL WINAPI DialogProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
// Variables:
static HWND hStatic,hQuitter;
switch(message)
{
case WM_INITDIALOG:
// Former le chemin complet de l'image:
GetCurrentDirectory(260,chemin);
lstrcat(chemin,"\\image.jpg");
// Donner un titre à la boite de dialogue:
SetWindowText(hDlg,"Affichage d'images JPG avec IPicture");
// Créer les controles:
hQuitter=CreateWindow("BUTTON","Quitter",WS_VISIBLE | WS_CHILD ,424,130,60,20,hDlg,0,0,0);
hStatic=CreateWindowEx(0,"STATIC","",WS_VISIBLE | WS_CHILD | SS_SUNKEN,10,10,400,260,hDlg,0,0,0);
// Sous-classer le Static:
OldStaticProc=(WNDPROC)SetWindowLong(hStatic,GWL_WNDPROC,(LONG)StaticProc);
// Changer la police du bouton "Quitter":
SendMessage(hQuitter,WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT),0);
break;
case WM_COMMAND:
// Fermer la boite de dialogue si clic sur "Quitter":
if((HWND)lParam==hQuitter) EndDialog(hDlg,0);
break;
case WM_CLOSE:
// Fermer la boite de dialogue:
EndDialog(hDlg,0);
break;
default:
break;
}
return 0;
}
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE prev, LPSTR cmd, int show)
{
// Déclaration d'une structure DLGTEMPLATE:
LPDLGTEMPLATE lpdt;
// Initialiser la librairie COM pour notre application:
CoInitialize(0);
// Allouer de la mémoire pour notre structure DLGTEMPLATE:
lpdt = ( LPDLGTEMPLATE) GlobalAlloc(GPTR, 512);
if (!lpdt) return 1;
// Définir les styles et les dimensions de la boite de dialogue:
lpdt->style = WS_SYSMENU | WS_MINIMIZEBOX | DS_CENTER ;
lpdt->x = 0; lpdt->y = 0; lpdt->cx =250; lpdt->cy = 152;
// Lancer la boite de dialogue:
DialogBoxIndirectParam(0,lpdt,0,(DLGPROC)DialogProc,(LPARAM) 0);
// Libérer la mémoire allouée pour notre structure DLGTEMPLATE:
GlobalFree((HGLOBAL) lpdt);
// Libérer la librairie COM:
CoUninitialize();
return 0;
}
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.