ATTENTION FRED NOUS SURVEILLE !!!
Publié : dim. 13/juin/2004 14:52
..............
Forums PureBasic - Français
http://forums.purebasic.com/french/
Code : Tout sélectionner
If yyd = 50 And yyg = 50 And xyd = 110 And xyg = 50
hDesktop = GetDesktopWindow_()
hDC = GetWindowDC_(hDesktop)
rect.RECT
rect\right = GetSystemMetrics_(#SM_CXSCREEN)
rect\bottom = GetSystemMetrics_(#SM_CYSCREEN)
oldFont = SelectObject_(hDC, LoadFont(23, "Verdana", 128))
SetBkMode_(hDC, #TRANSPARENT)
SetTextColor_(hDC, #Red)
DrawText_(hDC, "Arf !", Len("Arf !"), @rect, #DT_CENTER | #DT_VCENTER | #DT_SINGLELINE)
SelectObject_(hDC, oldFont)
ReleaseDC_(hDesktop, hDC)
EndIf
Code : Tout sélectionner
If yyd = 25 And yyg = 25 And xyd = 55 And xyg = 25
hDesktop = GetDesktopWindow_()
hDC = GetWindowDC_(hDesktop)
rect.RECT
rect\right = GetSystemMetrics_(#SM_CXSCREEN)
rect\bottom = GetSystemMetrics_(#SM_CYSCREEN)
oldFont = SelectObject_(hDC, LoadFont(23, "arial", 128))
SetBkMode_(hDC, #TRANSPARENT)
SetTextColor_(hDC, #Red)
DrawText_(hDC, "Arf !", Len("Arf !"), @rect, #DT_CENTER | #DT_VCENTER | #DT_SINGLELINE)
SelectObject_(hDC, oldFont)
ReleaseDC_(hDesktop, hDC)
EndIf
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 3.90
;
; Explication du programme :
; Donner à une fenêtre une forme spécifique. Par exemple faire une fenêtre ronde ou triangulaire.
Enumeration
#Quitter
#Forme1
#Forme2
#Forme3
#Forme4
#Forme5
EndEnumeration
Procedure Forme()
If GetGadgetState(#Forme1) ; si on a choisi la forme 1
Region = CreateRoundRectRgn_(0, 0, WindowWidth(), WindowHeight(), 40, 60) ; Création de la région pour faire une fenêtre avec les angles arrondis
; CreateRoundRectRgn_(X1, Y1, X2, Y2, R1, R2)
; X1, Y1 : coordonné du point haut gauche de la region
; X1, Y1 : coordonné du point haut gauche de la region
; R1, R2 : rayon de l'ellipse qui va servir à arrondir les angles de la region
SetWindowRgn_(WindowID(), Region, #True) ; On applique la région
DeleteObject_(Region) ; On supprime la région
ElseIf GetGadgetState(#Forme2) ; si on a choisi la forme 2
Region = CreateEllipticRgn_(0, 0, WindowWidth(), WindowHeight()) ; Création de la région pour faire une fenêtre elliptique
; CreateEllipticRgn_(X1, Y1, X2, Y2)
; X1, Y1 : coordonné du point haut gauche de la region
; X1, Y1 : coordonné du point haut gauche de la region
SetWindowRgn_(WindowID(), Region, #True) ; On applique la région
DeleteObject_(Region) ; On supprime la région
ElseIf GetGadgetState(#Forme3) ; si on a choisi la forme 3
Region = CreatePolygonRgn_(?Triangle, 4, #Alternate) ; Création de la région pour faire une fenêtre elliptique
; CreateRoundRectRgn_(Array, NbPoints, Type)
; Array : Adresse de la liste ou de la Data
; NbPoints : Nombre de points du polygone + 1 (car on fait une boucle donc on a 2 fois le premier point)
; Type : Voir msdn
SetWindowRgn_(WindowID(), Region, #True) ; On applique la région
DeleteObject_(Region) ; On supprime la région
ElseIf GetGadgetState(#Forme4) ; si on a choisi la forme 4
Region1 = CreateRectRgn_(0, 0, WindowWidth(), WindowHeight()) ; Création d'une région en rectangle
Region2 = CreateRectRgn_(10, 10, WindowWidth() - 10, 50) ; Création d'une région en rectangle
; CreateRectRgn_(X1, Y1, X2, Y2)
; X1, Y1 : coordonné du point haut gauche de la region
; X1, Y1 : coordonné du point haut gauche de la region
CombineRgn_(Region1, Region1, Region2, #RGN_DIFF) ; On combine les 2 régions
; Les modes suivants sont disponibles :
; #RGN_AND : Intersection
; #RGN_OR : Union
; #RGN_DIFF : Différences
; #RGN_XOR : Union moins les intersections
SetWindowRgn_(WindowID(), Region1, #True) ; On applique la région finale
DeleteObject_(Region1) ; On supprime les régions
DeleteObject_(Region2)
ElseIf GetGadgetState(#Forme5) ; si on a choisi la forme 5
Region1 = CreatePolygonRgn_(?Triangle, 4, #Alternate)
Region2 = CreateEllipticRgn_(0, 0, WindowWidth(), WindowHeight())
CombineRgn_(Region1, Region1, Region2, #RGN_OR) ; On combine les 2 régions
SetWindowRgn_(WindowID(), Region1, #True) ; On applique la région finale
DeleteObject_(Region1) ; On supprime les régions
DeleteObject_(Region2)
EndIf
EndProcedure
; Création de la fenêtre et dela GadgetList
If OpenWindow(0, 0, 0, 400, 400, #PB_Window_Borderless | #PB_Window_ScreenCentered, "Test") = 0 Or CreateGadgetList(WindowID(0)) = 0
End
EndIf
; Création des boutons et de l'option d'affichage
ButtonGadget(#Quitter, 100, 100, 200, 20, "Quitter")
OptionGadget(#Forme1, 100, 125, 200, 15, "Angles arrondis")
OptionGadget(#Forme2, 100, 140, 200, 15, "Ronde")
OptionGadget(#Forme3, 100, 155, 200, 15, "Triangle")
OptionGadget(#Forme4, 100, 170, 200, 15, "Trouée")
OptionGadget(#Forme5, 100, 185, 200, 15, "Triangle + Rond")
Repeat
Event = WaitWindowEvent()
If Event = #PB_EventGadget
Select EventGadgetID() ; boutons, zone de texte, ...
Case #Quitter
Event = #PB_EventCloseWindow ; On quitte
Default
Forme() ; sinon, on change la forme de la fenêtre
EndSelect
EndIf
Until Event = #PB_EventCloseWindow
End
DataSection
Triangle :
Data.l 200, 400, 0, 0, 400, 0, 200, 400 ; Coordonnées des points du triangle en x, y (il faut faire une boucle donc on revient au premier point du triangle
EndDataSection
Code : Tout sélectionner
#TailleOeil = 12
#TaillePupille = 4
#EspaceOeilPupille = 4
#EspaceEntreYeux = 0
#CentreOeilG = #TailleOeil + #TaillePupille - #EspaceOeilPupille
#CentreOeilD = (#TailleOeil + #TaillePupille - #EspaceOeilPupille) * 3 + #EspaceEntreYeux
#RayonOeil = #TailleOeil - #EspaceOeilPupille
#Cadre = 100
#DistanceMinSouris = 150
#Vitesse = 10
#Avance = 1
Global TailleEcranX.l, TailleEcranY.l, PosX.f, PosY.f, CibleX, CibleY, PosXSave.f, PosYSave.f
TailleEcranX = GetSystemMetrics_(#SM_CXSCREEN)
TailleEcranY = GetSystemMetrics_(#SM_CYSCREEN)
Procedure Yeux()
; Position de la souris
GetCursorPos_(CursorPos.POINT)
MouseX = CursorPos\x
MouseY = CursorPos\y
; Position du centre de l'oeil gauche
Dx.f = MouseX - WindowX() - #CentreOeilG
Dy.f = MouseY - WindowY() - #CentreOeilG
DistanceSouris1.f = Sqr(Pow(Dx, 2) + Pow(Dy, 2))
Dx = Dx / DistanceSouris1
Dy = Dy / DistanceSouris1
Distance.f = DistanceSouris1 / TailleEcranY * 4
If Distance > 1 : Distance = 1 : EndIf
OeilGX = Dx * Distance * #RayonOeil + #CentreOeilG
OeilGY = Dy * Distance * #RayonOeil + #CentreOeilG
; Position du centre de l'oeil droit
Dx.f = MouseX - WindowX() - #CentreOeilD
Dy.f = MouseY - WindowY() - #CentreOeilG
DistanceSouris2.f = Sqr(Pow(Dx, 2) + Pow(Dy, 2))
Dx = Dx / DistanceSouris2
Dy = Dy / DistanceSouris2
Distance = DistanceSouris2 / TailleEcranY * 4
If Distance > 1 : Distance = 1 : EndIf
OeilDX = Dx * Distance * #RayonOeil + #CentreOeilD
OeilDY = Dy * Distance * #RayonOeil + #CentreOeilG
; on dessine les yeux
UseImage(0)
StartDrawing(ImageOutput())
Box(0, 0, 200, 200, $FFFFFF)
Circle(OeilGX, OeilGY, #TaillePupille, 0)
Circle(OeilDX, OeilDY, #TaillePupille, 0)
StopDrawing()
; on affiche la fenêtre
SetGadgetState(0, UseImage(0))
; Déplacement de la fenêtre
If Abs(PosX - CibleX) <= 2 And Abs(PosY - CibleY) <= 2 ; On donne un point à rejoindre
CibleX = Random(TailleEcranX + 2 * #Cadre) - #Cadre
CibleY = Random(TailleEcranY + 2 * #Cadre) - #Cadre
Debug StrF(CibleX, 0) + " " + StrF(CibleY, 0)
EndIf
DistanceSouris.l = (DistanceSouris1 + DistanceSouris2) / 2
; on se déplace vers la cible
Dx = CibleX - PosX
Dy = CibleY - PosY
DistanceCible = Sqr(Pow(Dx, 2) + Pow(Dy, 2))
Dx = Dx / DistanceCible * #Avance
Dy = Dy / DistanceCible * #Avance
PosX + Dx
PosY + Dy
If DistanceSouris < #DistanceMinSouris
; on s'écarte de la souris
Dx = PosX - MouseX
Dy = PosY - MouseY
DistanceCible = Sqr(Pow(Dx, 2) + Pow(Dy, 2))
PosX + Dx / DistanceCible * #Avance
PosY + Dy / DistanceCible * #Avance
EndIf
If Abs(PosX - PosXSave) < 0.02 And Abs(PosY - PosYSave) < 0.02
; si la souris est proche de la cible
Dx = CibleX - PosX
Dy = CibleY - PosY
DistanceCible = Sqr(Pow(Dx, 2) + Pow(Dy, 2))
Dx = Dx / DistanceCible * #Avance
Dy = Dy / DistanceCible * #Avance
PosX + Dx
PosY + Dy
EndIf
PosXSave = PosX
PosYSave = PosY
MoveWindow(PosX - (#TailleOeil + #TaillePupille - #EspaceOeilPupille) * 2 + #EspaceEntreYeux / 2, PosY - (#TailleOeil + #TaillePupille - #EspaceOeilPupille) * 2)
EndProcedure
If OpenWindow(1, 0, 0, 200, 200, #PB_Window_Invisible, "Yeux")
If OpenWindow(0, 0, 0, (#TailleOeil + #TaillePupille - #EspaceOeilPupille) * 4 + #EspaceEntreYeux, (#TailleOeil + #TaillePupille - #EspaceOeilPupille) * 2, #PB_Window_BorderLess | #WS_SYSMENU | #PB_Window_ScreenCentered, "Yeux", WindowID(1))
SetWindowPos_(WindowID(), -1, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE)
; on découpe la fenêtre
RegionOeilG = CreateEllipticRgn_(#CentreOeilG - #TailleOeil, #CentreOeilG - #TailleOeil, #CentreOeilG + #TailleOeil, #CentreOeilG + #TailleOeil)
RegionOeilD = CreateEllipticRgn_(#CentreOeilD - #TailleOeil, #CentreOeilG - #TailleOeil, #CentreOeilD + #TailleOeil, #CentreOeilG + #TailleOeil)
CombineRgn_(RegionOeilG, RegionOeilG, RegionOeilD, #RGN_OR)
SetWindowRgn_(WindowID(), RegionOeilG, #True)
DeleteObject_(RegionOeilG)
DeleteObject_(RegionOeilD)
PosX = WindowX()
PosY = WindowY()
CibleX = PosX
CibleY = PosY
CreateImage(0, WindowWidth(), WindowHeight())
If CreateGadgetList(WindowID())
ImageGadget(0, 0, 0, 0, 0, UseImage(0))
EndIf
Yeux()
Timer = SetTimer_(WindowID(), 0, #Vitesse, @Yeux())
Repeat
Event = WaitWindowEvent()
If Event = #WM_LBUTTONDOWN ; Si on clique sur les yeux, on quitte
Event = #PB_Event_CloseWindow
EndIf
Until Event = #PB_Event_CloseWindow
KillTimer_(WindowID(), Timer)
EndIf
EndIf