Page 1 sur 4
#WM_centreBUTTONDOWN ?
Publié : jeu. 20/août/2015 14:23
par SPH
Salut,
Crisot m'a genereusement fait une procedure pour controler les boutons de la souris.
Il y a le bouton gauche et le bouton droit :
Code : Tout sélectionner
Procedure CrisotMouseButton() ; Très, très sale (PB ne gère pas les Event ButtonUp ou ButtonDown)
Repeat
Event = WindowEvent()
Select Event
Case #WM_LBUTTONDOWN ; Sale
LMB=#True
Case #PB_Event_LeftClick
LMB=#False
Case #WM_RBUTTONDOWN ; Sale
RMB=#True
Case #PB_Event_RightClick
RMB=#False
EndSelect
Until Event=0
EndProcedure
Comment controler le bouton centre de la souris ?
Code : Tout sélectionner
Case #WM_CBUTTONDOWN ; Sale
CMB=#True
Case #PB_Event_CentreClick
CMB=#False

Re: #WM_centreBUTTONDOWN ?
Publié : jeu. 20/août/2015 14:26
par falsam
Avec #WM_MBUTTONDOWN peut etre ?
Re: #WM_centreBUTTONDOWN ?
Publié : jeu. 20/août/2015 14:27
par TazNormand
Re: #WM_centreBUTTONDOWN ?
Publié : jeu. 20/août/2015 15:21
par SPH
Merci beaucoup pour vos reponses.

Re: #WM_centreBUTTONDOWN ?
Publié : jeu. 20/août/2015 18:50
par TazNormand
Topic nettoyé !
@ Micheao : Merci de ne plus troller les topics INUTILEMENT !
Re: #WM_centreBUTTONDOWN ?
Publié : ven. 21/août/2015 2:52
par crisot
Ouch, la procédure qui va (ou qui a?) faire parler x)
Re: #WM_centreBUTTONDOWN ?
Publié : ven. 21/août/2015 3:01
par crisot
Attention j'ai fait ça dans le cadre de HexaScrabble et de ses quelques clics (virer les ExamineMouse()).
Cette procédure flush complètement les WindowEvent(), ça peut rapidement foutre le bordel dans un projet qui en a besoin (auquel cas il faudra tout regrouper ailleurs).
Re: #WM_centreBUTTONDOWN ?
Publié : sam. 22/août/2015 13:00
par Ollivier
@Crisot
Bonjour!
Il existe une autre fonction utilisée par un code de Flype ici :
http://www.purebasic.fr/english/viewtop ... e&start=15
Ça regroupe tous les états des boutons des clavier et souris (roulette exclue)
Les états de verrouillage clavier y sont aussi je crois.
Voici la copie de ce code et la note de référence que Flype y a assortie.
Fonctionne en x86. Pas testé en x64.
Code : Tout sélectionner
Macro MYSTR(x)
RSet(StrU(x, #Byte), 3, "0")
EndMacro
Dim KeyboardState.b(256)
LoadFont(0, "Courier", 8)
If OpenWindow(0, 0, 0, 570, 255, "GetKeyboardState_()", #PB_Window_SystemMenu |
#PB_Window_ScreenCentered)
SetWindowColor(0, #White)
Repeat
Select WindowEvent()
Case #PB_Event_CloseWindow
Break
Case 0
If GetKeyboardState_( @KeyboardState() )
If StartDrawing( WindowOutput(0) )
DrawingFont( FontID(0) )
For y = 0 To 15
For x = 0 To 15
Line( 36 * x - 5, 0, 0, 300)
DrawText( 36 * x, 16 * y, MYSTR( KeyboardState( y << 4 +
x) ) )
Next x
Next y
StopDrawing()
EndIf
EndIf
Delay(1)
EndSelect
ForEver
EndIf
Pour expliquer chaque valeur de KeyboardStat(), Flype a écrit :Quand la fonction a été exécutée, chaque membre du tableau KeyboardState contient les drapeaux d'état d'une touche virtuelle.
Si le bit le plus élevé (KeyboardState(x) & $80 NdT) est à 1, la touche est appuyée, sinon, elle est non appuyée.
Si le bit le moins élevé (KeyboardState(x) & 1 NdT) alors la bascule est enclenchée (Exemple : touche NUM LOCK allumée, les boutons de souris c'est idem NdT), sinon il est désenclenché.
La touche est lachée et sa bascule déclenchée si KeyboardState(x) & $81 = 0 (j'ai un peu corrigé parce que chez Microsoft, il ne sont pas épargnés par la picole NdT)
Les DELs indicatrices du clavier s'allument selon l'état de la bascule des touches concernent.
Re: #WM_centreBUTTONDOWN ?
Publié : sam. 22/août/2015 18:30
par nico
Code : Tout sélectionner
;Application du message WM_MOUSEWEEL
#WM_MOUSEWHEEL = $20A
; Le coef permet d'ajuster le pas a une valeur voulue, qui est 120 par défaut.
Global coef.l = 1
Procedure ProcedureCallback(WindowID, Message, wParam, lParam)
Resultat = #PB_ProcessPureBasicEvents
Protected high.l, low.l
Protected x.l, y.l
Protected Delta.l
;Debug message
Select Message
Case #WM_MBUTTONDOWN
MessageRequester("Info", "Click bouton milieu, la molette ne tourne pas")
Case #WM_MOUSEWHEEL
high = wParam >> 16
low = wParam & $FFFF
x = lParam >> 16
y = lParam & $FFFF
; Position x et y de la souris par rapport à l'écran
; et sans rapport donc avec la fenêtre où le control
Debug "-----Position Souris-----"
Debug x
Debug y
Delta = high * coef
If Delta >= 120
Debug "-----Positif-----"
Debug delta
ElseIf Delta <= -120
Debug "-----Négatif-----"
Debug Delta
EndIf
;Ici, si la molette ne tourne pas, nous n'avons pas les notifications suivantes
; Pas de elseif car la valeur de Low peut prendre plusieurs valeurs.
If low & #MK_CONTROL ;0x0008 The CTRL key is down.
;MessageRequester("Info", "Touche CTRL appuyé, la molette tourne")
EndIf
If low & #MK_LBUTTON ;0x0001 The left mouse button is down
MessageRequester("Info", "Bouton gauche souris appuyé, la molette tourne")
EndIf
If low & #MK_MBUTTON ;0x0010 The middle mouse button is down
MessageRequester("Info", "Bouton milieu souris appuyé, la molette tourne")
EndIf
If low & #MK_RBUTTON ;0x0002 The right mouse button is down
MessageRequester("Info", "Bouton droit souris appuyé, la molette tourne")
EndIf
If low & #MK_SHIFT ;0x0004 The SHIFT key is down
;MessageRequester("Info", "Touche SHIFT appuyé, la molette tourne")
EndIf
If low & #MK_XBUTTON1 ;0x0020 The first X button is down
MessageRequester("Info", "Premier bouton X souris appuyé, la molette tourne")
EndIf
If low & #MK_XBUTTON2 ;0x0040 The second X button is down
MessageRequester("Info", "Deuxième bouton X appuyé, la molette tourne")
EndIf
; Au dessus, c'est pour l'exemple, dans une application, on fera par exemple:
; Touche control + shift + molette augmente ou diminue un zoom suivant la rotation de la molette
If low & #MK_CONTROL And low & #MK_SHIFT And Delta >= 120
Debug "Zoom diminue"
EndIf
If low & #MK_CONTROL And low & #MK_SHIFT And Delta <= 120
Debug "Zoom augmente"
EndIf
Resultat = 0
EndSelect
ProcedureReturn Resultat
EndProcedure
If OpenWindow(0,0,0,400,400,"ScrollAreaGadget",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
SetWindowCallback(@ProcedureCallback())
Repeat
EventID.l=WaitWindowEvent()
Select EventID
Case #PB_Event_Gadget
Select EventGadget()
Case 1
EndSelect
Case #PB_Event_CloseWindow
Quit=1
EndSelect
Until Quit=1
EndIf
Re: #WM_centreBUTTONDOWN ?
Publié : sam. 22/août/2015 18:52
par falsam
Je pense que SPH a oublié de préciser que la fameuse procédure se trouvant dans le premier message est incluse dans un jeu. Peut être qu'il le confirmera.
Re: #WM_centreBUTTONDOWN ?
Publié : sam. 22/août/2015 20:37
par Ollivier
nico t'as déchiré! Merci pour le raffinement de cette recherche.
Re: #WM_centreBUTTONDOWN ?
Publié : sam. 22/août/2015 22:09
par Ollivier
@Falsam
Déjà SPH peut se brosser pour avoir une procédure, il n'aura qu'une macro. Il faut se mettre au normes EPA Pollution et les procédures ça consomme plus de ressources!
Re: #WM_centreBUTTONDOWN ?
Publié : sam. 22/août/2015 23:35
par crisot
Fantastique Ollivier, je ne savais pas qu'on pouvait trouver ces états dans les KeyStates. Super, j'en prend bonne note!!! Merci.
Re: #WM_centreBUTTONDOWN ?
Publié : dim. 23/août/2015 5:52
par Ollivier
Bonjour Crisot, (et falsam)
Je comprends pas trop "un jeu", il y 6 supports graphiques de jeux possibles:
a - opengl
b- canvas
c - fenêtre transparente (Windows uniquement)
d- fenêtre normale
e- graphique fenêtré
f- graphique plein écran
Je pense qu'il vous faut ériger un tableau et rajouter autant de colonnes qu'il n'y a de fonctions.
Vous y compléterez les cases par des X ou des ratios.
Le tableau obtenu doit être observé après l'inventaire des contraintes ergonomiques de votre jeu.
Ne vous décevez d'aucune complication d'initialisation.
Une procédure InitScreen(n) avec n de 1 à 6 pour les 6 supports. Et vous n'y touchez plus sur x jeux. InitScreen() doit s'exécuter le plus rapidement possible.
Ensuite, c'est la partie basculement type changement de tâche qu'il faut gérer à la perfection et faire tester au maximum.
Cette fonction c'est pour e et f.
Désolé encore pour l'édition matinale et dominicale.
Un petit coucou à SPH.
Re: #WM_centreBUTTONDOWN ?
Publié : dim. 23/août/2015 7:40
par blendman
Concernant la souris, vous pouvez aussi zieuter du côté des tutoriaux, il y en a un dédié aux souris, avec presque tout dedans :
http://www.purebasic.fr/french/viewtopi ... =21&t=1310
Le problème avec la souris, lorsqu'on utilise un screen (pour un jeu ou une application graphique), c'est que la souris est enfermée et bloquée dans le screen. J'avais posté ce code pour la souris avec un screen (éviter de bloquer la souris dans l'écran notamment) :
http://www.purebasic.fr/french/viewtopi ... =6&t=15258