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

Windows Discussion :

[API WIN] SAuvegarder l'image du pointeur


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 21
    Points : 14
    Points
    14
    Par défaut [API WIN] SAuvegarder l'image du pointeur
    Bonjour,

    Comme le titre du sujet l'indique, je souhaiterai enregistrer la forme du pointeur (fleche, double fleche, sablier), sous forme de fichier "brut" sur le disque dur.

    Malheureusement, tous mes essais on été vains jusqu'alors...

    Je récupere bien les informations du curseur via , pour pouvoir accéder au handle du curseur avec l'attribut hCursor que me retourne cette fonction.

    Le Handle est valide, mais les données sont toutes à 0 : image noire.

    J'ai cherché sur les sujets ici mais je n'ai rien trouvé (peut être ai-je raté quelque chose)

    Je me tourne donc vers vous, si vous aviez une idée pour moi, merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Tu devrais plutôt essayer de poster sur le forum Développement Windows
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par eyghon
    Le Handle est valide, mais les données sont toutes à 0 : image noire.
    Comment utilises-tu le handle en question ?
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    Voici mon code:

    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
    CURSORINFO icur;
      HDC workingDC;
      HPALETTE pal;
      HBITMAP hBitmap;  
      int w = GetSystemMetrics(SM_CXCURSOR);
      int h = GetSystemMetrics(SM_CYCURSOR);
      unsigned char* bits = new unsigned char[3*w*h];
      
      
      // 1 - résupération de l'icone du curseur
      icur.cbSize = sizeof(icur);
      if (GetCursorInfo(&icur) == 0)
      {
        tracer(-1);
        return ;
      }
      SelectObject(ref, icur.hCursor);
      DrawIcon( ref, 1, 1, icur.hCursor);
      hBitmap = CreateCompatibleBitmap(ref, w, h);
      if (hBitmap == NULL)
         tracer("Ne pas chercher plus loin");
      else
          tracer("Continuons");
          
      SelectObject(ref, hBitmap);
      BitmapToDIB( hBitmap, pal, bits);
      tracer("+1");
    La fonction BitmapToDib prend en entrée un HBITMAP et un HPALETTE (qui peut etre nul), et fournit un tableau des données brutes de l'image: bits.

    Il est fort probable que je fasse des trucs en dépit du bon sens, je suis relativement catatsrophique sur l'API Windows.

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Oui, ta gestion du bitmap ne va pas (tu dessines d'abord dedans, et ensuite tu le crée...).
    C'est quoi ref ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    ref est en fait le HDC obtenu dans le main via GetDC(NULL), c'est le contexte graphique de base si je ne m'abuse?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    On peut le faire différemment mais personnellement j'utiliserais GetBitmapBits() pour récupérer le corps de la bitmap :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    BITMAP bm;
    ::GetObject ((HGDIOBJ) hBitmap, sizeof(BITMAP), &bm);
    LPBYTE pBits = new BYTE[bm.bmWidthBytes * bm.bmHeight];
    ::GetBitmapBits (hBitmap, (LONG) (bm.bmWidthBytes * bm.bmHeight), (LPVOID) pBits);
    
    // faire le traitement sur pBits ici
    // ...
    
    delete [] pBits;
    C'est beaucoup plus simple que de passer par une DIB, mais en revanche je ne suis pas sûr que l'alpha soit OK dans le buffer cible.
    Si tu n'as pas besoin de récupérer la couche alpha, le résultat est garanti, sinon il faudrait tester...
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    Malheurement, toutes mes données du tableau pBits (ou bits) sont à 0...

    J'ai bien essayé de bidouiller 2-3 autres trucs mais sans résultats.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    Vraiment personne ne peut m'aider? J'ai beau essayer un peu tout ce que je sais, mes bits sont toujours a 0 ou ont des valeur ésotériques....

  10. #10
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Cadeau:
    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
    CURSORINFO icur = { sizeof( CURSORINFO ) };
    if ( !GetCursorInfo( &icur ) )
    {
        return 1;
    }
    
    int w = GetSystemMetrics( SM_CXCURSOR );
    int h = GetSystemMetrics( SM_CYCURSOR );
    
    HDC hdc = GetDC( NULL );
    HBITMAP hBitmap = CreateCompatibleBitmap( hdc, w, h );
    HDC hdcBitmap = CreateCompatibleDC( hdc ); 
    ReleaseDC( NULL, hdc );
    SelectObject( hdcBitmap, hBitmap );
    DrawIcon( hdcBitmap, 0, 0, icur.hCursor );
    
    for ( int y = 0; y < h; ++y )
    {
        for ( int x = 0; x < w; ++x )
        {
            COLORREF pixel = GetPixel( hdcBitmap, x, y ); 
        }
    }
    
    DeleteObject( hdcBitmap );
    DeleteObject( hBitmap );
    ça passe pas par un DIB, mais pour un petit bitmap utiliser GetPixel c'est pas la mort.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    Merci infiniment ca marche impec

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/11/2010, 17h58
  2. [API WIN] Eviter qu'un prog se lance 2 fois...
    Par asher256 dans le forum Windows
    Réponses: 2
    Dernier message: 07/10/2005, 15h58
  3. La programmation API win en C
    Par AjJi dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 29/09/2005, 22h22
  4. [VisualC++] Copie et sauvegarde d'images
    Par dananchet dans le forum MFC
    Réponses: 2
    Dernier message: 03/05/2005, 13h30
  5. [API WIN 32]effacer un fichier
    Par ben_iap dans le forum MFC
    Réponses: 2
    Dernier message: 30/01/2004, 13h51

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