petit bug génant - flick et clignotement

Programmation d'applications complexes
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Chris a écrit :Lance ton code, et bouge la fenêtre pendant quelques secondes!
J'ai pas compris ce que je devais voir d'anormal :-?
Crystal Noir a écrit :disons que j'arrive plus ou moins à piger mais je trouve nulle part le #VM_Timer dans la doc.
Télécharge win32.hlp et met le dans le répertoire HELP de purebasic
en faisant F1 sur les fonctions de l'api tu auras la description ^^
ca a tout changé pour moi quand je l'ai découvert :D
(y'a pas tres longtemps lol...)

Dri
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Dr. Dri a écrit :
Chris a écrit :Lance ton code, et bouge la fenêtre pendant quelques secondes!
J'ai pas compris ce que je devais voir d'anormal :-?
Dri
L'affichage de l'heure n'est pas rafraîchi tant que tu bouges la fenêtre.
Il reste bloqué, et il se remet en route quand tu la lâches
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

J'ai la même chose avec ton code :-?

Dri
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Moi je ne gère pas ça avec une CallBack, ni dans la boucle d'évènements

Code : Tout sélectionner

Procedure maj()
  SetGadgetText(10, "Il est :" + FormatDate("%hh : %ii : %ss", Date())) 
EndProcedure 

OpenWindow(0,0,0,322,220,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"PanelGadget")
CreateGadgetList(WindowID(0)) 
PanelGadget     (0,8,8,306,203) 
AddGadgetItem (0,-1,"Panel 1") 
PanelGadget (1,5,5,290,166) 
AddGadgetItem(1,-1,"Sub-Panel 1") 
TextGadget(10, 20, 10, 270, 20, "Il est :" + FormatDate("%hh : %ii : %ss", Date())) 
AddGadgetItem(1,-1,"Sub-Panel 2") 
AddGadgetItem(1,-1,"Sub-Panel 3") 
CloseGadgetList() 
AddGadgetItem (0,-1,"Panel 2") 
ButtonGadget(2, 10, 15, 80, 24,"Button 1") 
ButtonGadget(3, 95, 15, 80, 24,"Button 2") 
CloseGadgetList() 

SetTimer_(WindowID(),1,1000,@maj())

Repeat 
Until WaitWindowEvent()=#PB_Event_CloseWindow 
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Dr. Dri a écrit :J'ai la même chose avec ton code :-?

Dri
Pas moi! 8O
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

peut etre que c'est parce que je suis sous ce bon vieux 98 lol

Dri
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

oui alors je comprend mieux, cependant pour la fonction des coord de la souris je ne peux pas utiliser cette fonction, car tout simplement dans l'application ca marche niquel en revanche quand je sors de la fenetre de l'applis en passant la souris sur le bureau, ca ralentit grave et ca devient plus du tout précis au niveau des coord x et y de la souris alors que sans le timer ca fait cliper la valeur mais c niquel dehors et dans l'application....j'ai essayé de réduire 100 à 10 mais ca donne rien au niveau du timer.

donc avec timer c niquel pour l'horloge, en revanche pour gérer la position temps reel de la souris dans l'app c niquel en dehors ca ramos :( donc pour les coord x et y je l'ai laissé comme avant, ca fait cliper la ligne mais bon...à moins qu'il faille faire autre chose.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Y'a pas un évennement "mouse move" que tu pourrais intercepter pour mettre à jour ces valeurs ?
faut chercher ou demander aux pros de windows (nico, Denis etc ^^)

Dri
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

c'est vrai je n'y ai pas pensé moi j'utilise l'api windows mais cela dit c pas grave car avec vos astuces c'est tout à fait impécable meme si les coord ne sont pas comme je voudrais ca suffit et ca ne gène pas à l'utilisation après avoir fait testé à des potes :) niquel :)

Merci à tous car comme on me l'a fait remarqué de toute facon quand on veut avoir des coord souris on arrête de la bouger à l'endroit où ca nous interesse ^^
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Essaye ça!

Code : Tout sélectionner

;/Constantes Window
Enumeration
  #Window_0
EndEnumeration

;/Constantes Gadget
Enumeration
  #Btn_Quit
EndEnumeration

If OpenWindow(#Window_0, 300, 300, 300, 200, #PB_Window_SystemMenu, "Fenêtre 1",0)
  If CreateGadgetList(WindowID(#Window_0))
    TextGadget(10, 10, 10, 280, 20, "")
    ButtonGadget(#Btn_Quit, 100, 170, 100, 25, "Quitter")
  EndIf
  
  Repeat
    event = WindowEvent()
    If event
      Select event
        Case #PB_EventGadget
          Select EventGadgetID()
            
            Case #Btn_Quit : quit = 1
          EndSelect
          
        Case #PB_EventCloseWindow : quit = 1
      EndSelect
    Else
      GetCursorPos_(CurPos.POINT) ; Position du curseur
      SetGadgetText(10, Str(CurPos\x)+ ":"+Str(CurPos\y))
      Delay(1)
    EndIf
  Until quit = 1
  End
EndIf
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Sinon, tu peux aussi récupérer les coordonnées dans la callback du timer. (premier code que je t'ai donné).
Il faut juste ajouter un timer (parce que celui à 1 seconde, c'est trop long) que tu mets à 1 ms, et ça fonctionne.

Code : Tout sélectionner

Procedure TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l) 
  Select uMsg 
    Case #WM_TIMER 
      Select idEvent 
        Case 1 ; Timer n° 1
          SetGadgetText(10, FormatDate("%hh : %ii : %ss", Date())) 
          
        Case 2 ; Timer n° 2
          GetCursorPos_(CurPos.POINT) ; Position du curseur 
          SetGadgetText(11, Str(CurPos\x)+ ":"+Str(CurPos\y)) 
          
      EndSelect 
  EndSelect 
EndProcedure 

If OpenWindow(0,0,0,322,220,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"PanelGadget") And CreateGadgetList(WindowID(0)) 
  PanelGadget     (0,8,8,306,203) 
  AddGadgetItem (0,-1,"Panel 1") 
  PanelGadget (1,5,5,290,166) 
  AddGadgetItem(1,-1,"Sub-Panel 1") 
  TextGadget(10, 20, 10, 270, 20, "Il est ")
  TextGadget(11, 20, 40, 270, 20, "")
  AddGadgetItem(1,-1,"Sub-Panel 2") 
  AddGadgetItem(1,-1,"Sub-Panel 3") 
  CloseGadgetList() 
  AddGadgetItem (0,-1,"Panel 2") 
  ButtonGadget(2, 10, 15, 80, 24,"Button 1") 
  ButtonGadget(3, 95, 15, 80, 24,"Button 2") 
  CloseGadgetList() 
  
  SetTimer_(WindowID(), 1, 1000, @TimerProc()) ; Timer n° 1 pour les secondes
  SetTimer_(WindowID(), 2, 1, @TimerProc())    ; Timer n° 2 pour les coordonnées
  
  Repeat 
    
  Until WaitWindowEvent()=#PB_Event_CloseWindow 
EndIf 
End
Bon, ça fait un peu gadget, mais tant que ça marche correctement!
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Je ne trouve pas que ça fasse gadget Chris, ton code fonctionne à merveille!

Avec deux variables en plus pour mémoriser les coordonnées et éviter un ré-affichage inutile, c'est encore mieux.

Le deuxième timer est à 20 au lieu de 1ms parce que l'oeil humain n'est pas si performant. :)

Code : Tout sélectionner

Procedure TimerProc(hwnd.l, umsg.l, idevent.l, dwtime.l) 
     Static mem_x,mem_y
     Select umsg 
          Case #WM_TIMER 
               Select idevent 
                    Case 1 ; Timer n° 1 
                         SetGadgetText(10, FormatDate("%hh : %ii : %ss", Date())) 
                         
                    Case 2 ; Timer n° 2 
                         GetCursorPos_(CurPos.POINT) ; Position du curseur
                         If mem_x<>CurPos\x And mem_y<>CurPos\y
                              SetGadgetText(11, Str(CurPos\x)+ ":"+Str(CurPos\y)) 
                         EndIf 
                         mem_x=CurPos\x:mem_y=CurPos\y
               EndSelect 
     EndSelect 
EndProcedure 

If OpenWindow(0,0,0,322,220,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"PanelGadget") And CreateGadgetList(WindowID(0)) 
     PanelGadget     (0,8,8,306,203) 
     AddGadgetItem (0,-1,"Panel 1") 
     PanelGadget (1,5,5,290,166) 
     AddGadgetItem(1,-1,"Sub-Panel 1") 
     TextGadget(10, 20, 10, 270, 20, "Il est ") 
     TextGadget(11, 20, 40, 270, 20, "") 
     AddGadgetItem(1,-1,"Sub-Panel 2") 
     AddGadgetItem(1,-1,"Sub-Panel 3") 
     CloseGadgetList() 
     AddGadgetItem (0,-1,"Panel 2") 
     ButtonGadget(2, 10, 15, 80, 24,"Button 1") 
     ButtonGadget(3, 95, 15, 80, 24,"Button 2") 
     CloseGadgetList() 
     
     SetTimer_(WindowID(), 1, 1000, @TimerProc()) ; Timer n° 1 pour les secondes 
     SetTimer_(WindowID(), 2, 20, @TimerProc())    ; Timer n° 2 pour les coordonnées 
     
     Repeat 
          
     Until WaitWindowEvent()=#PB_Event_CloseWindow 
EndIf 
End
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

nico a écrit :Le deuxième timer est à 20 au lieu de 1ms parce que l'oeil humain n'est pas si performant. :)
Moi, j'ai un oeil bionique :lol:

C'est bon, avec les variables. Par contre, il vaut mieux mettre OR à la place de AND parce que avec AND, si par exemple tu descend ton pointeur de souris en restant dans la même colonne de pixels, (peu probable, mais bon...), tes coordonnées X et Y ne seront pas mises à jour.
(Et idem si tu restes sur une même ligne de pixels, évidemment)
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

merci à tous :) ca permet d'améliorer mon soft ;)

le soft avance bien il y a pour le moment :

- onglet système qui récupère différentes infos
- onglet mémoire pour savoir où on en est ^^
- onglet batterie pour ceux qui ont des portables
- onglet affichage pour savoir le paramétrage et le changer facilement au besoin
- onglet processus pour tuer un process rapidement

Je prévois pas mal de petit raccourcis supplémentaires comme ca, pour accéder rapidement ou faire les choses rapidement. Le logiciel se loge dans la barre de tâche.

Le soft se met à jour automatiquement par internet au lancement à votre demande :)

vala :)

Au fait une question : il n'est pas possible d'utiliser le bouton windows par défaut " - " pour minimiser dans la barre de tâche ? car on peut tester si on ferme la fenetre avec la croix mais j'ai jamais trouvé pour tester si c'est "minimize" qui est cliqué. Du coup j'ai été obligé de créer mes propres boutons minimiser et fermer.....

merci d'avance.
AWEAR
Messages : 264
Inscription : ven. 28/oct./2005 8:20
Localisation : Mayotte ( 976 ), Océan Indien, France

Message par AWEAR »

Il faut pour cela utiliser une callback :

Code : Tout sélectionner

Procedure minimize(WindowID, Message, wParam, lParam)
  If Message = 274 And wparam = 61472
; ton code ici
  ProcedureReturn #PB_ProcessPureBasicEvents ; si tu veux uniquement savoir quand l'évenement a lieu
 ; procedurreturn 0 a la place si tu veux intecepter l'évenement
  EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

setwindowcallback(@minimize())
La vie est une rose dont il faut accepter les épines, mais la mienne est fannée, arrosée par le goût de mes larmes. (Soprano)
Répondre