UserControl + curseur

Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   -  
Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   -
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. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  2. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  3. Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   17
     
    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
  4. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   17
     
    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
  7. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  8. Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   17
     
    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
  9. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  10. Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   17
     
    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. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      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. Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   17
       
      Merci pour ton aide lermite222
      Je vais penser à autre chose alors.
      Grand merci pour ton soutiens !
      0
    3. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      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. Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   17
       
      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