La librairie FreeImage

Alexbad Messages postés 4 Date d'inscription mercredi 16 novembre 2005 Statut Membre Dernière intervention 1 juin 2006 - 13 mai 2006 à 15:31
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 - 13 mai 2006 à 16:31
Salut,

J'ai commencé à programmer en C++ avec la librairie standard de Windows. Là, je réussis à ouvrir une jolie fenêtre grisonnante au centre de l'écran, et je veux afficher une image dedans. J'ai trouvé la librairie FreeImage, que je ne sais pas utiliser et je ne trouve absolument aucun tutorial ni aucun exemple de son utilisation à l'exception de la documentation officielle, avec laquelle j'ai tenté de faire ça, mais sans succès :

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <freeimage/FreeImage.h>
#include "includes/resolution.c"

HWND hWnd;
MSG msg;
WNDCLASS wc;
HDC DC;
HGLRC RC;

LRESULT CALLBACK WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
DC=GetDC (hwnd);
break;
case WM_CLOSE:
PostQuitMessage (0);
break;
default:
return DefWindowProc (hwnd,uMsg,wParam,lParam);
break;

}

return 0;
}
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int CmdShow)
{
DLL_API void DLL_CALLCONV FreeImage_Initialise(BOOL load_local_plugins_only
FI_DEFAULT(FALSE));

wc.style = CS_OWNDC;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, "favicon.ico");
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "OGL";

RegisterClass(&wc);

Position resolution, positionWindow, dimensionsWindow;
resolution.x = GetSystemMetrics(SM_CXSCREEN);
resolution.y = GetSystemMetrics(SM_CYSCREEN);

dimensionsWindow.x = 500;
dimensionsWindow.y = 300;

positionWindow.x = resolution.x / 2 - dimensionsWindow.x / 2;
positionWindow.y = resolution.y / 2 - dimensionsWindow.y / 2;

hWnd = CreateWindow("OGL", "École de La Page", WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE | WS_MAXIMIZEBOX | WS_MINIMIZEBOX, positionWindow.x, positionWindow.y, dimensionsWindow.x, dimensionsWindow.y, NULL, NULL, hInstance, NULL);
DC = GetDC(hWnd);

FILE* myfile = fopen("erreur.txt", "r+");

FIBITMAP *dib = FreeImage_Load(FIF_BMP, "images/load.bmp", BMP_DEFAULT);

// ...
SetStretchBltMode(DC, COLORONCOLOR);

StretchDIBits(DC, 0, 0, 0, 0, 0, 0, FreeImage_GetWidth(dib), FreeImage_GetHeight(dib), FreeImage_GetBits(dib), FreeImage_GetInfo(dib), DIB_RGB_COLORS, SRCCOPY);
// ...
FreeImage_Unload(dib);

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
fclose(myfile);

DLL_API void DLL_CALLCONV FreeImage_DeInitialise();
return 0;
}

Voilà, merci d'avance pour votre aide

1 réponse

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
13 mai 2006 à 16:31
traite le message WM_PAINT et dessine dedans l'image.

case WM_PAINT :
PAINTSTRUCT ps = {0};
HDC hdc = BeginPaint(hWnd, &ps;
...
EndPaint(hWnd, &ps); // plus sur des param, à checker sur MSDN
FIBITMAP *dib FreeImage_Load(FIF_BMP, "images/load.bmp", BMP_DEFAULT);> à faire dans WM_CREATE

FreeImage_Unload(dib);

=> a faire dansWM_DESTROY

Ton erreur vient d'une mauvaise compréhension de la gestion d'une fenêtre Windows. Regarde le bouquin de petzold (j'ai pas le lien en tête mais il est souvent cité sur le forum) qui expliquera en détail.
0
Rejoignez-nous