Avant de poster sur le forum anglais, je voudrai savoir si vous obtenez les mêmes résultats que moi.
Voici le PB (Compilation sous PB530 XP sp3).
Pour connaitre la position du rectangle sous lequel la souris se trouve. J’utilise les deux instructions ci-dessous.
hwnd=WindowFromPoint_(DX | DY<<32)
GetWindowRect_(hWnd,POS_R)
Suivant que ces deux instructions soient placées dans le prg principal ou dans un Thread,
on obtient des résultats différents si le curseur se situe dans la zone du screen (openwindowedscreen),
les résultats sont les mêmes en dehors de cette zone.
Pouvez-vous me confirmer ces résultats ?
Et si quelqu’un à une explication je suis preneur.
PS : compiler en mode Thread avec l'option debug
Vous pouvez déplacer la fenêtre.
Code : Tout sélectionner
EnableExplicit
Structure x
s.i ; type de sprite
x.i ; position x
y.i ; position y
a.i ; varie de 128 à 255
EndStructure
Structure inforect
StructureUnion
info.rect
infoi.l[4]
EndStructureUnion
EndStructure
Global Dim m(60),ev,Dim t_sp.x(7,8),MAXx.l,MAXy.l,NB_PAS
Global rcwin.rect,RCpaint.RECT, POSRC1.rect,POS_R.rect; ,rcClip.RECT, rcOldClip.rect
Define WMx,WMy,hwnd,IN_OUT,Mx, My,MBl,MBR,MBM,DX,DY
Define POS_x, POS_y,H_sp,L_sp,nb_sp,PX,PY,i_sp
Define M_err$="",i,thread1
Macro __q_t_
"
EndMacro
Macro __n(__n)
__q_t_#__n#=__q_t_+Str(__n)+" "
EndMacro
Procedure posrect(*POSRC.rect) ; Shared ou Global (voir aussi: Protected et Static).
Protected hwnd.l,DX.l,DY.l, nb_d, dtemps, dth,dtv,DXa,DYa
nb_d=ExamineDesktops()
MAXx=DesktopWidth(0)
MAXy=DesktopHeight(0)
dtemps=10
Repeat
DX=DesktopMouseX()
DY=DesktopMouseY()
hwnd=WindowFromPoint_(DX | DY<<32)
GetWindowRect_(hWnd,*posrc)
If nb_pas%100=0
Debug __n(*posrc\bottom)+__n(*posrc\left)+__n(*posrc\right)+__n(*posrc\top)+__n( hwnd)
EndIf
dth=dtemps/(Abs(Dx-DXa)+1); + 1 pour éviter la division par zéro à l'arret du curseur
dtv=dtemps/(Abs(DY-DYa)+1)
Delay(dth+Dtv) ; pas trés orthodoxe mais plus rapide que DT/(sqr(vx*vx+vh*vh))
DXa=DX
DYa=DY
Until dx+dy<2 Or (DX+DY+2)=>(MAXx+maxy) ; j'ai laissé cette possibilité pour déactiver le thread (phase d'essai en prg autonome)
; placer le curseur de la souris en haut en gauche mois de 1 pixel de 0,0
; ou en bas à droite (curseur proche de MAXx+MAXy)
EndProcedure
Enumeration
#image
#cursor=100
#mainform
#bout
EndEnumeration
#scr_x=0
#scr_Y=0
#scr_la=322
#scr_Ha=276
#scr_laP=40
#scr_HaP=46
#grs=210
; carte$="1T 2T 3T 4T 5
;************************************************************************************************************************************
Macro pos_screen
hwnd=WindowFromPoint_(DX | DY<<32)
GetWindowRect_(hWnd,POS_R)
If nb_pas%100=0
Debug __n(pos_r\bottom)+__n(pos_r\left)+__n(pos_r\right)+__n(pos_r\top)+__n( hwnd)
EndIf
EndMacro
;*************************************************************************************************************************************
;********************* Recherche des infos sur la souris et la zone dans laquelle elle se situe *******************
;*************************************************************************************************************************************
Macro M_INFO_RECT
WMx=WindowMouseX(#mainform)
WMy=WindowMouseY(#mainform)
MBl=MouseButton(#PB_MouseButton_Left)
MBR=MouseButton(#PB_MouseButton_Right)
MBM=MouseButton(#PB_MouseButton_Middle)
DX=DesktopMouseX()
DY=DesktopMouseY()
Mx=MouseX()
My=MouseY()
; ***************** Position des fenêtres *******************************
GetWindowRect_(hwnd,@rcwin) ; rectangle de la fenêtre ouverte par openwindow() valable même après déplacement
; GetClipCursor_(@rcClip) ; Rectangle de toute la surface de l"écran disponible pour le curseur à ce moment.
Define RCwinold.rect
If (POSRC1\right+#scr_laP)=<rcwin\right
CopyMemory(POSRC1,RCpaint,SizeOf(rect))
EndIf
POS_x=WMx/H_sp
pos_y=WMy/H_sp
EndMacro
;*************************************************************************************************************************************
;********************* Recherche pour savoir si le curseur est dans de rectangle de window ou de screen *******************
;*************************************************************************************************************************************
Macro M_MOUSE_IN_OUT
M_INFO_RECT
MouseLocate(WMx,WMy)
If Wmx>0 And DY-1>rcpaint\top And DY+1<rcpaint\bottom And DX-1>rcpaint\left And DX+1<rcpaint\right
ReleaseMouse(0)
IN_OUT=1
Else
IN_OUT=0
ReleaseMouse(1)
EndIf
CopyMemory(rcwin,RCwinold.rect,SizeOf(rect))
EndMacro
;*************************************************************************************************************************************
;********************* PREPARATION avec ouverture de window et de screen et création des sprites curseur et boitier ******************
;*************************************************************************************************************************************
Macro M_prepar
InitSprite()
InitKeyboard()
InitMouse()
UsePNGImageDecoder()
hWnd=OpenWindow(#mainform,#scr_x,#scr_Y,#scr_la+#scr_laP,#scr_Ha+#scr_Hap,"Boite_ENCH",13107201)
If hwnd=0
M_ERR$=" Création non réussi de OpenWindow "+#LF$ ; #LFCR$
EndIf
If OpenWindowedScreen(WindowID(#mainform),#scr_x,#scr_Y,#scr_la,#scr_Ha,0,0,0,#PB_Screen_WaitSynchronization)=0; #PB_Screen_WaitSynchronization #PB_Screen_SmartSynchronization #PB_Screen_NoSynchronization
M_ERR$+" Création de OpenWindowedScreen non réussi "+#LF$ ; #LFCR$
EndIf
; GetClipCursor_(@rcOldClip) ; Rectangle de toute la surface de l"écran
GetWindowRect_(hwnd,@rcwin) ; rectangle de la fenêtre ouverte par openwindow()
;****************************** Positionne le bouton gadget *****************************************************
If ButtonGadget(#bout,#scr_la-30,#scr_Ha+10,40,25,"OK")=0
M_ERR$+" Création non réussi ButtonGadget ="+Str(#bout)+#LF$ ; #LFCR$ non réussi ",+#LF$ ; #LFCR$
EndIf
;*************************************** Création des sprites boitier et curseur **********************************
; If CatchSprite(#image,?BOITIER)=0
; M_ERR$+" Création non réussi du sprite BOITIER ="+Str(#image)+#LF$
; EndIf
If CatchSprite(#cursor,?Cursor)=0
M_ERR$+" Création non réussi du sprite curseur ="+Str(#cursor)+#LF$
EndIf
If Len(M_ERR$)>0
MessageRequester("Erreur ",M_ERR$)
EndIf
EndMacro
;*************************************************************************************************************************************
;***************** Chargement des sprites ******************
;***************** et Appel de la procédure permettant de connaitre LES dimensions du rectangle réservé aux sprites ******************
;*************************************************************************************************************************************
Macro M_charge_sp
ClearScreen(RGB(100,100,100))
; H_sp=SpriteHeight(#image)
; L_sp=SpriteWidth(#image)
H_sp=46
L_sp=46
FlipBuffers()
nb_sp=42
Dim t_coul.s{2}(7)
T_coul(0)=" T"
T_coul(1)=" K"
T_coul(2)=" C"
T_coul(3)=" P"
T_coul(4)="SA"
For px=0 To 6
For py=0 To 5
i_sp=PX+(PY*7)
CreateSprite(I_sp,46,46)
StartDrawing(SpriteOutput(i_sp))
DrawingMode(#PB_2DDrawing_Gradient)
BackColor(RGB(210,210,210))
Box(0,0,46,46,RGB(210,210,210))
; FrontColor(RGB(0,0,255))
Select py
Case 0
DrawText(10,20,Str(PX+1)+t_coul(PY),RGB(125,162,123),RGB(0,0,0))
Case 1
DrawText(10,20,Str(PX+1)+t_coul(PY),RGB(238,155,48),RGB(0,0,0))
Case 2
DrawText(10,20,Str(PX+1)+t_coul(PY),RGB(255,0,0),RGB(0,0,0))
Case 3
DrawText(10,20,Str(PX+1)+t_coul(PY),RGB(255,255,255),RGB(0,0,0))
Case 4
DrawText(10,20,Str(PX+1)+t_coul(PY),RGB(0,0,255),RGB(0,0,0))
Case 5
DrawText(10,20,Str(PX+1)+t_coul(PY),RGB(0,0,0),RGB(210,210,210))
EndSelect
; DrawText( 10,20, Str(PX+1)+t_coul(PY))
StopDrawing()
t_sp(PY,PX)\s=i_sp
t_sp(PY,PX)\x=h_sp*PX
t_sp(PY,PX)\y=PY*46
t_sp(PY,PX)\a=255
DisplaySprite(i_sp,PX*46,Py*46)
Next
Next
; For i=0 To nb_sp-1
; m(i)=CatchSprite(-1,?BOITIER)
; ClipSprite(m(i),i*h_sp,0,h_sp,h_sp)
; PY=i/7
; PX=I%7
; t_sp(PY,PX)\s=m(i)
; t_sp(PY,PX)\x=h_sp*PX
; t_sp(PY,PX)\y=PY*46
; t_sp(PY,PX)\a=255
; Next
thread1=CreateThread(@POSRECT(),POSRC1.rect) ; Crée le thread
EndMacro ; Delay(10)
;*************************************************************************************************************************************
;******************************************************* Programme Principal **************************************************
;*************************************************************************************************************************************
M_prepar
M_charge_sp
;*************************************************************************************************************************************
;***************************************** boucle des événements *****************************************
;*************************************************************************************************************************************
Repeat
NB_PAS+1
;************************* deuxième boucle pour les événements dans la zone openwindow ****************************************
Repeat
Delay(1)
ev=WindowEvent()
If ev=#PB_Event_Gadget
If EventGadget()=#bout
StartDrawing(WindowOutput(#mainform))
DrawText(200,300,"Bout_Click"); [, CouleurTexte [, CouleurFond]])
DrawText(10,300,Space(40),RGB(#grs,#grs,#grs),RGB(#grs,#grs,#grs))
StopDrawing()
EndIf
EndIf:
If ev=#PB_Event_CloseWindow
End
EndIf
Until ev=0
;************************** suite pour la boucle des événements de la zone définie dans openwindowedscreen ********************
ShowCursor_(1)
FlipBuffers()
ExamineKeyboard()
ExamineMouse()
ClearScreen(RGB(100,100,100))
For PX=0 To 6
For PY=0 To 5
If Not (px=6 And py=5)
DisplayTransparentSprite(t_sp(Py,Px)\s,t_sp(Py,Px)\x,t_sp(Py,Py)\Y,190);, RGBA(128,128,128,0))
EndIf
Next
Next
pos_screen ; macro de test avant
M_MOUSE_IN_OUT
; pos_screen ; macro de test après
If IN_OUT
DisplayTransparentSprite(#cursor,MouseX(),MouseY(),255)
EndIf
If pos_x<7 And pos_y<6 And Mx>0 And (pos_x*pos_y)<>30
; DisplayTransparentSprite(t_sp(POS_y,POS_x)\s,t_sp(Pos_y,Pos_x)\x+3,t_sp(Pos_y,Pos_y)\Y+3,255);,RGB(10,10,10))
DisplaySprite(t_sp(POS_y,POS_x)\s,t_sp(Pos_y,Pos_x)\x+3,t_sp(Pos_y,Pos_y)\Y+3);,RGB(10,10,10))
EndIf
If MBL=1 ; MBL=MouseButton(#PB_MouseButton_Left) le bouton a été poussé
StartDrawing(WindowOutput(#mainform))
DrawText(10,300,"pos_x="+Str(pos_x)+", pos_y="+Str(pos_y)); [, CouleurTexte [, CouleurFond]])
DrawText(200,300,Space(20),RGB(#grs,#grs,#grs),RGB(#grs,#grs,#grs))
StopDrawing()
EndIf
; FlipBuffers()
Until KeyboardPushed(1);
;********************************************************************************************************************************
;******************************************* DATA SECTION ***********************************************************************
;********************************************************************************************************************************
DataSection
Cursor:
Data.q $0A1A0A0D474E5089,$524448490D000000,$170000000F000000,$1553D40000000608,$41444969000000BC
Data.q $000A4193C5CB3854,$FFF3CF897D040820,$05BA9616043C283F,$36E890D099AA782D,$502C30C1A444DCCC
Data.q $5C2C090C06090350,$C169C1E04970AC16,$E08828704E094E0E,$6BCF51056F0320A3,$7B0D81A19FEF024D
Data.q $1297AF02D317B619,$0AEBBF985B3E1DEC,$8FFC01D32F45AEBF,$00002F8AE621C09C,$42AE444E45490000
Data.q $0000000000008260
BOITIER:
EndDataSection
A+*posrc\bottom=724 *posrc\left=619 *posrc\right=941 *posrc\top=448
pos_r\bottom=773 pos_r\left=616 pos_r\right=984 pos_r\top=426
*posrc\bottom=724 *posrc\left=619 *posrc\right=941 *posrc\top=448
pos_r\bottom=773 pos_r\left=616 pos_r\right=984 pos_r\top=426
*posrc\bottom=941 *posrc\left=198 *posrc\right=520 *posrc\top=665 ; ici déplacement de la fenêtre résultats =
*posrc\bottom=941 *posrc\left=198 *posrc\right=520 *posrc\top=665
pos_r\bottom=990 pos_r\left=195 pos_r\right=563 pos_r\top=643 ;ici curseur dans la zone screen résultats <>
*posrc\bottom=941 *posrc\left=198 *posrc\right=520 *posrc\top=665
pos_r\bottom=990 pos_r\left=195 pos_r\right=563 pos_r\top=643
*posrc\bottom=941 *posrc\left=198 *posrc\right=520 *posrc\top=665
pos_r\bottom=990 pos_r\left=195 pos_r\right=563 pos_r\top=643
*posrc\bottom=941 *posrc\left=198 *posrc\right=520 *posrc\top=665
pos_r\bottom=990 pos_r\left=195 pos_r\right=563 pos_r\top=643
*posrc\bottom=990 *posrc\left=195 *posrc\right=563 *posrc\top=643 ; à partir d'ici la souris est sortie de la zone screen
pos_r\bottom=990 pos_r\left=195 pos_r\right=563 pos_r\top=643