2009-11-09 3 views
1

Je souhaite obtenir la hauteur et la largeur d'un fichier .cur sans chercher dans son format.Comment puis-je connaître la taille d'un objet HCURSOR?

J'essaie d'utiliser LoadCursorFromFile() pour obtenir un HCURSOR, je suppose qu'il existe une fonction API pour obtenir les infos HCURSOR, mais je trouve que GetCursorInfo() n'est pas du tout ce que je veux.

Est-il possible d'obtenir la hauteur et la largeur d'un objet HCURSOR?

Répondre

4

Il existe un certain chevauchement des API entre les icônes et les curseurs dans Windows. Vous pouvez appeler le GetIconInfoEx avec un HCURSOR ainsi qu'avec un HICON. La structure que vous récupérez aura des informations sur le hotspot.

Je ne vois pas comment obtenir la taille réelle. Techniquement, toutes les icônes de curseur sont une taille fixe que vous pouvez obtenir en demandant au système (avec GetSystemMetrics) pour SM_CXCURSOR et SM_CYCURSOR. Ceux qui semblent plus petits sont en fait de cette taille, ils ont juste beaucoup de pixels transparents. Si vous devez connaître la taille apparente, vous devrez extraire le masque et analyser les bits pour déterminer le rectangle de délimitation.

+0

beaucoup d'aide. +1 – Gohan

0

De MSDN:

Les paramètres nWidth et nHeight doivent spécifier une largeur et une hauteur qui sont pris en charge par le pilote d'affichage actuel, parce que le système ne peut pas créer des curseurs d'autres tailles. Pour déterminer la largeur et la hauteur prises en charge par le pilote d'affichage, utilisez la fonction GetSystemMetrics, en spécifiant la valeur SM_CXCURSOR ou SM_CYCURSOR.

3

code universel C++, pour tout curseur:

SIZE GetSize(HCURSOR ico) 
{ 
    SIZE res = {0}; 
    if (ico) 
    { 
     ICONINFO info = {0}; 
     if (::GetIconInfo(ico, &info)!=0) 
     { 
      bool bBWCursor = (info.hbmColor==NULL); 
      BITMAP bmpinfo = {0}; 
      if (::GetObject(info.hbmMask, sizeof(BITMAP), &bmpinfo)!=0) 
      { 
       res.cx = bmpinfo.bmWidth; 
       res.cy = abs(bmpinfo.bmHeight)/(bBWCursor ? 2 : 1); 
      } 

      ::DeleteObject(info.hbmColor); 
      ::DeleteObject(info.hbmMask); 
     } 
    } 
    return res; 
} 
+0

Utilisez SM_CXCURSOR ou SM_CYCURSOR n'est pas correct. Par exemple: après le passage à une taille de curseur énorme dans les valeurs du panneau de contrôle de SM_CXCURSOR et SM_CYCURSOR restent 32x32. – 23W

Questions connexes