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

lermite222 Messages postés 9042 Statut Contributeur 1 191
 
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
lermite222 Messages postés 9042 Statut Contributeur 1 191
 
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
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
lermite222 Messages postés 9042 Statut Contributeur 1 191
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
lermite222 Messages postés 9042 Statut Contributeur 1 191
 
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
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
lermite222 Messages postés 9042 Statut Contributeur 1 191
 
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
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
lermite222 Messages postés 9042 Statut Contributeur 1 191
 
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
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
lermite222 Messages postés 9042 Statut Contributeur 1 191
 
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
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