Une petite loupe ronde qui suis la souris
Vous avez besoin des librairie "Effect", "IconEx" et "SkinWindow" (que j'avais zappé) que vous trouverez sur mon site
La version sans lib est plus bas, pour ceux qui veulent pas s'embêter a utiliser mes MAGNIFIQUES lib



Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 4.0
;
; Explication du programme :
; Fait un effet de loupe sur votre écran (comme ci une sphèse se déplace au dessus en déformant l'image)
Global Zoom.f, x.l, y.l, x.l, y.l, Rayon.l, Taille.l, Lissage.l
Global Souris_x, Souris_y, Souris_x_mem, Souris_y_mem
Global Ecran_Largeur, Ecran_Hauteur
Global Dim Image(0, 0)
Global Dim Image2(0, 0)
#Decalage_Fenetre = 0.45
#Rafraichissement = 25
#Limite_Lissage = 10
Procedure LoadPackIcon(Mem)
Taille = PeekL(Mem)
Mem2 = AllocateMemory(Taille)
If Mem2
UnpackMemory(Mem + 4, Mem2)
IconEx_LoadIconData(Mem2)
FreeMemory(Mem2)
EndIf
EndProcedure
Procedure Dimension()
Taille = 2 * Rayon + 1
ResizeWindow(0, #PB_Ignore, #PB_Ignore, Taille, Taille)
ResizeImage(0, Taille, Taille)
StartDrawing(ImageOutput(0))
Box(0, 0, Taille, Taille, $FF00FF)
For n = -Rayon To Rayon
For nn = -Rayon To Rayon
y = Rayon + nn : x = Rayon + n
Longueur.f = Sqr(n * n + nn * nn) ; On calcul la distance d'un point de la sphère à partir du centre
If Longueur < Rayon ; And Longueur > 1
Plot(x, y, 0)
EndIf
Next
Next
StopDrawing()
ResizeImage(1, Taille, Taille)
SkinWindow(WindowID(0), ImageID(0))
Dim Image(Taille - 1, Taille - 1)
Dim Image2(Taille - 1, Taille - 1)
Lissage = 1
EndProcedure
Procedure Sauver()
If CreatePreferences("Loupe.ini")
WritePreferenceLong("Taille", Rayon)
WritePreferenceFloat("Zoom", Zoom)
ClosePreferences()
EndIf
EndProcedure
Procedure Charger()
OpenPreferences("Loupe.ini")
Rayon = ReadPreferenceLong("Taille", 100)
Zoom = ReadPreferenceFloat("Zoom", 2)
ClosePreferences()
EndProcedure
Procedure DeplaceLoupe()
Souris_x = DesktopMouseX()
Souris_y = DesktopMouseY()
; If Souris_x <> Souris_x_mem Or Souris_y <> Souris_y_mem Or Lissage = 1 ; Si la souris a bougé ou si on réactive le lissage
; Souris_x_mem = Souris_x
; Souris_y_mem = Souris_y
; Position de la fenêtre
Fenetre_x = Souris_x + Rayon * #Decalage_Fenetre
Fenetre_y = Souris_y + Rayon * #Decalage_Fenetre
If Fenetre_x + Taille >= Ecran_Largeur
Fenetre_x = Souris_x - Rayon * #Decalage_Fenetre - Taille
EndIf
If Fenetre_y + Taille >= Ecran_Hauteur
Fenetre_y = Souris_y - Rayon * #Decalage_Fenetre - Taille
EndIf
; Fenetre_x = Souris_x - Rayon
; Fenetre_y = Souris_y - Rayon
ResizeWindow(0, Fenetre_x, Fenetre_y, #PB_Ignore, #PB_Ignore)
Temps = ElapsedMilliseconds()
; On copie l'écran
DC = GetDC_(0)
Dessin = StartDrawing(ImageOutput(0))
Box(0, 0, Taille, Taille, 0)
BitBlt_(Dessin, 0, 0, Taille, Taille, DC, Souris_x - Rayon, Souris_y - Rayon, #SRCPAINT)
StopDrawing()
ReleaseDC_(0, DC)
; SaveImage(0, "temp.bmp")
GetImageBits(ImageID(0), @Image())
; Dessin du zoom
For n = -Rayon To Rayon
For nn = -Rayon To Rayon
y = Rayon + nn : x = Rayon + n
Longueur.f = Sqr(n * n + nn * nn) ; On calcul la distance d'un point de la sphère à partir du centre
If Longueur < Rayon - 1 ; Si le pixel est situé dans le rayon du cercle moins une bordure
; on calcul la distance du point de l'image correspondant à celui de la sphère
Longueur2.f = 1 / (1 + Zoom * Cos(Longueur / Rayon * (#PI / 4)))
If Lissage > 0
; Si le FPS est élevé, on travaille avec du lissage
PosX.f = Rayon + n * Longueur2
PosY.f = Rayon + nn * Longueur2
PosX_Int.l = PosX
PosY_Int.l = PosY
PosX_Ecart.f = Abs(PosX - PosX_Int)
PosY_Ecart.f = Abs(PosY - PosY_Int)
PosX_EcartInv.f = 1 - PosX_Ecart
PosY_EcartInv.f = 1 - PosY_Ecart
If PosX >= PosX_Int
If PosY >= PosY_Int ; bas, droite
Rouge = Red(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Red(Image(PosX_Int + 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Red(Image(PosX_Int, PosY_Int + 1)) * PosX_EcartInv * PosY_Ecart + Red(Image(PosX_Int + 1, PosY_Int + 1)) * PosX_Ecart * PosY_Ecart
Vert = Green(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Green(Image(PosX_Int + 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Green(Image(PosX_Int, PosY_Int + 1)) * PosX_EcartInv * PosY_Ecart + Green(Image(PosX_Int + 1, PosY_Int + 1)) * PosX_Ecart * PosY_Ecart
Bleu = Blue(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Blue(Image(PosX_Int + 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Blue(Image(PosX_Int, PosY_Int + 1)) * PosX_EcartInv * PosY_Ecart + Blue(Image(PosX_Int + 1, PosY_Int + 1)) * PosX_Ecart * PosY_Ecart
Else ; haut, droite
Rouge = Red(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Red(Image(PosX_Int + 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Red(Image(PosX_Int, PosY_Int - 1)) * PosX_EcartInv * PosY_Ecart + Red(Image(PosX_Int + 1, PosY_Int - 1)) * PosX_Ecart * PosY_Ecart
Vert = Green(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Green(Image(PosX_Int + 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Green(Image(PosX_Int, PosY_Int - 1)) * PosX_EcartInv * PosY_Ecart + Green(Image(PosX_Int + 1, PosY_Int - 1)) * PosX_Ecart * PosY_Ecart
Bleu = Blue(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Blue(Image(PosX_Int + 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Blue(Image(PosX_Int, PosY_Int - 1)) * PosX_EcartInv * PosY_Ecart + Blue(Image(PosX_Int + 1, PosY_Int - 1)) * PosX_Ecart * PosY_Ecart
EndIf
Else
If PosY >= PosY_Int ; bas, gauche
Rouge = Red(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Red(Image(PosX_Int - 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Red(Image(PosX_Int, PosY_Int + 1)) * PosX_EcartInv * PosY_Ecart + Red(Image(PosX_Int - 1, PosY_Int + 1)) * PosX_Ecart * PosY_Ecart
Vert = Green(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Green(Image(PosX_Int - 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Green(Image(PosX_Int, PosY_Int + 1)) * PosX_EcartInv * PosY_Ecart + Green(Image(PosX_Int - 1, PosY_Int + 1)) * PosX_Ecart * PosY_Ecart
Bleu = Blue(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Blue(Image(PosX_Int - 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Blue(Image(PosX_Int, PosY_Int + 1)) * PosX_EcartInv * PosY_Ecart + Blue(Image(PosX_Int - 1, PosY_Int + 1)) * PosX_Ecart * PosY_Ecart
Else ; haut, gauche
Rouge = Red(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Red(Image(PosX_Int - 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Red(Image(PosX_Int, PosY_Int - 1)) * PosX_EcartInv * PosY_Ecart + Red(Image(PosX_Int - 1, PosY_Int - 1)) * PosX_Ecart * PosY_Ecart
Vert = Green(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Green(Image(PosX_Int - 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Green(Image(PosX_Int, PosY_Int - 1)) * PosX_EcartInv * PosY_Ecart + Green(Image(PosX_Int - 1, PosY_Int - 1)) * PosX_Ecart * PosY_Ecart
Bleu = Blue(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Blue(Image(PosX_Int - 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Blue(Image(PosX_Int, PosY_Int - 1)) * PosX_EcartInv * PosY_Ecart + Blue(Image(PosX_Int - 1, PosY_Int - 1)) * PosX_Ecart * PosY_Ecart
EndIf
EndIf
Couleur = RGB(Rouge, Vert, Bleu)
Else
; Si le FPS passe en dessous de 10, on utilise la version sans lissage
Couleur = Image(Int(Rayon + n * Longueur2), Int(Rayon + nn * Longueur2))
EndIf
; On affiche le pixel
Image2(x, y) = Couleur
EndIf
Next nn
Next n
SetImageBits(ImageID(1), @Image2())
; FPS analyse
Temps = ElapsedMilliseconds() - Temps
If Temps > #Rafraichissement ; Si le temps de calcul est trop long, on désactive le lissage pour 250 ms
If Lissage < 0
StartDrawing(WindowOutput(0))
DrawImage(ImageID(1), 0, 0)
StopDrawing()
EndIf
Lissage = - 250 / #Rafraichissement
Else
StartDrawing(WindowOutput(0))
DrawImage(ImageID(1), 0, 0)
StopDrawing()
EndIf
; EndIf
If Lissage < 2 ; On décompte avant de réactiver le lissage si il a été désactivé
Lissage + 1
EndIf
EndProcedure
Procedure SetWinTransparency(WinHandle.l, Transparency_Level.l)
If OpenLibrary(0, "user32.dll")
CallFunction(0, "SetLayeredWindowAttributes", WinHandle, 0, Transparency_Level, 2)
CloseLibrary(0)
EndIf
EndProcedure
Charger()
; On récupère la taille de l'écran
If ExamineDesktops()
Ecran_Largeur = DesktopWidth(0)
Ecran_Hauteur = DesktopHeight(0)
Else
End
EndIf
; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 100, 100, "Loupe", #PB_Window_BorderLess | #PB_Window_Invisible) = 0 Or CreateGadgetList(WindowID(0)) = 0
End
EndIf
SetWindowLong_(WindowID(0), #GWL_EXSTYLE, GetWindowLong_(WindowID(0), #GWL_EXSTYLE) | #WS_EX_TOOLWINDOW | $00080000) ; choix de la barre d'outil réduite
StickyWindow(0, 1)
SetWinTransparency(WindowID(0), 255)
CreateImage(0, 100, 100)
CreateImage(1, 100, 100)
LoadPackIcon(?IconeLoupe)
IconeLoupe = IconEx_ExtractIcon(16)
If AddSysTrayIcon(0, WindowID(0), IconeLoupe) = 0
End
EndIf
SysTrayIconToolTip(0, "Loupe")
If CreatePopupMenu(0)
OpenSubMenu("Taille")
For n = 60 To 150 Step 10
MenuItem(1000 + n, Str(n * 2) + " pixels")
If n = Rayon
SetMenuItemState(0, 1000 + n, 1)
EndIf
Next
CloseSubMenu()
OpenSubMenu("Zoom")
For n = 150 To 400 Step 25
MenuItem(2000 + n, "x" + StrF(n / 100, 2))
If Zoom = n / 100
SetMenuItemState(0, 2000 + n, 1)
EndIf
Next
CloseSubMenu()
MenuBar()
MenuItem(0, "Quitter")
Else
End
EndIf
Dimension()
DeplaceLoupe()
HideWindow(0, 0)
SetTimer_(WindowID(0), 1, #Rafraichissement, 0)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Menu
Select EventMenu() ; Menus
Case 0
Event = #PB_Event_CloseWindow
Default
If EventMenu() > 2000
SetMenuItemState(0, 2000 + Zoom * 100, 0)
Zoom = (EventMenu() - 2000) / 100
SetMenuItemState(0, 2000 + Zoom * 100, 1)
Dimension()
ElseIf EventMenu() > 1000
SetMenuItemState(0, 1000 + Rayon, 0)
Rayon = EventMenu() - 1000
SetMenuItemState(0, 1000 + Rayon, 1)
Dimension()
EndIf
EndSelect
Case #PB_Event_SysTray
Select EventType() ; Si clic sur icone systray
Case #PB_EventType_LeftClick
DisplayPopupMenu(0, WindowID(0))
Case #PB_EventType_RightClick
DisplayPopupMenu(0, WindowID(0))
EndSelect
Case #WM_TIMER ; on rafraichit l'affichage
Timer = EventwParam()
Select Timer
Case 1
; Affichage
DeplaceLoupe()
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
KillTimer_(WindowID(0), 1)
Sauver()
End
DataSection
IconeLoupe :
Data.l $000009F6,$09F6434A,$FABC0000,$2301AA42,$23102091,$50822302,$2A122404,$610A3688,$110C600C,$CA114084,$40457028,$06A00046
Data.l $8EDD8A00,$223D1A22,$788FCE29,$8E232D8E,$01073B51,$A023E0DC,$423D7367,$E88F8C00,$DD238DE6,$FA00C7CB,$CD43FFFD,$43E743F1
Data.l $F5E7DDBC,$EE72C623,$3EFEE908,$100078A2,$3EFED708,$9BF41004,$C43CA43D,$3E1B3BFA,$3E967B04,$42ECD23F,$381BA08E,$FB074850
Data.l $AE0E6040,$3E218FCB,$0E1F3B94,$2E2043F5,$06DFCF1D,$23E5388A,$81872981,$9824DFE9,$42489287,$244B7DE3,$3D843449,$123CB602
Data.l $4C8D3F9D,$02C3CD66,$43BBB001,$1EB07BA3,$4BD8AA06,$2EC8089F,$B324979D,$083C486C,$98D86AE0,$93621BDD,$8C0E8D0F,$11FB87E7
Data.l $1C0C3FB0,$1E2EA5DA,$C039F36E,$F2E07126,$A00423A3,$687B028F,$F7617F0D,$578B41C2,$C1CF2447,$85C5C437,$D107D4B4,$7A1E43FB
Data.l $1CFE1EE3,$0C5DFF01,$1DE615AA,$A161D491,$21C76B0C,$706DB0CB,$A174D728,$D0803480,$1204B911,$7CA9211B,$A4AA51FD,$0F6A4B26
Data.l $9D4F7066,$66B06536,$2D1AA854,$945264EA,$B6118F48,$FA046954,$41A1A7D3,$74497E53,$CDA64428,$CCA26021,$9DCFF389,$5469633A
Data.l $5D1D27B3,$26336C8E,$D13297CC,$9249299C,$79444523,$2B6364D2,$198DA655,$91D80231,$412146E3,$030FF47E,$62516502,$562D8844
Data.l $0A0F38A4,$C2A11767,$6C390884,$80C070C8,$482CA416,$9767A070,$046F19B2,$0FC4AFC6,$840DE43D,$3A031D0F,$47D80F02,$1A369049
Data.l $0453D315,$65612E99,$948C25DD,$E4A52A56,$51508B65,$B1E62922,$8D2B1182,$44B2F421,$12C2C258,$4A4AC965,$8F17A55B,$4AED941D
Data.l $5B5DA0C9,$FBF5F4A2,$3FE9BE4A,$0CFF544C,$53A71502,$C744EED9,$A644F701,$F45F0236,$B87588A2,$0D37537C,$9028FE3D,$3B60F552
Data.l $03CF9144,$AE3A23DC,$F5047F80,$046BE56C,$C4538E84,$EEEF4D99,$F3F44D25,$F0DEC9FA,$DF886179,$C25E8087,$0900812E,$405684BF
Data.l $25DB22B0,$1008B53D,$034E0ADC,$21C9C9D9,$0A244673,$7CBD565C,$FB4B5126,$80368023,$3415EE90,$C4749983,$0233B926,$8AD856C0
Data.l $8909EA21,$08F98010,$F3A52EB0,$AD905912,$0A50D926,$FD321564,$72878ADB,$9735679B,$4477BF78,$E7442EBB,$9932610F,$D2644035
Data.l $69B3AD81,$C94054E7,$12283C35,$67E7A245,$867D9344,$D9E38EA0,$35329B50,$C81AAF5F,$24AC3A38,$87FC6F71,$FEA64B9F,$07BF01FE
Data.l $C7B0B784,$973FAC43,$CA415151,$879D02B6,$05D32DBA,$C5E80D53,$0FFA798E,$28915797,$24574512,$B775448A,$83A5517A,$05FB98F2
Data.l $2572035A,$F1BE5576,$83FEE3E8,$AEAB15EB,$D2DE915E,$25B02DF2,$01DDAEB9,$39E617C6,$2C08678C,$2AC50D20,$0081F9F0,$00008069
Data.b $20,$12
EndDataSection