UserControl + curseur

Salut à tous !

Je sollicite votre aide pour ce bout de code en VB6.
Dans mon appli, j'ai plusieurs UserControl avec lesquels je dois attribuer à chacun un curseur différent.
Cela fonctionne pour le textbox puisqu'il à un curseur "text.cur" mais lorsqu'il s'agit des pictureclip intégré aux usercontrol, le seul élément que je modifie pour avoir supposons un "link.cur" s'attribut à tous les usercontrol qui possèdent des pictureclip.

Comment donner à chaque user control possédent une pictureclip un seul model de curseur ?
Voici mon code en intégrale pour ajouter le curseur à mon appli :

Module:
Public Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" (ByVal hInstance As Long, ByVal lpCursorName As Long) As Long
Public Declare Function LoadCursorFromFile Lib "user32" Alias "LoadCursorFromFileA" (ByVal lpFileName As String) As Long
Public Declare Function DestroyCursor Lib "user32" (ByVal hCursor As Long) As Long
Public Declare Function SetClassLong Lib "user32" Alias "SetClassLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
 
Public Const GCW_HCURSOR = (-12)
Public Const IDC_WAIT = 32514&

Dim hSysCurs As Long, hCurs As Long

UserControl:
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
hCurs = LoadCursorFromFile(App.Path & "\Curseurs\Text_Select.cur")
hSysCurs = SetClassLong(UserControl.hwnd, GCW_HCURSOR, hCurs)
End Sub

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
hCurs = LoadCursorFromFile(App.Path & "\Curseurs\Text_Select.cur")
hSysCurs = SetClassLong(UserControl.hwnd, GCW_HCURSOR, hCurs)
End Sub

Private Sub UserControl_Terminate()
SetClassLong UserControl.hwnd, GCW_HCURSOR, hSysCurs
DestroyCursor hCurs
End Sub

Sinon, j'ai pensé à intégrer dans le load de mon programme qui devrait recevoir cet "ocx" dans le cas ou la première méthode ne fonctionne pas, de changer les curseur à partir de la gestion de la souris dans le système même et de remettre en place les curseurs standards de windows... mais là je beug, je ne sais pas comment faire...

Pouvez-vous m'aider pour l'une des deux solutions svp ?

Merci

9 réponses

  1. Contributeur
    Bonjour,
    Si tu veux que chaque OCX ai son curseur perso tu doit mettre cela dans une propriété, ce sera à l'utilisateur de choisir sont curseur.
    De toute façon, ce n'est certainement pas dans le Read/WritePropertie qu'il faut faire appel à des API mais dans Initialize.
    Éventuellement faire un choix de curseurs avec Rnd
    0
    1. Contributeur
      Voila comme je vois la chose...
      Public Enum ChoixCurseur   
          Croix   
          Plat   
          Autre   
          Paysage   
          Lettre   
      End Enum   
      Dim mNvCurs As ChoixCurseur   
      
      Private Sub UserControl_Initialize()   
          ChangeCurseur   
      End Sub   
      
      Private Property Let Curseur(ByVal NvCurs As ChoixCurseur)   
          If mNvCurs <> NvCurs Then   
              mNvCurs = NvCurs   
              ChangeCurseur   
              PropertyChanged "Curseur"   
          End If   
      End Property   
      
      Private Sub ChangeCurseur()   
      Dim St As String   
      Dim hCurs As Long, hSysCurs As Long   
          Select Case mNvCurs   
          Case 0: St = "NomFichier Croix.cur"   
          Case 1: St = "NomFichier Plat.cur"   
          Case 2: St = "NomFichier Autre.cur"   
          Case 3: St = "NomFichier Paysage.cur"   
          Case 4: St = "NomFichier Lettre.cur"   
          End Select   
          hCurs = LoadCursorFromFile(App.Path & "\Curseurs\" & St)   
          hSysCurs = SetClassLong(UserControl.hWnd, GCW_HCURSOR, hCurs)   
      End Sub   
      
      Private Sub UserControl_ReadProperties(PropBag As PropertyBag)   
          mNvCurs = PropBag.ReadProperty("Curseur", 1)   
      End Sub   
      
      Private Sub UserControl_WriteProperties(PropBag As PropertyBag)   
          Call PropBag.WriteProperty("Curseur", mNvCurs, 1)   
      End Sub

      Tu va avoir une propriété curseur dans l'application, tu la change et elle sera mémorisée.
      Quand je fais un truc comme ça je change le nom des fichiers en finissant par le N° comme par exemple
      Curseur0.cur, Curseur1.cur, Curseur2.cur
      alors en place de faire un select j'initialise directement St
      St = "Curseur" & mNvCurs & ".cur"
      J'ai fais ça vite fais, pas tester juste un pilote.
      A+
      Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
      NOTE : Je ne répond pas aux MP pour les questions techniques.
      0
      1. Salut lermite222 et merci pour ta réponse et le temps que tu donne.
        J'ai essayé ton option et pareil, lorsque je met ton code dans un seul usercontrol, il prends pour la généralité... et l'on ne peux pas avoir accès à la propriété Curseur (mais là c'est réglé.)
        Le beug du code est qu'il ne change pas la propriété du curseur. Il reste figé sur la première option "Croix".
        Reste à savoir s'il arrive à changer est-ce qu'il prendra aussi pour la généralité des autres usercontrol ?
        0
        1. Contributeur
          Bon behh désolé, je n'avais plus fais d'OCX depuis que j'ai Vista et... malheureusement ÇA VA PLUS, les mécanismes de l'OCX ne fonctionne plus. J'avais déjà du modifier certain OCX créer sous XP pour qu'il fonctionne sous vista.
          Faut oublier de créer des OCX sous vista et probablement encore moins sous W7.
          J'ai tout essayé, sur un seul UF ça pourrait encore aller tant bien que mal mais dés qu'on en met plusieurs tout foire, probablement un mauvais adressage des mémoires probag.
          A+
          0
          1. Merci mon vieux.
            Par contre j'ai toujours travaillé avec cet OCX depuis XP en passant par Vista et Win7, je n'ai jamais eu de problème avec mon "bébé".
            Là vu que je souhaite l'améliorer, lui donner un coup de peigne fin, je beug sur cette option.
            Merci pour ton aide en tout cas, mais si tu as une astuce pour activer un modèle de style de curseur dans la liste des pointeurs du panneau souris (panneau de configuration), je penses qu'au load ça sera super de l'activer et le désactiver à la fermeture du programme...
            0
            1. Contributeur
              Salut le jeune.
              C'est comme je dis plus haut, les OCX qui ont été développés sur XP fonctionnent sur vista à quelque exceptions près. Certaine modif sont prises en compte
              Ex: Sur cet OCX j'ai du rediriger l'accès au resize et ça a fonctionner mais je n'ai rien modifier dans le Probag ni dans les propriétés.
              Rappel toi.. quand tu installe VB6 sur vista tu a l'alerte "problème de compatibilité connue" ou quelque chose comme ça. (Suis ptét vieux mais j'ai encore un peu de mémoire)
              Tu peu ajouter un pointeur mais pas en couleur.
              Edit : Et ça fonctionne très bien.
              Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
              NOTE : Je ne répond pas aux MP pour les questions techniques.
              0
              1. Lol, on dirais que mon mot "vieux" t'as marqué... désolé, c'est signe de respect pour dire "sage" dans mon pays :D
                Je comprends le problème de VB6 et j'ai converti auparavant en 16 bit les curseurs... mais c'est merdique.
                Y a t-il une option pour activer dans la liste des pointeurs, les pointeurs voulus ?
                J4ai copié tous mes pointeurs dans le dossier curseur et enregistré le style sous "Oxygen_curseur"
                Je souhaiterai les activer depuis VB6 et les désactiver en quittant le logiciel...
                As tu une option pour cela ?
                0
                1. Contributeur
                  Comme j'ai dis, Oui, mais en noir et blanc, ça t'intéresse ?
                  Supprime l'API.
                  Si tu est parvenu à avoir la propriété Curseur ce code fonctionne
                  Private Sub ChangeCurseur() 
                  Dim St As String 
                      'adapter le chemin 
                      St = "C:\Myimages2\Curseur\LN" & mCurs + 100 & ".cur" 
                      UserControl.MouseIcon = LoadPicture(St) 
                      UserControl.MousePointer = 99 
                  End Sub 
                  
                  Private Sub UserControl_ReadProperties(PropBag As PropertyBag) 
                      mCurs = PropBag.ReadProperty("Curseur", 1) 
                      ChangeCurseur 
                  End Sub 
                  
                  Private Sub UserControl_WriteProperties(PropBag As PropertyBag) 
                      Call PropBag.WriteProperty("Curseur", mCurs, 1) 
                  End Sub 
                  
                  Public Property Get Curseur() As ChoixCurseur 
                      Curseur = mCurs 
                  End Property 
                  
                  Public Property Let Curseur(ByVal NvCurs As ChoixCurseur) 
                      If mCurs <> NvCurs Then 
                          mCurs = NvCurs 
                          ChangeCurseur 
                      End If 
                  End Property

                  J'ai tester sur des pictures elles ont chacune un curseur différent.
                  A+
                  EDIT : Fonctionne avec tout les curseurs. pas besoin de les avoir en 16
                  Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
                  NOTE : Je ne répond pas aux MP pour les questions techniques.
                  0
                  1. Je vois... non le blanc noir ne me vas pas... il rends toute l'icone noir. Enfin, non, il me le faut en couleur...
                    Je vais pencher un peux plus sur la première solution. Elle a fonctionnée, mais partage sa propriété... là est le problème.
                    0
                    1. Contributeur
                      Aucune chance avec l'API j'ai tout essayé. A moins que tu ai encore un PC avec XP.
                      Passe à VB.Net (c'est gratuit)
                      A++
                      0
                    2. Merci pour ton aide lermite222
                      Je vais penser à autre chose alors.
                      Grand merci pour ton soutiens !
                      0
                    3. Contributeur
                      Je viens d'essayé en modifiant le curseur à partir de l'appli et.. Toujours le même résultat, même curseur pour tout les contrôles, pourtant l'hWnd est différent, la valeurs de l'icone aussi.
                      Essayer aussi avec des contrôles indexés.. toujours idem.
                      0
                    4. J'ai fouillé un peux pour voir la base de registre, lorsque tu active un kit de curseur, c'est la même ligne qui change, ce n'est pas genre il y a plusieurs et l'on choisis un mode non... La seule ligne est éditable.
                      Si lorsqu'on ouvre le logiciel on change la valeur du registre, il ne prendra pas instantanément... or si l'on change en mode silencieux le main.cpl et activons le style souhaité, là je pense qu'on aura gagné un point !
                      Tu penses possible de changer en mode silencieux le style du pointeur et le ramener à son point initial en quittant le logiciel ?
                      0