begin process at 2008 05 16 06:02:42
1 173 216 membres
61 nouveaux aujourd'hui
13 970 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

AFFICHAGE D'IMAGES JPG AVEC IPICTURE EN C


Information sur la source

Catégorie :Graphique Classé sous : ipicture, com, jpg, c Niveau : Débutant Date de création : 05/07/2007 Vu / téléchargé: 4 734 / 451

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

Description

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

  • #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;
  • }
#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;
}
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

  • signaler à un administrateur
    Commentaire de racpp le 05/07/2007 01:16:22 administrateur CS

    J'ai oublié de préciser que le fichier image doit figurer dans le même dossier que l'exécutable. Ce dernier doit être renommé en AfficheJPG.exe

  • signaler à un administrateur
    Commentaire de omnia le 07/05/2008 15:40:14

    Salut,

    j'essais de compiler ta source sous dev-cpp et sa ne fonctionne pas :

    j'ai déja ajouter les libs
    -lole32    // pour CoInitialize(0); et CoUninitialize();
    -loleaut32 // pour OleLoadPicturePath

    et
    #define IID_IPicture               "{7BF80980-BF32-101A-8BBB-00AA00300CAB}"

    mais le reste quand ca compile sa plante :p

    tu as déja fait des tests sur dev-cpp ?

  • signaler à un administrateur
    Commentaire de racpp le 09/05/2008 00:04:55 administrateur CS

    Salut,
    Je n'ai pas fait de tests sur Dev-cpp car je l'ai plus depuis que j'ai découvert qu'il souffre de beaucoup de lacunes. Essaie de passer en mode Debug pour repérer la ligne qui cause le plantage.

  • signaler à un administrateur
    Commentaire de omnia le 09/05/2008 09:14:48

    SAlut en fait c'est l'utilisation de Ipicture qui pose problèmesà partir de la fonction OleLoadPicturePath, je n'ai pas trouvé de correspondance.

    j pense que je vais aussi être obligé d'utiliser VS de toutes :) po grave fonctionne très bien sous VS en tout cas.

Ajouter un commentaire

Discussions en rapport avec ce code source

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS