PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 2018
-
11 sept. 2005 à 04:36
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 2018
-
13 sept. 2005 à 11:43
bonjour,
voilà, je relance pour ma question "incomplète"
la question est l'interprétation des paramètres wParam et lParam en retour de procédure (SubClassing)
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 13 sept. 2005 à 10:40
GetAsyncKeyState détermine l'état de traitement depuis un dernier appel, etc... Il faut pour cela analyser les bits en retour, comme d'hab MSDN donne tous les détails.
Pour .net, FINIS les OCX, tout passe en format dll. De vb6 à vb.net c'est tout de même un changement important, le modèle d'interaction change comme pas mal d'autres choses. Il serait de tout manière impensable de garder des composants sur la vieille virtual machine dans une distrib .net, ça ne passerait plus sur les prochains systèmes, il faut absolument convertir.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 11 sept. 2005 à 15:36
c'est en diminutif....
selon le choix du dev, soit on appelle TrackMouseEvent2 au WM_MOUSEMOVE, déclanchant WM_MOUSEHOVER et WM_MOUSELEAVE, soit par un timer. (çà c'est ok)
mais le truc c'est que j'aurais voulu en même temps renvoyer comme param le Button Shift X Y
(X Y ok grâce à toi, encore un peu à revoir).
mais je n'arrive pas à obtenir les Button Shift (expliqué ancien topic)
et pour le WM_MOUSEWHEEL, c'est bien aussi wParam et lParam qui contiennent les infos clavier souris....
(rrrRRrRrRR, çà m'énerve....)
PCPT
Vous n’avez pas trouvé la réponse que vous recherchez ?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 sept. 2005 à 16:17
WM_MOUSEWHEEL:
coordonnees (pixel screen comme d'hab) X et Y dans lParam, X est dans 16 bits bas et Y 16 bits haut.
zDelta est dans 16bits haut de wParam, il vaudra normalement 120 si va vers le haut ou sinon -120, if wParam < 0 then c'est vers bas sinon haut.
if wParam And 4 Then Shift est appuyé.
Private Declare Function ScreenToClient Lib "user32" (ByVal hWnd As Long, lpPoint As POINTAPI) As Long
Private Declare Function loword Lib "TLBINF32" (ByVal DWord As Long) As Integer
Private Declare Function hiword Lib "TLBINF32" (ByVal DWord As Long) As Integer
Private Type BSXYType
DirWheel As Integer
Button As Integer
Shift As Integer
X As Single
Y As Single
End Type
Private Const WheelUp As Integer = 1
Private Const WheelDown As Integer = -1
Public Event WheelScroll(Direction As Integer, Button As Integer, _
Shift As Integer, X As Single, Y As Single)
Private Function TmpScroll(ByVal wParam As Long, ByVal lParam As Long) _
As BSXYType
'WM_MOUSEWHEEL:
'coordonnees (pixel screen comme d'hab) X et Y dans lParam, X est dans 16 bits bas et Y 16 bits haut.
'zDelta est dans 16bits haut de wParam, il vaudra normalement 120 si va vers le haut ou sinon -120,
'If wParam < 0 Then c 'est vers bas sinon haut.
'if wParam And 4 Then Shift est appuyé.
Dim PtMouse As MOD_API.POINTAPI
'direction If wParam < 0 Then TmpScroll.DirWheel WheelDown Else TmpScroll.DirWheel WheelUp
et j'en suis au même point. je n'arrive pas à récupérer le Alt.
zDelta vaut effectivement 120 (ou -120) et les X Y correspondent (juste à moi à ne pas renvoyer l'évènement si extérieur à RECT)
donc j'ai du mal comprendre qqc. puisque 120 en permanance.
donc c'est mon zKey à retravailler..... ()
ctrl + click molette + rotation molette vers le bas = 24.
... je viens de revérifier à l'instant, j'ai exactement la mêem chose qu'avant.... (mais par API)
pourquoi ALT me retourne zéro.
pourquoi WheelClick me retourne 16.
"if wParam And 4 Then Shift est appuyé" ... il faut que je gère séparément chaque combinaison?
j'avais commencé, mais toujours ce problème avec ALT :
Private Function ConvertWparamToButtonShift(Param As Long) As ButtonShiftType
Param = Param And 65535
Select Case Param Case 0: ConvertWparamToButtonShift.Button 0: ConvertWparamToButtonShift.Shift 0 Case 1: ConvertWparamToButtonShift.Button 1: ConvertWparamToButtonShift.Shift 0 Case 2: ConvertWparamToButtonShift.Button 2: ConvertWparamToButtonShift.Shift 0 Case 3: ConvertWparamToButtonShift.Button 3: ConvertWparamToButtonShift.Shift 0 Case 16: ConvertWparamToButtonShift.Button 4: ConvertWparamToButtonShift.Shift 0 Case 17: ConvertWparamToButtonShift.Button 5: ConvertWparamToButtonShift.Shift 0 Case 18: ConvertWparamToButtonShift.Button 6: ConvertWparamToButtonShift.Shift 0 Case 19: ConvertWparamToButtonShift.Button 7: ConvertWparamToButtonShift.Shift 0
Case 4: ConvertWparamToButtonShift.Button 0: ConvertWparamToButtonShift.Shift 1 Case 8: ConvertWparamToButtonShift.Button 0: ConvertWparamToButtonShift.Shift 2
'Alt non-reçu
End Select
End Function
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 12 sept. 2005 à 13:25
salut BruNews,
j'ai appelé la même fonction (TmpScroll) au WM_MOUSEMOVE (avec ou sans les ByVal) et je n'ai pas non plus le Alt.
et aussi, mes X Y ne sont pas les mêmes au WM_MOUSEMOVE qu'au WM_MOUSEWHEEL
(faux au MOVE).
tu es le seul à me répondre, désolé de te "harceler", mais je bloque vraiment....
faut-il faire un GetKeyState ? çà donne du hook dans du SubClass?! çà me semble bizarre....
et pour les X Y
le Form_Move me retourne par exemple : 2310 1155
et le WM_MOUSEMOVE (même pt) : -8745 -4185
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 12 sept. 2005 à 13:50
WM_MOUSEMOVE: si les valeurs sont < 0 c'est que souris est plus haute et/ou à gauche de la fenêtre, si pas le cas y a un scmoll dans tes calculs. Comme d'hab faire gaffe aux conversions, surtout aux twips de vb.
GetKeyState devrait aller, rien de bizzare et n'a rien à voir avec du hook.
Attention que wParam et lParam n'ont pas toujours le même type d'info, dépend du message WM_xxx, voir MSDN pour détails.
Faut te poser la question de savoir si ça vaut encore le coup de passer autant de temps à transposer tout cela pour vb qui est en fin de vie, le passage à .net est absolument obligatoire pour un VBiste et il ne faut pas perdre de temps en informatique, les choses vont trop vite pour qu'on puisse se le permettre.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 12 sept. 2005 à 14:32
re,
* souris..... < 0*0
non, souris ok. par contre, apparemment, quand je place ma fenêtre en 0*0 (+ caption), çà correspond à peu près.
çà doit donc être ScreenToClient pour l'un, et ClientToScreen pour l'autre.
*GetKeyState, je doute que les retours de proc ne contiennent pas ces infos. mais bon, à défaut, j'essaierai.
*même type, oui, j'avais déjà vu, mais merci.
*.net, ah non, me sape pas le moral. je suis bien conscient que VB6 meurt.... mais je commence à peine à m'y retrouver...
j'ai fait pas mal de recherches sur des sites de sondages, VB6 à beau mourir, il s'accapare 78% des développeurs VBsuite.
et je serais bien curieux de savoir combien le 2005 coûtera quand il ne sera plus Beta......
ici j'ai VB6 qui devait valoir 4000F, et 2003/architecte que je n'ai même pas installé.
le FrameWork a toujours déconné (pas de bol pour moi).
...c'est pas une envie soudaine de parler, mais autant je compte explorer un peu java en 2006, autant pour changer de langage chez Kro$oft, je suis en quête d'informations et d'incitations...
si tu as des points forts à me montrer (et envie), n'hésite pas.
pour rester sur ce Topic, je donnerai suite pour KeyState...
Merci bcp
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 12 sept. 2005 à 15:06
1 seul point suffit et doit effacer tous les autres: l'énorme croissance continuelle des offres d'emploi sur .net, VB et C# confondus, aucun autre discours ne peut tenir face à la réalité.
Si prob de prix et se comprend aisément, passe au C/C++ et tu trouveras des compilos gratuits, certes pas le confort et la puissance de VS mais qui permettent de bosser sans problème, je t'assure que tu seras le bienvenu sur cppfrance.
Revenons à ta touche ALT:
faut être précis, ce qui arrive dans wParam lParam sur les events WM_xxx ne sont pas des 'retours' mais les infos accompagnant l'évènement, il est donc normal qu'on n'est pas tout l'état du système matériel sur tous les events, il y en a pour chaque type, les WM_KEYxxx contiennent les infos clavier, etc... WM_MOUSEWHEEL ne fournit en revanche rien sur touche ALT.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 12 sept. 2005 à 15:30
umm. en effet, argument de taille.
je vais méditer...
un conseil entre 2005 beta et ma version 2003 existante?
ALT : le Form_Move contient bien ce ALT.
qu'il "n'accompagne" pas chaque param, ok. mais je suppose qu'il est au moins dans le WM_MOUSEMOVE (sans certitude bien sûr...)
ps : dll-activex et ocx compilés fait sous vb6 compatibles .net sans modifs? vice-versa?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 12 sept. 2005 à 15:46
2005 sans l'ombre d'une hésitation, toutes les applis .net migrent ou migreront sur le framework 2 alors autant y aller de suite.
Ne te base jamais sur ce que donne en param la virtual machine vb quand tu veux sous classe car à ce moment c'est direct du système que tu prends les params, pas du tout la même chose.
WM_MOUSEMOVE n'embarque pas non plus d'indication sur ALT, seulement SHIFT et CTRL. Faut pas hésiter à regarder MSDN sur chaque event, les params y sont clairement indiqués.
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
'
'
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If (GetKeyState(VK_MENU) And &HF0000000) Then Me.Print "ALT"
'If (GetAsyncKeyState(VK_MENU) And &HF0000000) Then Me.Print "ALT"
End Sub
'
'
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Me.Cls
End Sub
2 petites questions avant de valider (réponse collégiale celà dit),
1. pourquoi plus GetKeyState que GetAsyncKeyState ?
2. relance question ci-dessus // .net "ps : dll-activex et ocx compilés fait sous vb6 compatibles .net sans modifs? vice-versa?"
encore quelques adapatations et je vais enfin pouvoir "gagner du temps"