IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual C++ Discussion :

set image en png


Sujet :

Visual C++

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 20
    Points
    20
    Par défaut set image en png
    Bonjour tout le monde.

    Je développe actuellement sous visual studio 6 (je sais je devrais passer à autre chose, mais la valeur affective c'est fort non?)
    J'aimerais en fait intégrer la librairie png à mon code, afin de pouvoir utiliser des icones transparentes.
    Je ne dois faire aucune retouche d'image directement dans le programme, tout ce que je voudrais c'est faire une fonction de type setImage.
    En fouillant un peu sur divers sites, j'ai trouvé ce bout de code que j'ai adapté à mon soft :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    bool
    AddImage::SetImage(LPCTSTR fileName, int alpha)
    {
      CxImage img;
      img.Load(fileName, CXIMAGE_FORMAT_PNG);
      RECT rcWnd;
      GetWindowRect(&rcWnd);
      POINT ptWindowScreenPosition = {rcWnd.left, rcWnd.top}, ptSrc = {0, 0};
      SIZE size = {img.GetWidth(), img.GetHeight()};
     
      CDC* dcScreen = GetDC();
     
      // Création d'un dc mémoire de la taille de l'image, et dans lequel on dessine l'image
      HDC hmemdc = CreateCompatibleDC(dcScreen->GetSafeHdc());
      HBITMAP hbmp = CreateCompatibleBitmap(dcScreen->GetSafeHdc(), size.cx, size.cy);
      HGDIOBJ oldbmp = SelectObject(hmemdc, hbmp);
      img.Draw(hmemdc);
     
      BITMAP bmp;
      GetObject(hbmp, sizeof bmp, &bmp);
     
      BITMAPINFO bi;
      memset(&bi, 0, sizeof bi);
      bi.bmiHeader.biSize = sizeof bi.bmiHeader;
      bi.bmiHeader.biWidth = bmp.bmWidth;
      bi.bmiHeader.biHeight = bmp.bmHeight;
      bi.bmiHeader.biBitCount= bmp.bmBitsPixel;
      bi.bmiHeader.biPlanes = bmp.bmPlanes;
      bi.bmiHeader.biCompression = BI_RGB;
     
      int nbbytes = bmp.bmBitsPixel * bmp.bmWidth * bmp.bmHeight / 8;
      LPBYTE lpBits = new BYTE[nbbytes];
      // Récupération des bits de l'image
      GetDIBits(hmemdc, hbmp, 0, bmp.bmHeight, lpBits, &bi, DIB_RGB_COLORS);
      //ici on gère la transparence des pixels un par un
      LPBYTE pAlpha = img.AlphaGetPointer();
      for(int i = 0; i < nbbytes; i += 4) lpBits[i + 3] = *pAlpha++;
     
      SetDIBits(hmemdc, hbmp, 0, bmp.bmHeight, lpBits, &bi, DIB_RGB_COLORS);
      delete[] lpBits;
     
     
      BLENDFUNCTION bf = {AC_SRC_OVER, 0, alpha, AC_SRC_ALPHA};
      UpdateLayeredWindow(GetSafeHwnd(), dcScreen->GetSafeHdc(), &ptWindowScreenPosition, &size, hmemdc, &ptSrc, 0, &bf, ULW_ALPHA);
     
      SelectObject(hmemdc, oldbmp);
      DeleteObject(hbmp);
      DeleteDC(hmemdc);
      ReleaseDC(dcScreen);
      return true;
    }
    j'ai inclus dans mon projet les fichiers.h de CxImage, de LibPNG et de Zlib,plus la librairie User32.lib cela dit le programme refuse de me compiler
    es-ce que vous avez des suggestions ou du code qui pourrait m'aider?

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    si tu ne nous indique pas l'erreur, comment veux tu que l'on réponde ...

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 20
    Points
    20
    Par défaut désolé
    en fait les erreus sont les suivantes :
    error C2065: 'AC_SRC_ALPHA' : undeclared identifier
    error C2065: 'UpdateLayeredWindow' : undeclared identifier
    error C2065: 'ULW_ALPHA' : undeclared identifier
    et elles persistent meme après que j'ai inclus wingdi.h winuser.h et windows.h dans lesquels sont définis _WINGDI_, WINVER à 0x500 et
    _WIN32_WINNT à 0x0501 donc en théorie ça devrait marcher...

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    avec Vc6.0 il faut avoir une mise a jour du sdk..
    ça ne doit pas être le cas non ?
    Attention la derniere version pour vc6 n'est plus distribuée..
    voir ce post:
    http://www.developpez.net/forums/sho...05#post2232305

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 20
    Points
    20
    Par défaut SDK à jour
    Le SDK est à jour et les chemins pour les fichiers include prennet en compte aussi les dossiers du sdk, cependant l'erreur persiste...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 15
    Points
    15
    Par défaut UpdateLayeredWindow - undeclared identifier
    Salut,
    j'ai le même soucis pour l'inclusion de la fonction UpdateLayeredWindow...

    Je développe également sous VC6 et mon PlatformSDK est à jour.

    J'ai bien inclus windows.h et winuser.h, et je fais référence à User32.lib dans les settings du projet.

    Cependant, UpdateLayeredWindow reste inconnue pour le compilateur.

    Y à t-il une subtilité qui m'aurait échappé ?

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    As-tu aussi réglé _WINVER et _WIN32_WINNT ?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Voilà ce que j'ai mis dans mon stdafx :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #ifndef WINVER
    #define WINVER 0x0500
    #endif
     
    /*#ifndef _WIN32_IE
    #define _WIN32_IE 0x0501
    #endif*/
     
    #ifndef _WIN32_WINNT
    #define _WIN32_WINNT 0x0500
    #endif
    Mais il m'est impossible d'utiliser la fonction UpdateLayeredWindow ...

  9. #9
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Bonsoir,

    Connais-tu la classe CPngImage du Feature Pack?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    class CPngImage : public CBitmap  
    {
    // Construction/Destruction
    public:
    	CPngImage();
    	virtual ~CPngImage();
     
    // Attributes:
    protected:
    	static CImage* m_pImage;
     
    // Operations:
    public:
    	BOOL Load (UINT uiResID, HINSTANCE hinstRes = NULL);
    	BOOL Load (LPCTSTR lpszResourceName, HINSTANCE hinstRes = NULL);
     
    	BOOL LoadFromFile (LPCTSTR lpszPath);
    	BOOL LoadFromBuffer (LPBYTE lpBuffer, UINT uiSize);
     
    	static void __stdcall CleanUp ()
    	{
    		if (m_pImage != NULL)
    		{
    			delete m_pImage;
    			m_pImage = NULL;
    		}
    	}
    };
    Mais CPngImage n'est pas pour VC 6.0

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Non je ne connaissais pas le FeaturePack. Quel est le soucis avec VC6 ?

  11. #11
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Citation Envoyé par pierre_h
    Non je ne connaissais pas le FeaturePack. Quel est le soucis avec VC6 ?
    VC6 fait un peu vieux près de 11 ans déjà, beaucoup de bonnes choses ont été ajouté à VC++ qui assouplissent le développement d'application moderne, performante, robuste, puissante et présentable.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Mince, le FeaturePack n'est pas open source... Je comprends mieux maintenant. Même pas moyen de récupérer la classe CPngImage.
    Bon, retour à la case départ...

    Merci pour ta piste Gabrielly.

Discussions similaires

  1. [ImageMagick] Redimensionner une image JPEG PNG GIF
    Par Stouille89 dans le forum Bibliothèques et frameworks
    Réponses: 11
    Dernier message: 25/08/2007, 21h10
  2. Image format png
    Par JlouisI dans le forum Delphi
    Réponses: 8
    Dernier message: 28/06/2006, 19h12
  3. sauver une image en png
    Par greg778 dans le forum Langage
    Réponses: 7
    Dernier message: 13/11/2005, 17h22
  4. Afficher tout type d'image (gif ,png, jpg...)
    Par jfb53 dans le forum C++Builder
    Réponses: 22
    Dernier message: 20/07/2005, 14h52
  5. Traitements d'image sur PNG avec transparence
    Par Ingham dans le forum Langage
    Réponses: 16
    Dernier message: 02/08/2004, 16h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo