Une loupe qui suit la souris

Programmation d'applications complexes
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Si ça t'intéresse, et pas trop compliqué à intégrer, tu pourrais énormément gagner de temps en enregistrant les coordonnées que tu calcules (et les facteurs de couleurs aussi) dans un tableau une seule fois au début de la boucle. Il faut toujours essayer d'utiliser des données précalculées dans les effets temps réel. Tu me diras que ce n'est pas très important...
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

je suis bien d'accord :)

Je n'ai absolument rien optimiser dans ce code.
C'est du brut de fonderie :D

Je vais regarder pour l'optimisation et pour l'effet sans la déformation si je m'ennuie un moment


ARS :
pour la déformation, le calcul est celui-ci
Longueur2.f = 1 / (1 + Zoom * Cos(Longueur / Rayon * (#PI / 4)))
dans la procédure DeplaceLouoe()
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Ok merci en effet je trouve cela plus simple pour des "yeux fatigués" de ne pas utiliser la deform. Je te donnerai le feedback de la madre :P
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Alors voilà la version optimisée et normalement sans lib.

Ça tourne comment chez vous ?

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, EffetLoupe.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.3
#Rafraichissement = 30
#Limite_Lissage = 10

Global MemIcon.l
Structure InfoListeIcon
  TX.l
  TY.l
  Format.l
  Longueur.l
  Position.l
  Autre.l
EndStructure
Global NewList ListeIcon.InfoListeIcon()
Procedure.l ExtractIcon(TailleX) ; Extraire une icone ou la plus proche
  ; Retourne le handle de l'icone si le format spécifié existe
  ; Retourne 0 sinon
  
  Protected id, Format
  
  If MemIcon And (TailleX = 16 Or TailleX = 24 Or TailleX = 32 Or TailleX = 48)
    
    If OSVersion() < #PB_OS_Windows_XP
      Format = 24
    Else
      Format = 32
    EndIf
    
    Repeat
      
      ; MessageRequester("", Str(TailleX) + "    " + Str(Format), 0)
      
      ForEach ListeIcon()
        If ListeIcon()\TX = TailleX And ListeIcon()\TY = TailleX And ListeIcon()\Format = Format
          
          ; On crée l'icone en mémoire
          Mem = AllocateMemory(ListeIcon()\Longueur + 4 + 2 + 2 + 4 + 2 + 4 + 4)
          If Mem
            
            PokeL(Mem, 65536)
            PokeB(Mem + 4, 1)
            PokeB(Mem + 6, ListeIcon()\TX)
            PokeB(Mem + 7, ListeIcon()\TY)
            PokeL(Mem + 8, ListeIcon()\Autre)
            PokeB(Mem + 12, ListeIcon()\Format)
            PokeL(Mem + 14, ListeIcon()\Longueur)
            PokeL(Mem + 18, 22)
            
            CopyMemory(MemIcon + ListeIcon()\Position, Mem + 22, ListeIcon()\Longueur)
            
            id = CatchImage(#PB_Any, Mem)
            
            FreeMemory(Mem)
            
            ProcedureReturn ImageID(id)
            
          EndIf
        EndIf
      Next
      
      Select Format
        Case 32
          Format = 24
        Case 24
          Format = 8
        Case 8
          Select TailleX
            Case 48
              TailleX = 32
            Case 32
              TailleX = 24
            Case 24
              TailleX = 16
            Case 16
              TailleX = 0
          EndSelect
          If OSVersion() < #PB_OS_Windows_XP
            Format = 24
          Else
            Format = 32
          EndIf
      EndSelect
      
    Until TailleX < 16
    
  EndIf
  ProcedureReturn 0
EndProcedure
Procedure.l LoadIconData(Icone.l) ; Charger l'icône à partir d'un IncludeBinary
  Protected NbIcone.l
  
  If MemIcon
    FreeMemory(MemIcon)
    ClearList(ListeIcon())
  EndIf
  
  ClearList(ListeIcon())
  
  NbIcone = PeekB(Icone + 4) & $FF
  
  For n = 0 To NbIcone - 1
    
    AddElement(ListeIcon())
    
    Pos = 6 + 16 * n
    ListeIcon()\TX = PeekB(Icone + Pos) & $FF
    ListeIcon()\TY = PeekB(Icone + Pos + 1) & $FF
    ListeIcon()\Autre = PeekL(Icone + Pos + 2)
    ListeIcon()\Format = PeekB(Icone + Pos + 6) & $FF
    ListeIcon()\Longueur = PeekL(Icone + Pos + 8)
    ListeIcon()\Position = PeekL(Icone + Pos + 12)
    
    If n = NbIcone - 1
      MemIcon = AllocateMemory(ListeIcon()\Position + ListeIcon()\Longueur)
      CopyMemory(Icone, MemIcon, ListeIcon()\Position + ListeIcon()\Longueur)
    EndIf
    
  Next
EndProcedure
Procedure LoadPackIcon(Mem)
  Taille = PeekL(Mem)
  Mem2 = AllocateMemory(Taille)
  If Mem2
    UnpackMemory(Mem + 4, Mem2)
    LoadIconData(Mem2)
    FreeMemory(Mem2)
  EndIf
EndProcedure

Procedure SkinWindow2(WindowID, ImageID) ; Mettre une forme sur une fenêtre a partir d'une image
  Protected bmi.BITMAPINFO, Region_Temp, Region_Totale, Largeur, Hauteur
  
  GetObject_(ImageID, SizeOf(BITMAP), @bm.BITMAP)
  
  bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
  bmi\bmiHeader\biWidth = bm\bmWidth
  bmi\bmiHeader\biHeight = bm\bmHeight
  bmi\bmiHeader\biPlanes = 1
  bmi\bmiHeader\biBitCount = 32
  bmi\bmiHeader\biCompression = #BI_RGB
  
  Region_Totale = CreateRectRgn_(0, 0, bm\bmWidth, bm\bmHeight)
  
  Mem = AllocateMemory(bm\bmWidth * bm\bmHeight * 4)
  If Mem
    
    hdc = CreateCompatibleDC_(GetDC_(ImageID))
    If hdc
      GetDIBits_(hdc, ImageID, 0, bm\bmHeight, Mem, @bmi, #DIB_RGB_COLORS) ; on envoie la liste dans l'image
      DeleteDC_(hdc)
    EndIf
    
    ; On convertit la liste dans le bon format
    Largeur = bm\bmWidth - 1
    Hauteur = bm\bmHeight - 1
    Point = Mem
    For y1 = 0 To Hauteur
      For x1 = 0 To Largeur
        If PeekL(Point) = $FF00FF
          x2 = x1
          While x2 < Largeur And PeekL(Point + 4) = $FF00FF
            x2 + 1
            Point + 4
          Wend
          Region_Temp = CreateRectRgn_(x1, Hauteur - y1, x2 + 1, Hauteur - y1 + 1) ; On retire le point de la region
          CombineRgn_(Region_Totale, Region_Totale, Region_Temp, #RGN_DIFF)
          DeleteObject_(Region_Temp)
          x1 = x2
        EndIf
        Point + 4
      Next
    Next
    
    FreeMemory(Mem)
  EndIf
  
  SetWindowRgn_(WindowID, Region_Totale, 1) ; On applique la region
  DeleteObject_(Region_Totale) ; On efface la region
  
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) ; on rend toute la fenêtre invisible
    
    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) ; on rend visible le cercle qui représente la loupe
        EndIf
        
      Next
    Next
    
  StopDrawing()
  ResizeImage(1, Taille, Taille)
  SkinWindow2(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)
    WritePreferenceLong("EffetLoupe", EffetLoupe)
    ClosePreferences()
  EndIf
EndProcedure
Procedure Charger()
  OpenPreferences("Loupe.ini")
  Rayon = ReadPreferenceLong("Taille", 100)
  Zoom = ReadPreferenceFloat("Zoom", 2)
  EffetLoupe = ReadPreferenceLong("EffetLoupe", 1)
  ClosePreferences()
EndProcedure

ProcedureDLL.l SetImageBits2(ImageID, HList) ; Transfert d'un tableau vers une image
  Protected bmi.BITMAPINFO, hdc.l, Resultat, bm.BITMAP
  
  Resultat = 0
  
  GetObject_(ImageID, SizeOf(BITMAP), @bm.BITMAP)
  
  bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
  bmi\bmiHeader\biWidth = bm\bmWidth
  bmi\bmiHeader\biHeight = bm\bmHeight
  bmi\bmiHeader\biPlanes = 1
  bmi\bmiHeader\biBitCount = 32
  bmi\bmiHeader\biCompression = #BI_RGB
  
  hdc = CreateCompatibleDC_(GetDC_(ImageID))
  If hdc
    SetDIBits_(hdc, ImageID, 0, bm\bmHeight, HList, @bmi, #DIB_RGB_COLORS) ; on envoie la liste dans l'image
    DeleteDC_(hdc)
    Resultat = ImageID
  EndIf
  
  ProcedureReturn Resultat
EndProcedure
ProcedureDLL.l GetImageBits2(ImageID, HList) ; Transfert d'une image vers un tableau
  Protected bmi.BITMAPINFO, hdc.l, Resultat, bm.BITMAP
  
  Resultat = 0
  
  GetObject_(ImageID, SizeOf(BITMAP), @bm.BITMAP)
  
  bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
  bmi\bmiHeader\biWidth = bm\bmWidth
  bmi\bmiHeader\biHeight = bm\bmHeight
  bmi\bmiHeader\biPlanes = 1
  bmi\bmiHeader\biBitCount = 32
  bmi\bmiHeader\biCompression = #BI_RGB
  
  
  hdc = CreateCompatibleDC_(GetDC_(ImageID))
  If hdc
    GetDIBits_(hdc, ImageID, 0, bm\bmHeight, HList, @bmi, #DIB_RGB_COLORS) ; on envoie la liste dans l'image
    DeleteDC_(hdc)
    Resultat = ImageID
  EndIf
  
  ProcedureReturn Resultat
EndProcedure

Structure Structure_Table
  Afficher.l
  x1.l
  y1.l
  x2.l
  y2.l
  Ecart_x1y1.f
  Ecart_x2y1.f
  Ecart_x1y2.f
  Ecart_x2y2.f
EndStructure
Global Dim Calcul.Structure_Table(0, 0)
Procedure PreCalcul()
  Dim Calcul.Structure_Table(Taille, Taille)
  
  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
        Calcul(x, y)\Afficher = 1 ; On affiche le pixel
        
        ; on calcul la distance du point de l'image correspondant à celui de la sphère
        If EffetLoupe ; Si on veut un effet de loupe
          Longueur2.f = 1 / (1 + Zoom * Cos(Longueur / Rayon * (#PI / 6)))
        Else
          Longueur2.f = 1 / (1 + Zoom)
        EndIf
        
        ; Calcul de la position du pixel avec 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
        
        Calcul(x, y)\x1 = PosX_Int
        Calcul(x, y)\y1 = PosY_Int
        Calcul(x, y)\Ecart_x1y1 = PosX_EcartInv * PosY_EcartInv
        Calcul(x, y)\Ecart_x1y2 = PosX_EcartInv * PosY_Ecart
        Calcul(x, y)\Ecart_x2y1 = PosX_Ecart * PosY_EcartInv
        Calcul(x, y)\Ecart_x2y2 = PosX_Ecart * PosY_Ecart
        
        If PosX >= PosX_Int
          If PosY >= PosY_Int ; bas, droite
            Calcul(x, y)\x2 = Calcul(x, y)\x1 + 1
            Calcul(x, y)\y2 = Calcul(x, y)\y1 + 1
          Else ; haut, droite
            Calcul(x, y)\x2 = Calcul(x, y)\x1 + 1
            Calcul(x, y)\y2 = Calcul(x, y)\y1 - 1
          EndIf
        Else
          If PosY >= PosY_Int ; bas, gauche
            Calcul(x, y)\x2 = Calcul(x, y)\x1 - 1
            Calcul(x, y)\y2 = Calcul(x, y)\y1 + 1
          Else ; haut, gauche
            Calcul(x, y)\x2 = Calcul(x, y)\x1 - 1
            Calcul(x, y)\y2 = Calcul(x, y)\y1 - 1
          EndIf
        EndIf
        
      EndIf
      
    Next nn
  Next n
  
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 | $40000000)
  StopDrawing()
  ReleaseDC_(0, DC)
  ; SaveImage(0, "temp.bmp")
  GetImageBits2(ImageID(0), @Image())
  
  ; Dessin du zoom
  If Lissage > 0
    For n = -Rayon To Rayon
      For nn = -Rayon To Rayon
        y = Rayon + nn : x = Rayon + n
        
        If Calcul(x, y)\Afficher ; Si le pixel est situé dans le rayon du cercle moins une bordure
          
          ; Si le FPS est élevé, on travaille avec du lissage
          Couleur_x1y1 = Image(Calcul(x, y)\x1, Calcul(x, y)\y1)
          Couleur_x1y2 = Image(Calcul(x, y)\x1, Calcul(x, y)\y2)
          Couleur_x2y1 = Image(Calcul(x, y)\x2, Calcul(x, y)\y1)
          Couleur_x2y2 = Image(Calcul(x, y)\x2, Calcul(x, y)\y2)
          Rouge = Red(Couleur_x1y1) * Calcul(x, y)\Ecart_x1y1 + Red(Couleur_x2y1) * Calcul(x, y)\Ecart_x2y1 + Red(Couleur_x1y2) * Calcul(x, y)\Ecart_x1y2 + Red(Couleur_x2y2) * Calcul(x, y)\Ecart_x2y2
          Vert = Green(Couleur_x1y1) * Calcul(x, y)\Ecart_x1y1 + Green(Couleur_x2y1) * Calcul(x, y)\Ecart_x2y1 + Green(Couleur_x1y2) * Calcul(x, y)\Ecart_x1y2 + Green(Couleur_x2y2) * Calcul(x, y)\Ecart_x2y2
          Bleu = Blue(Couleur_x1y1) * Calcul(x, y)\Ecart_x1y1 + Blue(Couleur_x2y1) * Calcul(x, y)\Ecart_x2y1 + Blue(Couleur_x1y2) * Calcul(x, y)\Ecart_x1y2 + Blue(Couleur_x2y2) * Calcul(x, y)\Ecart_x2y2
          Image2(x, y) = RGB(Rouge, Vert, Bleu)
          
        EndIf
        
      Next nn
    Next n
  Else
    For n = -Rayon To Rayon
      For nn = -Rayon To Rayon
        y = Rayon + nn : x = Rayon + n
        
        If Calcul(x, y)\Afficher ; Si le pixel est situé dans le rayon du cercle moins une bordure
          
          ; Si le FPS passe en dessous de la limite, on utilise la version sans lissage
          Image2(x, y) = Image(Calcul(x, y)\x1, Calcul(x, y)\y1)
          
        EndIf
        
      Next nn
    Next n
  EndIf
  
  SetImageBits2(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)
        ; DrawText(Rayon, Rayon, Str(Temps)) ; Vitesse du code
      StopDrawing()
    EndIf
    Lissage = -250 / #Rafraichissement
  Else
    StartDrawing(WindowOutput(0))
      DrawImage(ImageID(1), 0, 0)
      ; DrawText(Rayon, Rayon, Str(Temps)) ; Vitesse du code
    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 = ExtractIcon(16)

If AddSysTrayIcon(0, WindowID(0), IconeLoupe) = 0
  End
EndIf

SysTrayIconToolTip(0, "Loupe")

If CreatePopupMenu(0)
  OpenSubMenu("Taille")
    For n = 50 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 = 125 To 300 Step 25
      MenuItem(2000 + n, "x" + StrF(n / 100, 2))
      If Zoom = n / 100
        SetMenuItemState(0, 2000 + n, 1)
      EndIf
    Next
    MenuBar()
    MenuItem(1, "Effet loupe")
    SetMenuItemState(0, 1, EffetLoupe)
  CloseSubMenu()
  MenuBar()
  MenuItem(0, "Quitter")
Else
  End
EndIf

PreCalcul()
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
        Case 1
          EffetLoupe = 1 - EffetLoupe
          SetMenuItemState(0, 1, EffetLoupe)
          PreCalcul()
        Default
          If EventMenu() > 2000
            SetMenuItemState(0, 2000 + Zoom * 100, 0)
            Zoom = (EventMenu() - 2000) / 100
            SetMenuItemState(0, 2000 + Zoom * 100, 1)
            PreCalcul()
          ElseIf EventMenu() > 1000
            SetMenuItemState(0, 1000 + Rayon, 0)
            Rayon = EventMenu() - 1000
            SetMenuItemState(0, 1000 + Rayon, 1)
            Dimension()
            PreCalcul()
          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 $000007F6, $07F6434A, $C4C90000, $2301DD0E, $23102091, $51822302, $1A122404, $610A3688, $110C600C, $CA114084, $40457028, $06A00046
    Data.l $A3F48A00, $28FA40C8, $8D201102, $56005390, $258DC6CA, $D2691269, $2D03D2E6, $633F5C7E, $08122502, $04833120, $45A23230, $559AC209
    Data.l $E86C10CC, $C3D893FD, $688C580C, $55B268D1, $73F2319A, $0D1644B2, $ACC053EB, $C74760C5, $DB3D6622, $389982C0, $D576F27F, $0366E8EE
    Data.l $CB183078, $A5523238, $36EA2B4C, $E9C43D76, $A6B38B94, $4B00A51D, $693C1976, $9B028BD3, $AC5B711D, $6BEDB6D9, $A2D7DD4E, $2E35D2DB
    Data.l $FEA09AC0, $2DB640A2, $3B0966DD, $95D19CD6, $167AB2CE, $43B9E2EF, $C0CDAD15, $A814492F, $5158A1D0, $89169A29, $74E79881, $4387015D
    Data.l $C103FFC0, $01430743, $7F8143F1, $1025F89F, $22E387FE, $174C4930, $5A168D1B, $854B7137, $7C04E1A1, $31773895, $E0236489, $09424223
    Data.l $53584442, $885060C0, $7FE307AC, $848729C8, $992B487F, $C849B096, $59C84252, $E4112835, $0CD61332, $68D2A072, $B320B908, $0123AB8A
    Data.l $3298269C, $15845AC4, $340A943F, $779C3FF2, $AE48B91C, $B66E8F35, $F0E918CE, $0E7EDF75, $59C92ED7, $E4A95ED8, $07514322, $4F78B842
    Data.l $F6E86885, $9D3D0247, $5FF75D5C, $37F78B36, $B47927CD, $8B676B82, $75B77517, $97127743, $2DE6F5B3, $29905E3D, $CBA1DCE5, $281A7298
    Data.l $00480D8A, $C67DE9FF, $146FA380, $B2FDCAF3, $0B478188, $7EB47678, $87B5CF5F, $A0D2F9C4, $C6889FB9, $94AD1396, $472F8C18, $97E6451D
    Data.l $CCD08CFB, $EFB177FF, $BB9CDBCA, $F024D6A2, $ECD62D9B, $AE632225, $20D2DF2D, $74731964, $399E8640, $943038C6, $BA7B71DC, $1E607FF2
    Data.l $B89BB95E, $6E874837, $74BA47F7, $1E427343, $6407B9AC, $98942B0C, $F3CC495C, $B573D5CD, $FFFAE701, $F15E84C6, $E877FB2B, $B7B98E96
    Data.l $945F758A, $D5A0CA65, $33892093, $8B9EFF20, $CF13B12B, $91B907A5, $DA39ACE7, $23D173CC, $9942E86E, $B6427895, $00496A02, $2631BD2B
    Data.l $62F0ABC0, $8A80E023, $8A6A1983, $706024C0, $80A4EF60, $00112180, $FC45063E, $8F34FC25, $22002029, $00006B11
    Data.b $00, $00
EndDataSection
Dernière modification par Le Soldat Inconnu le mar. 05/mai/2009 20:29, modifié 4 fois.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Ce dernier code me prend 13 en proce et 7.2mo de mémoire.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Je n'ai pas regardé si c'était "vraiment" optimisé, mais en tous cas c'est un superbe programme! Bravo!!!
Un petit bémol pour les contours (quoique fins, c'est pratique). Diffuse le largement, afin d'avoir des retours et le faire évoluer.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

j'ai encore trouvé quelque petit truc, ça devrait être encore plus rapide (test de vitesse sans debugger, ça bouffe beaucoup sur ce type de programme)

chez moi, ça n'utilise pas du tout le processeur, même en grande taille :)

il ne manque que la souris dans la loupe. mais la, je vois pas trop comment faire. hormis une image de souris basique.
ça ne suivra pas l'état de la souris (sablier, sélecteur de texte, souris avec forme perso, etc ... )
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Non, franchement c'est propre; tu peux à la rigueur enlever la condition if lissage>0 de l'intérieur des boucles. Même si ça t'oblige à doubler le code des boucles (ou à en faire une procédure ou une subroutine), au mieux tu enlèves 90000 (300*300) conditions, ce qui n'est pas négligeable.
Après on pourrait optimiser avec de l'assembleur et tout ça, par ex pour virer les multiplications, mais franchement ton code y perdrait en lisibilité et en portabilité, ce serait dommage.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

j'ai une icône plus zoli (voir code plus haut) et j'ai mis un exe sur mon site :)

Djes :
j'ai ajouté la modification du If, je n'y avait pas pensé, merci
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Message par kernadec »

bonjour

joli briquet !!!
Répondre