2010-01-25 8 views
2

Je définis un curseur personnalisé sur mon application à partir d'un fichier d'icône, mais le point de clic est mal coordonné. Je règle le curseur avecComment définir les coordonnées de point d'accès sur un curseur Windows généré à partir d'un fichier d'icône?

SetClassLongPtr(hwnd, GCL_HCURSOR, reinterpret_cast<LONG_PTR>cursor) 

où le curseur est le résultat de;

LoadImage(
    NULL, 
    "some_path/cursor.ico", 
    IMAGE_ICON, //also tried IMAGE_CURSOR 
    0, //width. 0 uses the width of the file provided 
    0, //height. 0 uses the height of the file provided 
    LR_LOADFROMFILE 
); 

Le curseur charges fines, mais ses clics viennent du coin inférieur gauche de l'image du curseur, plutôt que de haut à gauche.

Le wikipedia article on .ico files indique que les zones sensibles sont uniquement spécifiées sur les fichiers .cur, pas .ico.

Edit: question Clarifiée


ref: LoadImage() et SetClassLongPtr() sur msdn.

+0

Création d'un fichier .cur du Ico (ou plutôt, le même bitmap l'Ico a été créé à partir) et le chargement qui résout le problème. Je préférerais ne pas avoir à lancer une autre application pour faire la conversion si. Le fichier ico fonctionne comme un curseur, juste avec les mauvaises coordonnées. Il y a sûrement un moyen de régler cela. – RJFalconer

Répondre

4

Vous pouvez le faire avec CreateIconFromResourceEx

Vous passez un pointeur vers un CURSOR_RES_HDR comme premier paramètre. C'est l'une de ces structures que vous pouvez trouver enfouies dans la documentation, mais ce n'est pas un fichier d'en-tête que je peux trouver. C'est assez simple cependant, essentiellement à 16 bits non signés ints suivi par un BITMAPINFOHEADER contenant les données d'image du curseur.

typedef struct { 
    WORD    xHot;   // x hotspot 
    WORD    yHot;   // y hotspot 
    BITMAPINFOHEADER bih; 
    } CURSOR_RES_HDR; 

... 

CURSOR_RES_HDR * pImage; 

// Fill out pImage 

HCURSOR hcur = CreateIconFromREsourceEx((BYTE*)pImage, 
        cbImage, // size of image data + hotspot (in bytes) 
        FALSE, 
        0x00030000, // version: value mandated by windows 
        0, 0,  // width & height, 0 means use default 
        LR_DEFAULTSIZE | LR_DEFAULTCOLOR); 
+0

+1. Génial, ty. – RJFalconer

1

Utilisez cet excellent cursor editor pour créer des curseurs et vous pouvez définir le hotspot, le rendre animé, etc. Je l'ai trouvé assez astucieux et soigné.

Espérons que cela aide, Cordialement, Tom.

+0

+1, très pratique. Si seulement Gimp avait une icône/curseur i/o plugin. – RJFalconer

1

Oui, le point d'accès est déterminé par le contenu du fichier .cur. L'article Wikipédia vous montre ceci, décalages 4 et 6. Windows n'a pas d'API pour changer le hotspot après le chargement du curseur. Il suffit de modifier le curseur dans Visual Studio ou dans un autre éditeur de curseur, spécifiez le point de connexion et enregistrez le fichier en tant que fichier .cur.

+0

Ce n'est le cas que pour les fichiers .cur. LoadImage() permet les curseurs générés à partir de bitmaps et d'icônes. Comment spécifiez-vous hotspot alors? – RJFalconer