PureBasic

Forums PureBasic
Nous sommes le Mar 12/Nov/2019 15:10

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 42 messages ]  Aller à la page Précédente  1, 2, 3
Auteur Message
 Sujet du message: Re: Ouvrir un screen plus grand que la fenetre
MessagePosté: Jeu 23/Mai/2019 20:48 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3521
Pas de phrase d'intro... Bon... Et bien, en attendant, je remercie Christophe qui a fait surgir cette idée d'écran accéléré fenêtré. Et le principe de gadget image qui supplante le gadget MDI, dans le cadre du support d'écran fenêtré.

Et, bien que Zorro indique, que dans deux passés plus ou moins lointains d'autres ont aussi ajouté l'idée suivante (discussions de dräc en 2004 et Graph100 en 2014), Christophe a émis l'hypothèse efficace qu'un Windowed Screen pouvait être ouvert grâce au handle non pas d'une fenêtre explicite, mais d'une fenêtre implicite, tel que le gadget.

Petit rappel : un handle, c'est un manipulateur technique, une main, tel que la main que l'on garde ou que l'on passe dans certains jeux, le self contrôle dans la vie quotidienne, le tour dans la française des jeux, formidable officine qui colle un placard << Philosophy forever >> à quiconque anti-capitaliste qui s'achète son ticket à gratter.

Et, en PureBasic, un handle, c'est un identifiant, un ID.

Aussi Zorro, fin limier porte une soufflée en scotchant l'écran graphique dans un Gadget Container. Mais... Il y a un mais...

Comme son nom l'indique, et, mieux que le MDI et le Container, le Gadget Image contient une image. Et, rien ne m'indique que le MDI ou le Container n'ont pas non plus une image inaccessible en natif, une zone mémoire, allouée pour rien. Rien ne m'indique non plus que j'affabule. Mais, dans le doute, le Gadget Image m'apporte cette sensation de contrôle. Alleluiah, shalom, amine, et, Hextril cul-sec, pour ne pas faire de jaloux.

Comme je disais, j'ai légué le resizing au rang des écrans freezés. J'ai renoncé, j'ai abandonné. Je suis, à ce sujet, parti le slip baissé en suçant mon pouce. Et Zorro, dans son Container is the winner.

En effet, j'ai décidé que l'application, c'était l'application et, l'OS, ben c'était l'OS. Et qu'une application qui exige de l'OS de couvrir ou découvrir une zone de son interface, c'était une exigence irresponsable.

Après tout ? On a une option SystemMenu, elle ne crashe pas. On peut resizer : c'est l'utilisateur qui décide avec sa souris, ou bien c'est l'application qui demande. Mais une application qui exige, c'est envoyer des utilisateurs au goulag.

C'est comme ça qu'on se retrouve avec des artifacts, sans l'heure, sans son niveau de batterie, avec sa SysTray qui déconne, et surtout, c'est comme ça qu'on dicerne une application de chez Symantec d'une autre application.

Donc le resizing, la seule chose qu'il faut se contraindre à faire c'est de le détecter, de le mesurer et de l'enregistrer.

Par contre, le scrolling, on va se faire un plaisir de le prendre en main. Et puisque le sujet c'est "screen" qui signifie thématiquement << Ecran avec accélération matérielle >>, sur le plan de l'affichage, on ne va pas en laisser une goutte à l'OS qui va rester se débrouiller à afficher l'heure, etc...

Alors il y a un << mais >> technique : que deviennent ExamineMouse() et ExamineKeyboard() lorsque l'on a fourré son écran fenêtré, accéléré, resizable, mouvable, etc... dans la redirection d'un handle de gadget ?


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Ouvrir un screen plus grand que la fenetre
MessagePosté: Ven 24/Mai/2019 11:03 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3521
Concernant nos deux fonctions vitales pour récupérer les états du clavier et de la souris, des indices nous viennent du Professeur Solex Abatari-Tuora, diplômé ès Sciences post-Fukushima :

<< Il est probable que vos deux fonctions ExamineKeyboard() et ExamineMouse() soient observables au téléscope à balayage coloscopique par interaction des écarts de branes, ou par effet tunnel.

- Des précisions plus terre à terre, Professeur Abatari-Tuora ?

- Oui... Mon premier est l'opposé de dehors...
Mon second est un célèbre poisson, au naturel, comme à la Catalane...
Mon 3ème est la lettre entre P et R...
Et mon tout est l'endroit où se cachent vos deux fonctions ExamineMouse() et ExamineKeyboard() une fois que vous avez fait les malins à ouvrir un screen accéléré dans un gadget.

- Merci Professeur. >>

Il semblerait donc que nos deux fonctions vitales pour trouver un clavier vivant et une souris qui fonctionne, soient dans une constellation trop chargée d'émotions pour tenter une routine classique en plein écran.

Nous allons donc appliquer un théorème efficace dans ces cas hostiles de force majeure. Découvrons... Le Théorème M.P.G., plus connu sous le nom de théorème multi-plateforme de la Gougoutte.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Ouvrir un screen plus grand que la fenetre
MessagePosté: Ven 24/Mai/2019 11:14 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 09/Nov/2005 9:53
Messages: 4067
Ollivier, si je puis me permettre, tu papotes beaucoup (en etant plusieurs fois HS) pour peu de resultat/code a proposer...
Mais ce n'est que mon avis hein ! 8)

Par exemple, sur ce sujet, je ne sais pas si tu as prouvé que l'on pouvais ou pas ouvrir un screen plus grand que la fenetre...

_________________
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Portable LENOVO ideapad 110-17ACL 64 bits
Version de PB : 5.70LTS - 32 bits


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Ouvrir un screen plus grand que la fenetre
MessagePosté: Ven 24/Mai/2019 12:30 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 2103
de plus le examine mouse est PResent Dans mon code LIGNE 87 (prend ton telescope LOL ) , puisque
d'ailleurs si tu avais testé mon code, tu aurai vu que lorsque le pointeur entre dans l'ecran un SPrite rouge Carré
sert de curseur a l'interieur de l'ecran , il suit donc bien la souris ! :roll:

quand au examine Keyboard, ça peut aussi ce gerer .. t'as qu'a chercher un peu ... ;)

ps revoici mon code (des fois que tu n'aurai pas pu le voir page precedente :

Code:
;***********************************************
;Titre  :Fenetre_ecran_scroll2
;Auteur  : Dobro
;Date  :13/05/2019
;Heure  :21:29:33
;Version Purebasic :  PureBasic 5.70 LTS (Windows - x64)
;Version de l'editeur :EPB V2.68
; Libairies necessaire : Aucune
;***********************************************



;- Window Constants
;

Declare open_window_0()


Enumeration
      #win ; numero de la fenetre
      #sprite ; numero du sprite
      #Button_0 ; numero du bouton
      #Gadget_scroll
      #Container
      #sprite_curseur
      #timer
EndEnumeration

Structure sprite
      num.l ; numero du sprite
      x.l ; la coordonée x du sprites
      Y.l ; la coordonée y du sprites
      sensx.l ; le sens du deplacement x du sprite
      sensy.l  ; le sens du deplacement y du sprite
      coul.l ; la couleur du sprite
EndStructure



Global nombre_de_Sprite=1000
Global Dim sprite.sprite(nombre_de_Sprite)
Global  offset_x , offset_y ; determine la decalage entre pointeur souris et curseur Graphique

For i=20 To nombre_de_Sprite
      
      sprite(i)\x=Random(1920) +32; on donne une coordonée de depart au sprite
      sprite(i)\Y=Random(1080)+32
      de=Random(1)
      If de=1
            sprite(i)\sensx=1 ; on donne un sens de deplacement par defaut au sprite
            sprite(i)\sensy=1 ; ce chiffre correspond a la vitesse de deplacement du sprite
      Else
            sprite(i)\sensx=-1 ; on donne un sens de deplacement par defaut au sprite
            sprite(i)\sensy=1 ; ce chiffre correspond a la vitesse de deplacement du sprite
      EndIf
      sprite(i)\coul = RGB(Random(200)+50,Random(200)+50,Random(200)+50) ; attribut une couleur
Next i
;


InitSprite():initmouse()
Open_Window_0() ; appel de la procedure qui ouvre la fenetre


CreateSprite(#sprite_curseur,16,16)
StartDrawing(SpriteOutput(#sprite_curseur))
      Box(0,0,16,16,$0000FF)
StopDrawing()


; ****** creation des sprites *********
For i=20 To nombre_de_Sprite
      CreateSprite(i,16,16) ; creation d'une cellule vide (un sprite)
      StartDrawing( SpriteOutput(i)) ; on va dessiner dans notre sprite un carre coloré
            Box(1,1,16,16,sprite(i)\coul) ; voila le dessin du carre vert dans notre sprite
      StopDrawing()
Next i
;**************************************
CreateSprite(300,32,32) ; creation d'une cellule vide (un sprite)
StartDrawing( SpriteOutput(300)) ; on va dessiner dans notre sprite un carre coloré
      circle(1,1,16,rgb(0,255,0)) ; voila le dessin du carre vert dans notre sprite
StopDrawing()
;
;

Repeat ; boucle principale , qui gere les affichages dans l'ecran graphique et les evenement de la fenetre
      ExamineMouse()
      
      select  WaitWindowEvent(50)
            ; ************************* Les Gadgets *******************************************************
            Case  #PB_Event_CloseWindow
            End
            Case #PB_Event_SizeWindow
               Largeur = WindowWidth(#win, #PB_Window_InnerCoordinate)
            Hauteur = WindowHeight(#win, #PB_Window_InnerCoordinate)
            ResizeGadget(#Button_0,#Pb_ignore,Hauteur-88,#Pb_ignore,#Pb_ignore)
            ResizeGadget(#Gadget_scroll,#Pb_ignore,#Pb_ignore,largeur-224,Hauteur-168)   
            Case #PB_Event_Timer
            If EventTimer() = #timer
                  ; ******************** Sprite en mouvement **************************
                  For i=20 to  nombre_de_Sprite
                        sprite(i)\x=sprite(i)\x+sprite(i)\sensx
                        sprite(i)\y=sprite(i)\y+sprite(i)\sensy
                        
                        if sprite(i)\x<=0 or  sprite(i)\x>=1920
                              sprite(i)\sensx=-sprite(i)\sensx
                        Endif
                        if sprite(i)\y<=0 or  sprite(i)\y>=1080
                              sprite(i)\sensy=-sprite(i)\sensy
                        Endif
                        DisplaySprite(i,sprite(i)\x,sprite(i)\Y) ; Affiche les Sprites     
                        compteur=compteur+1
                        if compteur=10
                              compteur=1
                              ;WindowEvent(); SI actif, on a le scroll fluide mais plus la reactivité du bouton !
                        Endif
                  Next i
                  
                  ; ce sprite indique la coordonée 1920x1080 pour repere(quart de rond Vert)
                  DisplaySprite(300,1920-32,1080-32)
                  FlipBuffers()
                  ClearScreen(0)
            Endif
               Case  #PB_Event_Gadget
                        
                        Select EventGadget()
                      Case #Button_0
                              Debug "appuis sur le bouton ok"
                              ;End
                        EndSelect           
            
      EndSelect
      
      
      ;- *****************************************************************************************************
      
      
      
      ;- *************************** Gestion de la souris et de son Sprite *********************************************************
      if WindowMouseX(#win)<gadgetWidth(#Gadget_scroll)  and WindowMouseY(#win)<GadgetHeight(#Gadget_scroll) ; on est dans l'ecran ???
            If WindowMouseX(#win)>GadgetX(#Gadget_scroll) and  WindowMouseY(#win)>GadgetY(#Gadget_scroll) ; on est dans l'ecran !
                  
                  
                  ; showcursor_(0) ; Dans l'ecran on affiche le Sprite et efface le curseur souris Windows (api window)
                  
                  StartDrawing(WindowOutput(#win))
                        FrontColor(RGB(255,255,255))
                        DrawingMode(1)
                        DrawText(80,80,"Position de la souris = " + Str(WindowMouseX(#win)) + " / " + Str(WindowMouseY(#win)))
                  StopDrawing()
                  offset_x =GetGadgetAttribute(#Gadget_scroll, #PB_ScrollArea_X)
                  offset_Y=GetGadgetAttribute(#Gadget_scroll, #PB_ScrollArea_Y)
                  
                  DisplaySprite(#sprite_curseur,WindowMouseX(#win)-70+offset_x ,WindowMouseY(#win)-70+offset_y) ;  oui , alors on affiche le Sprite
                  
                  
            Else ; non ! , donc on a quitté l'ecran (enfin.. on n'est plus dessus , car en mode fenetré on ne quitte jamais vraiment l'ecran.. puisqu'il est enfant d'une fenetre !!
                  ; contrairement au mode Full Screen()
                  
                  ;showcursor_(1) ; hors de l'ecran on affice le curseur Souris window  mais pas le sprite  (api window)
            Endif
      EndIf
      ;-  ***********************************************************************************************************************
Until Event = #PB_Event_CloseWindow ; End of the event loop


End
;

;- ******************** Zone des Procedures ********************************
Procedure Open_Window_0()
      If OpenWindow(#win, 363, 117, 1024, 768, "test",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar ) ; on ouvre une fenetre
            ButtonGadget(#Button_0, 10, 680, 100, 30, "ok")  ; voila le bouton
            AddWindowTimer(#win, #timer, 30)
            ScrollAreaGadget(#Gadget_scroll, 50, 50, 800, 600,1920,1080,1,#PB_ScrollArea_Flat) ; dans un scroll AREA
            ContainerGadget(#Container,10,10,1920,1080,#PB_Container_Double) ; on met un container
            OpenWindowedScreen(gadgetID(#Container), 1, 1, 1920, 1080, 0, 1, 1) ; et on creer un ecran graphique dedans
            CloseGadgetList()
            CloseGadgetList()
      
      EndIf
EndProcedure






; Epb






et la :

Citation:
Ollivier a écrit:
Concernant nos deux fonctions vitales pour récupérer les états du clavier et de la souris, des indices nous viennent du Professeur Solex Abatari-Tuora, diplômé ès Sciences post-Fukushima :

<< Il est probable que vos deux fonctions ExamineKeyboard() et ExamineMouse() soient observables au téléscope à balayage coloscopique par interaction des écarts de branes, ou par effet tunnel.

- Des précisions plus terre à terre, Professeur Abatari-Tuora ?

- Oui... Mon premier est l'opposé de dehors...
Mon second est un célèbre poisson, au naturel, comme à la Catalane...
Mon 3ème est la lettre entre P et R...
Et mon tout est l'endroit où se cachent vos deux fonctions ExamineMouse() et ExamineKeyboard() une fois que vous avez fait les malins à ouvrir un screen accéléré dans un gadget.

- Merci Professeur. >>

Il semblerait donc que nos deux fonctions vitales pour trouver un clavier vivant et une souris qui fonctionne, soient dans une constellation trop chargée d'émotions pour tenter une routine classique en plein écran.

Nous allons donc appliquer un théorème efficace dans ces cas hostiles de force majeure. Découvrons... Le Théorème M.P.G., plus connu sous le nom de théorème multi-plateforme de la Gougoutte.




pour repondre a ta charade , c'est dans TON Cul !

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Ouvrir un screen plus grand que la fenetre
MessagePosté: Ven 24/Mai/2019 12:44 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3521
Oh non !
J'abrège l'introduction et poste mon code...


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Ouvrir un screen plus grand que la fenetre
MessagePosté: Ven 24/Mai/2019 18:49 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3521
Sans ExamineMouse() ni ExamineKeyboard() qui plantent selon les OS.

Contient l'interface semblable à celle pour OpenGLGadget(), donc accès multi-écran, multi-fenêtres.

Merci à Christophe d'avoir eu l'idée : ne pas hésiter à apporter un retour si petite config pour optimisation.

Code:
;****************************************************************************************************************************************************************************************************************
Structure WinScrDims
  realW.I              ; Largeur (zone réelle)
  realH.I              ; Hauteur
 
  ViewX.I              ; X (Coordonnées de la visu dans l'écran)
  ViewY.I              ; Y
  ViewW.I              ; Largeur
  ViewH.I              ; Hauteur
 
  OffsetX.I            ; X (Coordonnées de la visu dans la zone réelle)
  OffsetY.I            ; Y
  OffMaxX.I
  OffMaxY.I
 
  OffX.I
  OffY.I
 
  hScale.D
  vScale.D
 
  Partial.I            ; Drapeau d'états partiels des dimensions. Bit 0 = état partiel horizontal. Bit 1 = état partiel vertical.
 
  BarThickness.I       ; Epaisseur des bordures de scrolling
 
  hSlideX.I
  hSlideY.I
  hSlideW.I            ; Largeur de la zone de glissement de la barre horizontale de scrolling
  hSlideH.I
 
  vSlideX.I
  vSlideY.I
  vSlideH.I            ; Hauteur de la zone de glissement de la barre verticale de scrolling
  vSlideW.I
 
  hBarX.I
  hBarY.I
  hBarW.I              ; Largeur de la barre horizontale de scrolling
  hBarH.I
 
  vBarX.I
  vBarY.I
  vBarW.I
  vBarH.I              ; Hauteur de la barre verticale de scrolling
EndStructure

Structure WinScr
 
  SubSys.I             ; Handle sous-système
 
  Win.I                ; Numéro de fenêtre de visu
  WinFlags.I           ; Configuration de la fenêtre de visu
  Img.I                ; Numéro d'image de visu
  Ggt.I                ; Numéro de gadget (ImageGadget) de visu
 
  Scr.I                ; Numéro/handle d'écran / de visu
 
  cWin.I               ; Numéro de fenêtre (canvas)
  cGgt.I               ; Numéro de gadget (canvas)
 
  inKey.S              ; Touche clavier (local)
  inText.S             ; Texte clavier
  Array CharKey.I(255) ; Tableau des appuis direct de touche
 
  Ev.I                 ; Evènement GUI OS
  EvWin.I              ; Fenêtre concernée par un évènement
  EvType.I             ; Type d'évènement
   
  msBts.I              ; Etat des boutons de la souris
  msWheelD.I           ; Etat de l'évolution de la molette de la souris
  msWheel.I            ; Etat de la molette de la souris
  msDeskX.I            ; X (coordonnées de la souris dans le bureau)
  msDeskY.I            ; Y
  msOn.I               ; Etat de présence de la souris au-dessus de la visu
  msOn0.I              ; Ancien état de présence de la souris au-dessus de la visu
  msOnExtra.I          ; Etat des boutons de la souris quand celle-ci a quitté la visu malgré le maintien appuyé
 
  msX.I                ; X (coordonnées de la souris dans la vue graphique
  msY.I                ; Y
 
  msDrag.I
  msDragX.I
  msDragY.I
 
  Array LineSp.I(7)    ; N° des sprites pour le tracé des lignes (8 couleurs)
 
  Dims.WinScrDims
 
EndStructure

Declare WinScrDims(*WS.WinScr)
 


  Procedure Extrema(*a.Integer, min, max)
    If *a\I < Min
      *a\I = Min
    EndIf
    If *a\I > Max
      *a\I = Max
    EndIf
    ;
  EndProcedure
 
Procedure WinScrOpen(WinX.I = 100, WinY.I = 100, WinW.I = 400, WinH.I = 300, WinT.S = "", WinF.I = 0)
  Define *WS.WinScr = AllocateStructure(WinScr)
  *WS\SubSys = InitSprite()
  *WS\WinFlags = WinF
  *WS\WinFlags | #PB_Window_SystemMenu
  *WS\WinFlags | #PB_Window_SizeGadget
  *WS\WinFlags | #PB_Window_MaximizeGadget
  *WS\WinFlags | #PB_Window_MinimizeGadget
  *WS\Win = OpenWindow(#PB_Any, WinX, WinY, WinW, WinH, WinT, *WS\WinFlags)
  ExamineDesktops()
  *WS\Dims\RealW = DesktopWidth(0)
  *WS\Dims\RealH = DesktopHeight(0)
  *WS\Img = CreateImage(#PB_Any, *WS\Dims\RealW, *WS\Dims\RealH, DesktopDepth(0), RGBA(0, 0, 0, 0) )
  *WS\Ggt = ImageGadget(#PB_Any, 0, 0, 1, 1, ImageID(*WS\Img) )
  *WS\Scr = OpenWindowedScreen(GadgetID(*WS\Ggt), 0, 0, *WS\Dims\RealW, *WS\Dims\RealH)
  StickyWindow(*WS\Win, #True)
  *WS\cWin = OpenWindow(#PB_Any, 0, 0, 1, 1, "", #PB_Window_BorderLess, WindowID(*WS\Win) )
  *WS\cGgt = CanvasGadget(#PB_Any, 0, 0, 1, 1, #PB_Canvas_Keyboard)
  StickyWindow(*WS\cWin, #True)
  *WS\Dims\BarThickness = 24
  ProcedureReturn *WS 
EndProcedure



  Procedure In(x0, y0, x, y, w, h)
    If x0 => x
      If y0 => y
        If x0 < x + w
          If y0 < y + h
            ProcedureReturn 1
          EndIf
        EndIf
      EndIf
    EndIf
  EndProcedure
 
Procedure WinScrGetEvent(*WS.WinScr)
  Repeat
    *WS\Ev = WindowEvent()
    *WS\EvWin = EventWindow()
    *WS\EvType = 0
    Select *WS\EvWin
      Case *WS\Win
        Select *WS\Ev
          Case #PB_Event_CloseWindow
            End
          Case #PB_Event_SizeWindow, #PB_Event_MoveWindow, #PB_Event_Repaint
            *WS\Dims\ViewX = WindowX(*WS\Win, #PB_Window_InnerCoordinate)
            *WS\Dims\ViewY = WindowY(*WS\Win, #PB_Window_InnerCoordinate)
            *WS\Dims\ViewW = WindowWidth(*WS\Win)
            *WS\Dims\ViewH = WindowHeight(*WS\Win)
            WinScrDims(*WS)
            Extrema(@*WS\Dims\OffsetX, 0, *WS\Dims\OffMaxX)
            Extrema(@*WS\Dims\OffsetY, 0, *WS\Dims\OffMaxY)
        EndSelect
      Case *WS\cWin
        Select *WS\Ev
          Case #PB_Event_Gadget
            *WS\EvType = EventType()
            *WS\msBts = GetGadgetAttribute(*WS\cGgt, #PB_Canvas_Buttons)
            *WS\msWheelD = GetGadgetAttribute(*WS\cGgt, #PB_Canvas_WheelDelta)
            Select *WS\EvType
              Case #PB_EventType_MouseWheel
                *WS\msWheel + *WS\msWheelD
              Case #PB_EventType_Input
                *WS\inKey = Chr(GetGadgetAttribute(*WS\cGgt, #PB_Canvas_Input) )
                *WS\inText + *WS\inKey
              Case #PB_EventType_KeyDown
                *WS\CharKey(GetGadgetAttribute(*WS\cGgt, #PB_Canvas_Key) ) = 1
              Case #PB_EventType_KeyUp
                *WS\CharKey(GetGadgetAttribute(*WS\cGgt, #PB_Canvas_Key) ) = 0
            EndSelect
        EndSelect
    EndSelect
  Until *WS\Ev = 0
  *WS\msDeskX = DesktopMouseX()
  *WS\msDeskY = DesktopMouseY()
  *WS\msOn0 = *WS\msOn
  *WS\msOn = 0
  If *WS\msDeskX => *WS\Dims\ViewX
    If *WS\msDeskY => *WS\Dims\ViewY
      If *WS\msDeskX < *WS\Dims\ViewX + *WS\Dims\ViewW
        If *WS\msDeskY < *WS\Dims\ViewY + *WS\Dims\ViewH
          *WS\msOn = 1
        EndIf
      EndIf
    EndIf
  EndIf
  If (*WS\msOn And Not *WS\msOn0) Or (*WS\msOn And (GetActiveWindow() <> *WS\cWin) )
    HideWindow(*WS\cWin, #False)
    SetActiveGadget(*WS\cGgt)
  EndIf
  If Not *WS\msOn And *WS\msOn0
    If *WS\msBts
      *WS\msOnExtra = *WS\msBts
    Else
      HideWindow(*WS\cWin, #True)
    EndIf
  EndIf
  If *WS\msOn Or *WS\msOnExtra
    ResizeWindow(*WS\cWin, *WS\msDeskX, *WS\msDeskY, #PB_Ignore, #PB_Ignore)
  EndIf
  *WS\msX = *WS\msDeskX - *WS\Dims\ViewX
  *WS\msY = *WS\msDeskY - *WS\Dims\ViewY
  If *WS\msBts = 0 And *WS\msOn = 0
    *WS\msOnExtra = 0
    HideWindow(*WS\cWin, #True)
  EndIf
EndProcedure



Structure Graphic
        *WS
        Array CharFont.I(80)
        Array CharS.I(80, 255)
        Array CharW.I(80, 255)
        Array CharH.I(80, 255)
        MouseImage.I
        MouseSprite.I
EndStructure



Procedure GraphicCreate(*WS)
        Define *This.Graphic = AllocateMemory(SizeOf(Graphic) )
        InitializeStructure(*This, Graphic)
        *This\WS = *WS
        ProcedureReturn *This
EndProcedure



Procedure GraphicInitFont(*This.Graphic, FontName.S, SizeList.S)
        Define SizeSize = CountString(SizeList, ";")
        Dim Size.I(SizeSize)
        For K = 0 To SizeSize
                Size(K) = Val(StringField(SizeList, 1 + K, ";") )
        Next
        For K = 0 To SizeSize
                J = Size(K)
                *This\CharFont(J) = LoadFont(#PB_Any, FontName, J)
        Next
       
        StartDrawing(ScreenOutput() )
        For K = 0 To SizeSize
                J = Size(K)
                DrawingFont(FontID(*This\CharFont(J) ) )
                For I = 1 To 255
                        *This\CharW(J, I) = TextWidth(Chr(I) )
                        If *This\CharW(J, I) = 0
                                *This\CharW(J, I) = 1
                        EndIf
                        *This\CharH(J, I) = TextHeight(Chr(I) )
                Next
        Next
        StopDrawing()
       
        For K = 0 To SizeSize
                J = Size(K)
                For I = 1 To 255
                        *This\CharS(J, I) = CreateSprite(#PB_Any, *This\CharW(J, I), *This\CharH(J, I), #PB_Sprite_AlphaBlending)
                        StartDrawing(SpriteOutput(*This\CharS(J, I) ) )
                        DrawingFont(FontID(*This\CharFont(J) ) )
                        DrawingMode(#PB_2DDrawing_AllChannels)
                        DrawText(0, 0, Chr(I), RGBA(0, 0, 0, 255), RGBA(255, 255, 255, 0) )
                        StopDrawing()
                Next
        Next
EndProcedure



Procedure GraphicDisplay(*This.Graphic, x, y, A$, Size, ColorAlpha, Angle = 0)
        Define *WS.WinScr = *This\WS
        Alpha = Alpha(ColorAlpha)
        Color = RGB(Red(ColorAlpha), Green(ColorAlpha), Blue(ColorAlpha) )
        Define AngleRad.F = Angle * #PI / 180.0
        If Angle
                For I = 1 To Len(A$)
                        A = Asc(Mid(A$, I, 1) )
                        If Angle
                                RotateSprite(*This\CharS(Size, A), Angle, #PB_Absolute)
                        EndIf
                        DisplayTransparentSprite(*This\CharS(Size, A), X - *WS\Dims\OffsetX, Y - *WS\Dims\OffsetY, Alpha, Color)
                        X + (*This\CharW(Size, A) * Cos(AngleRad) )
                        Y + (*This\CharW(Size, A) * Sin(AngleRad) )
                Next
        Else
                For I = 1 To Len(A$)
                        A = Asc(Mid(A$, I, 1) )
                        RotateSprite(*This\CharS(Size, A), 0, #PB_Absolute)
                        DisplayTransparentSprite(*This\CharS(Size, A), X - *WS\Dims\OffsetX, Y - *WS\Dims\OffsetY, Alpha, Color)
                        X + *This\CharW(Size, A)
                Next
        EndIf
EndProcedure



Procedure LineCreate(*WS.WinScr)
  For I = 0 To 7
    *WS\LineSp(I) = CreateSprite(#PB_Any, 256, 4, #PB_Sprite_AlphaBlending)
    If StartDrawing(SpriteOutput(*WS\LineSp(I) ) )
      DrawingMode(#PB_2DDrawing_AllChannels)
      W = OutputWidth()
      H = OutputHeight()
      Box(0, 0, W, H, RGBA(0, 0, 0, 0) )
      BCr = I >> 2 & 1
      BCg = I >> 1 & 1
      BCb = I & 1
      Cr = 255 * BCr
      Cg = 255 * BCg
      Cb = 255 * BCb
      Box(0, 1, W, 2, RGBA(Cr, Cg, Cb, 255) )
      StopDrawing()
    EndIf
  Next
EndProcedure


Procedure LineDisplay(xa.D, ya.D, xb.D, yb.D, SpriteN)
        Define.D Ang, x0, y0, x1, y1, x2, y2, x3, y3, dx, dy
        Ang = ATan2(xb - xa, yb - ya)
        dx = Cos(Ang + #PI / 2.0) * 1.5
        dy = Sin(Ang + #PI / 2.0) * 1.5
        x0 = xa + dx
        y0 = ya + dy
        x1 = xb + dx
        y1 = yb + dy
        x2 = xb - dx
        y2 = yb - dy
        x3 = xa - dx
        y3 = ya - dy
        ;TransformSprite(SpriteN, x0, y0, x1, y1, x2, y2, x3, y3)
        ;DisplayTransparentSprite(SpriteN, 0, 0)         
        TransformSprite(SpriteN, x3, y3, x2, y2, x1, y1, x0, y0)
        DisplayTransparentSprite(SpriteN, 0, 0)         
EndProcedure


Procedure CliffDisplay(*WS.WinScr, xa.D, ya.D, xb.D, yb.D)
  LineDisplay(xa, ya, xb, ya, *WS\LineSp(7) )
  LineDisplay(xa, ya, xa, yb, *WS\LineSp(7) )
  LineDisplay(xb, ya, xb, yb, *WS\LineSp(0) )
  LineDisplay(xa, yb, xb, yb, *WS\LineSp(0) )
EndProcedure

Procedure CliffDisplayWH(*WS.WinScr, x.D, y.D, w.D, h.D)
  CliffDisplay(*WS, x, y, x + w - 1, y + h - 1)
EndProcedure

Procedure WinScrDims(*WS.WinScr)
  With *WS\Dims
    \Partial = 0
    If \ViewW < \RealW
      \Partial | 1
    EndIf
    If \ViewH < \RealH
      \Partial | 2
    EndIf
    If \Partial & 1
      If \Partial & 2
        Thickness = \BarThickness
      Else
        Thickness = 0
      EndIf
      \hSlideX = 0
      \hSlideY = \ViewH - \BarThickness
      \hSlideW = \ViewW - Thickness
      \hSlideH = \BarThickness
      \hScale = \hSlideW / \RealW
      \hBarX = \OffsetX * \hScale
      \hBarY = \hSlideY
      \hBarW = \ViewW * \hScale
      \hBarH = \hSlideH
      CliffDisplayWH(*WS, \hBarX, \hBarY, \hBarW, \hBarH)
    Else
      \hSlideX = 0
      \hSlideY = 0
      \hSlideH = 0
      \hScale = 1.0
    EndIf
    If \Partial & 2
      \vSlideX = \ViewW - \BarThickness
      \vSlideY = 0
      \vSlideW = \BarThickness
      \vSlideH = \ViewH - \hSlideH
      \vScale = \vSlideH / \RealH
      \vBarX = \vSlideX
      \vBarY = \OffsetY * \vScale
      \vBarW = \vSlideW
      \vBarH = \ViewH * \vScale
      CliffDisplayWH(*WS, \vBarX, \vBarY, \vBarW, \vBarH)
    Else
      \vSlideX = 0
      \vSlideY = 0
      \vSlideW = 0
      \vScale = 1.0
    EndIf
    \OffMaxX = (\hSlideW - \hBarW) / \hScale
    \OffMaxY = (\vSlideH - \vBarH) / \vScale
    If \Partial & 3
      CliffDisplayWH(*WS, \vSlideX, \hSlideY, \vSlideW, \hSlideH)
    EndIf
    If In(*WS\MsX, *WS\MsY, \hBarX, \hBarY, \hBarW, \hBarH)
      If *WS\msBts & 1
        If *WS\msDrag = 0
          *WS\msDrag | 1
          *WS\msDragX = *WS\msX
          *WS\msDragY = *WS\msY
          \OffX = \OffsetX
          \OffY = \OffsetY
        EndIf
      EndIf
    EndIf
    If *WS\msDrag & 1
      If (*WS\msBts & 1) = 0
        *WS\msDrag = 0
      Else
        \OffsetX = \OffX + ((*WS\msX - *WS\msDragX) / \hScale)
        Extrema(@\OffsetX, 0, \OffMaxX)
      EndIf
    EndIf
    If In(*WS\MsX, *WS\MsY, \vBarX, \vBarY, \vBarW, \vBarH)
      If *WS\msBts & 1
        If *WS\msDrag = 0
          *WS\msDrag | 2
          *WS\msDragX = *WS\msX
          *WS\msDragY = *WS\msY
          \OffX = \OffsetX
          \OffY = \OffsetY
        EndIf
      EndIf
    EndIf
    If *WS\msDrag & 2
      If (*WS\msBts & 1) = 0
        *WS\msDrag = 0
      Else
        \OffsetY = \OffY + ((*WS\msY - *WS\msDragY) / \vScale)
        Extrema(@\OffsetY, 0, \OffMaxY)
      EndIf
    EndIf
  EndWith
EndProcedure


CompilerIf #PB_Compiler_IsMainFile ; Exemple
 
 
  Define *WS.WinScr = WinScrOpen(100, 100, 276, 350)
  Define *GR.Graphic = GraphicCreate(*WS)
  GraphicInitFont(*GR, "verdana", "12;20") 
 
  Size = 8
  CreateSprite(1, Size, Size, #PB_Sprite_AlphaBlending)
  If StartDrawing(SpriteOutput(1) )
    W = OutputWidth()
    H = OutputHeight()
    W2 = W / 2
    W4 = W / 4
    W8 = W / 8
    DrawingMode(#PB_2DDrawing_AllChannels)
    Box(0, 0, W, H, RGBA(0, 0, 0, 0) )
    Box(W4, W4, W4, W4, RGBA(0, 0, 0, 255) )
    Box(W4, W2, W4, W4, RGBA(0, 0, 255, 255) )
    Box(W2, W4, W4, W4, RGBA(0, 255, 0, 255) )
    Box(W2, W2, W4, W4, RGBA(0, 255, 255, 255) )
    StopDrawing()
  EndIf
 
  Size = 8
  CreateSprite(2, Size, Size, #PB_Sprite_AlphaBlending)
  If StartDrawing(SpriteOutput(2) )
    W = OutputWidth()
    H = OutputHeight()
    DrawingMode(#PB_2DDrawing_AllChannels)
    Box(0, 0, W, H, RGBA(0, 0, 0, 0) )
    Box(W4, W4, W4, W2, RGBA(0, 0, 0, 255) )
    Box(W2, W4, W4, W2, RGBA(0, 0, 0, 255) )
    StopDrawing()
  EndIf
 
  Size = 8
  CreateSprite(3, Size, Size, #PB_Sprite_AlphaBlending)
  If StartDrawing(SpriteOutput(3) )
    W = OutputWidth()
    H = OutputHeight()
    DrawingMode(#PB_2DDrawing_AllChannels)
    Box(0, 0, W, H, RGBA(0, 0, 0, 0) )
    Box(W4, W4, W4, W2, RGBA(0, 0, 0, 0) )
    Box(W2, W4, W4, W2, RGBA(255, 0, 0, 255) )
    StopDrawing()
  EndIf
 
  Size = 8
  CreateSprite(4, Size, Size, #PB_Sprite_AlphaBlending)
  If StartDrawing(SpriteOutput(4) )
    W = OutputWidth()
    H = OutputHeight()
    DrawingMode(#PB_2DDrawing_AllChannels)
    Box(0, 0, W, H, RGBA(255, 255, 255, 255) )
    StopDrawing()
  EndIf
 
  LineCreate(*WS)
  Repeat
    WinScrGetEvent(*WS)
    ClearScreen(RGB(0, 0, 0) )
   
    SpriteQuality(#PB_Sprite_NoFiltering)
    ClipSprite(1, W2-1, W2-1, 2, 2)
    x = *WS\Dims\RealW
    y = *WS\Dims\RealH
    TransformSprite(1, 0 - *WS\Dims\OffsetX, 0 - *WS\Dims\OffsetY, x - *WS\Dims\OffsetX, 0 - *WS\Dims\OffsetY, x - *WS\Dims\OffsetX, y - *WS\Dims\OffsetY, 0 - *WS\Dims\OffsetX, y - *WS\Dims\OffsetY)
    SpriteQuality(#PB_Sprite_BilinearFiltering)
    DisplaySprite(1, 0, 0)
   
    GraphicDisplay(*GR, 0, 0, "Théorème multi-plateforme de la Gougoutte de... Canvas", 20, RGBA(63, 127, 255, 255) )
    If *WS\msOn Or *WS\msOnExtra
      c = RGBA(255, 159, 255, 255)
    Else
      c = RGBA(63, 91, 191, 255)
    EndIf
    GraphicDisplay(*GR, 0, 64, "Texte = «" + *WS\inText + "»", 20, c)
    For Y = 0 To 15
      For X = 0 To 15
        GraphicDisplay(*GR, X * 16, Y * 16 + 96, Str(*WS\CharKey(Y * 16 + X) ), 12, c)
      Next
    Next
    GraphicDisplay(*GR, 0, 352, "Boutons souris : " + RSet(Bin(*WS\msBts), 3, "0"), 20, c)
    GraphicDisplay(*GR, 0, 384, "Molette souris : " + Str(*WS\msWheel), 20, c)
    GraphicDisplay(*GR, 0, 416, "Position souris : " + Str(*WS\msX) + " x " + Str(*WS\msY), 20, c)
    GraphicDisplay(*GR, 0, 448, "Horloge : " + Str(ElapsedMilliseconds() ), 20, c)
    GraphicDisplay(*GR, 0, 480, Str(*WS\Dims\OffsetX), 20, c)
    WinScrDims(*WS)
    FlipBuffers()
  ForEver
 
CompilerEndIf




Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Ouvrir un screen plus grand que la fenetre
MessagePosté: Ven 24/Mai/2019 20:12 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 2103
Ollivier a écrit:
Sans ExamineMouse() ni ExamineKeyboard() qui plantent selon les OS.


j'ai bien un peut laché Pb , mais j'ai JAMAIS entendu parler de ça !
par contre , je suis pas sur que d'utiliser la gestion de la souris et du clavier par le canvaGadget soit bien opportun ...
mais bon ... pourquoi pas... surtout que je crois me rappeler que sous Linux, la souris c'est deja galere d'entrée de jeux
par contre tes ascenseurs , ils partent au camping paradis ... :roll:

je reste persuadé, que l'ideal est quand meme de coder selon le systeme d'exploitation
et sur windows on a les api, et le callback qui va avec

si je compte en qualité de longueur de code , je prefere le miens ....;)

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Ouvrir un screen plus grand que la fenetre
MessagePosté: Ven 24/Mai/2019 21:59 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3521
De toute façon, t'as mis une soufflée, c'est pas débattable. C'est juste que les bandes blanches qui apparaissent quand tu scrolles dans ton code, c'est pas contrôlable.

Alors j'ai préféré l'aventure : refaire le système, c'est plus contrôlable, et ça ouvre d'autres possibilités.

Dans ton code, tu rajoutes un timer. Si je le pique pour synchro le redimensionnement, si ça se trouve, ça va fonctionner. Et je ne sais pas pourquoi, l'écran graphique au moins sous MDI et sous Gadget Image annule ExamineMouse et Keyboard (ils retournent 0). Pareil avec le container : pas souris pas clavier. Dès que je lui indique WindowId au lieu de GadgetId et que la fenêtre n'est pas sorti d'un MDI, ça marche.(Windows 8.1 PB5.50)

La réalité, c'est qu'on a pondu deux codes bien différents, et ça montre les choix possibles.

Le gros regret sans ExamineMouse() c'est l'absence de deltaX et deltaY en natif : c'est contraignant et ça alourdit le code. Le mieux serait de faire une exception et récupérer les 2 ou 3 APIs pour déplacer la souris du bureau.

T'as un ScreenShoot des ascenseurs qui fuguent en camping ? C'est d'office? T'es sous W10 ? Moi, à part un bug lors de la maximization, ils se présentent et se déplacent parfaitement...


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Ouvrir un screen plus grand que la fenetre
MessagePosté: Sam 25/Mai/2019 9:54 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 2103
posting.php?mode=delete&f=1&p=203911des le lancement du code j'ai :

Image

et si j’agrandis la fenetre j'ai :

Image

systématiquement ... les ascenseurs n'apparaissent JAMAIS......(enfin ils sont transparent) ..ils fonctionnent si on les cherches... mais
on le les voient pas ... (surtout les boutons en haut et en bas de chaque ascenseurs)

je suis Sur Windows 10 a jour 1809...

PS: j'ai eu un doute, je pensais que cela pouvais venir de "WindowBlind" un changeur de look de windows 10 (voir le look de mes fenetres dans les captures)
mais meme si WindowBlind est desactivé, j'ai toujours le probleme

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Ouvrir un screen plus grand que la fenetre
MessagePosté: Sam 25/Mai/2019 10:14 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3521
M'enfin Zorro... C'est design : ils SONT transparents !!! Je vais te mettre une option d'opacité si ça te semble trop furtif...

Et tu veux des flèches en plus... Râh... Allez... Ça me fait plaisir : je vais rajouter ça...

Mets "opengl" en sous-système, et là, tu verras que ça fait de la vraie bouse à critiquer ! Heureusement Demivec a posté un code de rappel et, a priori ça fonctionne impeccablement.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Ouvrir un screen plus grand que la fenetre
MessagePosté: Ven 07/Juin/2019 23:57 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3521
C'est un week-end de trois jours ?
On va en profiter pour fignoler....


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Ouvrir un screen plus grand que la fenetre
MessagePosté: Sam 08/Juin/2019 16:37 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3521
7 heures pour redémarrer une vieille bécane (par contre 36W, vieu mais pas gourmand, malgré 11 ans d'âge)
- charger la batterie (avec contrôleur pour vérifier les tensions et éviter de mettre le feu, et forçage des premiers milliwatts)
- remettre à l'heure
- virer le réseau
- mettre le bon écran de 30W en principal
- remettre un clavier qui n'a pas la vache folle quand un véhicule passe à côté

Je suis vraiment pas à la page.
Bon, il y a une version 5.50 sur XP, c'est un 1 GHz mono-core 20 Giga de HD, 1 Giga dont 64 Méga pour la vidéo.

On peut considérer ça comme une petite configuration. Si mes souvenirs sont bons, c'est 256 sprites non alpha ou 9 sprites alpha superposés (ce qui est peu, très peu) qui s'affichent sans ralentir. Au-delà, ça rame. Notez qu'en parallèle, en utilisant la lib Ogre, c'est un peu plus de polygones, mais pas tant que ça...

Donc je repars de zéro. Je vais récupérer la fonction WinScrOpen() et refaire une structure WinScr que WinScrOpen() va initialiser.

WinScrOpen() pour << WindowedScreenOpen() >>

Après, libre à chacun de nommer ses fonctions et structures comme il veut...


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 42 messages ]  Aller à la page Précédente  1, 2, 3

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 10 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye