Page 1 sur 1

cacher et afficher curseur

Publié : sam. 20/oct./2007 14:35
par david
j'ai fait un bout de prog il fait une mise a jour automatiques d'informations (10aine de secondes). je voulais "bloquer" l'utilisation de l'ordinateur pendant cette mise a jour pour évtier les fouarages....

j'ai essayé:

Code : Tout sélectionner

 ShowCursor_(0) ; cache le curseur 
ShowCursor_(1) ; montre le curseur 
mais mon curseur est tjs visible?!!!!!

si quelqu'un a un truc plus fort que ca?
ou alors un mini truc qui peut faire un ecran noir qui demande de patienter
le temps que le reste du prog fais la mise a jour,
ou un truc joli a regarder...

mon deuxieme pb:
j'ai essayé avec un écran d'attente mais même avec

Code : Tout sélectionner

SetWindowPos_(WindowID(0), -1, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE) ;fenetre toujours devant
des fenêtre de questions
apparaissent quand même devant et je ne sais pas comment
empêcher l'utilisateur de cliquer sur la croix qui ferme
en plus je ne maîtrise pas vraiment le bout de code et il ne s'intègre donc pas bien avec le reste de mon programme principal..

enfin voila,si quelqu'un veut bienm'aider...
un simpletruc qui dirait avant ma mise a jour:
"bloc clavier-souris" et après ma mise a jour
"remet tout ok" serait largement suffisant en fait

merci d'avance

Publié : sam. 20/oct./2007 14:43
par Backup
pour emprisoner la souris c'est simple

ouvre un ecran graphique !!
et fait ShowCursor_(0) ; cache le curseur

ensuite dans cette ecran tu peut t'eclater a dessiner ce que tu veux ou ecrire ce que tu veux !!
puisque tu aura acces aux Sprites :D

bien sur l'utilisateur pourra toujour utiliser ALT-TAB pour Swapper sur le bureau , mais bon a part ça tu sera sur qu'il verra ton message !! :D

en quittant l'ecran Graphique il faudra faire ShowCursor_(1) ; montre le curseur, bien sur :D


l'ecran graphique peut tres bien etre utilisé comme ecran de patience :D
(meme d'ecran de veille :D)

Publié : sam. 20/oct./2007 23:34
par Chris
ShowCursor_() cache le curseur quand il se trouve sur la fenêtre qui envoie la commande, mais n'empèche pas que les clics soient détectés.

En plus, ShowCursor() n'agit que sur la souris, pas sur le clavier.

Pour eviter les "foirages", essaye plutôt d'utiliser BlockInput_(). Ca bloque tout, souris et clavier. (Par contre, n'oublie pas de mettre au moins un timer pour débloquer automatiquement la souris et le clavier, sinon, c'est le reboot "à la barbare" pour débloquer tout le bazar :lol: )

Code : Tout sélectionner

  If OpenWindow(0, 0, 0, 200, 40, "BlockInput", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    If CreateGadgetList(WindowID(0))
    TextGadget(0, 10, 10, 180, 20, "", #PB_Text_Center)
    EndIf
  EndIf
  
  top = 10
  SetTimer_(WindowID(0), 1, 1000, 0)
  SetGadgetText(0, RSet(Str(top), 2, "0") +" - Tout est bloqué")
  BlockInput_(#True)
  Repeat
    
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow : Quit = #True
        
      Case #WM_TIMER
        If top = 0
          BlockInput_(#False) : KillTimer_(WindowID(0), 1)
          SetGadgetText(0, RSet(Str(top), 2, "0") +" - Clavier et souris débloqués")
        Else
          SetGadgetText(0, RSet(Str(top), 2, "0") +" - Tout est bloqué")
        EndIf
        top - 1
        
    EndSelect
  Until Quit

Publié : sam. 20/oct./2007 23:45
par Backup
pas mal !! :D

Publié : dim. 21/oct./2007 13:30
par david
c'est super!

pendant qu'il bloque tout et travaille en arriere plan, je veux faire un "arriere plan" avec message d'attente. je me suis inspiré des exemples de purebasic pour l'aménagement qui va suivre.
seulement je n'arrive a masquer ou arrêter d'afficher mon ecran qu'avec end alors qu'il doit etre intégré dans une boucle d'autre chose et ne peut donc pas etre arreté mais stoper l'affichage..

Code : Tout sélectionner

If ExamineDesktops() 
dw.w=DesktopWidth(0) 
dh.w=DesktopHeight(0) 
Else 
dw.w=1024
dh.w=768
EndIf 
a.w = 20;bordure

; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, dw.w, dh.w, "Tempo C", #PB_Window_BorderLess | #PB_Window_ScreenCentered) = 0 Or CreateGadgetList(WindowID(0)) = 0
 
  End
EndIf
; La fenêtre doit obligatoirement être avec le style #PB_Window_BorderLess

SetWindowColor(0, RGB(0, 0, 0))


; On crée une image qui va servir de skin (elle doit avoir la taille de la fenêtre)
CreateImage(0, dw.w, dh.w)
  SetWindowPos_(WindowID(0), -1, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE) ;fenetre toujours devant 

StartDrawing(ImageOutput(0))
  ; La couleur mauve $FF00FF ou RGB(255, 0, 255) représente la partie transparente de la fenêtre

For t=1+a To dw.w-a Step 2
For u=50+a To dh.w-a Step 2
 LineXY(t, u, 300, 400, $FF00FF)
Next u
Next t

StopDrawing()
SkinWindow(WindowID(0), ImageID(0))
TextGadget(#PB_Any, 0, 25, 540, 15, "  !!! Merci de patienter pendant la mise à jour du Ficher SOURCE. La fenêtre va se refermer automatiquement... !!!")

Delay(5000):End  

Publié : dim. 21/oct./2007 16:20
par Backup
bon voici une méthode pour faire un Spash Screen qui bloc la souris dans l'ecran Graphique pendant 5 secondes !! :D

j'utilise les Timers, en API donc il te faut la version complete de PureBasic !

un timer pour compter les 5 secondes
et un autre timer pour forcer la souris dans l'ecran
parceque en mode Graphique si la souris n'est pas libéré , on perd la possibilité d'utiliser les Timers, qui eux marche en mode "Gadget" :D
c'est une bidouille, mais ça marche bien !! :D
ps ; je n'ai pas caché le curseur de souris pour que tu vois ce qui se passe
si tu essai de sortir de l'ecran graphique :D


; exemple de Slash Screen ! by Dobro
InitMouse ()
InitKeyboard ()
InitJoystick ()

declare TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
global sec=5

Enumeration
     #fenetre
     #Police
EndEnumeration


; ***********************************
Resultat = InitSprite ()
FontID = LoadFont ( #Police , "arial" , 18, #PB_Font_Bold )

OpenWindow ( #fenetre , 0, 0,640,400, "hello" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
WindowID = WindowID ( #fenetre )
Result = OpenWindowedScreen ( WindowID ( #fenetre ) ,0,0, 640, 400, 1, 0,0)
EcranX = GetSystemMetrics_ ( #SM_CXSCREEN ): ;=largeur de l'ecran
EcranY = GetSystemMetrics_ ( #SM_CYSCREEN ): ;=hauteur de l'ecran
     SetTimer_ ( WindowID ,1, 1000, @TimerProc()) ; envoie un evenement toutes les 1000 millisecondes
     SetTimer_ ( WindowID ,2, 10, @TimerProc()) ; envoie un evenement toutes les 10 millisecondes
    
     Repeat
         ExamineMouse ()
         ReleaseMouse (1) ;libere la souris
         If MouseButton (2) ; on quit si bouton gauche
             KillTimer_ ( WindowID ,1) ; on vire le timer
             CloseWindow ( #fenetre ) ; <----------- et voila on quitte !!
            end
         EndIf
        
         StartDrawing ( ScreenOutput ())
         DrawText (10, 20, "veuillez patientez " +str(sec)+ " secondes" ,rgb(255,255,0),rgb(0,0,0))
         StopDrawing ()
        
         FlipBuffers (): ; affiche l'ecran
         ; ClearScreen(RGB(0, 0, 0)) :;efface l'ecran
        waitWindowEvent(1)
        
     Until Event= #PB_Event_CloseWindow
    
     Procedure TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
        shared sec
         Select uMsg
             Case #WM_TIMER
                 Select idEvent
                     Case 1 ; chaque seconde
                        sec=sec-1
                        if sec=0
                             KillTimer_ (hwnd.l,1) ; on vire le timer
                             KillTimer_ (hwnd.l,2) ; on vire le timer
                             CloseWindow ( #fenetre ) ; <----------- et voila on quitte !!
                            end
                        endif
                    case 2 ; chaque 10 millisecondes
                         ReleaseMouse (0) ; libere la souris pour le timer !!!
                 EndSelect
         EndSelect
     EndProcedure