Ouvrir un screen plus grand que la fenetre

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Ouvrir un screen plus grand que la fenetre

Message par Ollivier »

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 ?
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Ouvrir un screen plus grand que la fenetre

Message par Ollivier »

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.
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Ouvrir un screen plus grand que la fenetre

Message par SPH »

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 ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Ouvrir un screen plus grand que la fenetre

Message par Zorro »

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 : Tout sélectionner

;***********************************************
;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 :
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"
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Ouvrir un screen plus grand que la fenetre

Message par Ollivier »

Oh non !
J'abrège l'introduction et poste mon code...
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Ouvrir un screen plus grand que la fenetre

Message par Ollivier »

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 : Tout sélectionner

;****************************************************************************************************************************************************************************************************************
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


Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Ouvrir un screen plus grand que la fenetre

Message par Zorro »

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"
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Ouvrir un screen plus grand que la fenetre

Message par Ollivier »

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...
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Ouvrir un screen plus grand que la fenetre

Message par Zorro »

https://www.purebasic.fr/french/posting ... =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"
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Ouvrir un screen plus grand que la fenetre

Message par Ollivier »

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.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Ouvrir un screen plus grand que la fenetre

Message par Ollivier »

C'est un week-end de trois jours ?
On va en profiter pour fignoler....
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Ouvrir un screen plus grand que la fenetre

Message par Ollivier »

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...
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Ouvrir un screen plus grand que la fenetre

Message par Ollivier »

Zorro a écrit :surtout que je crois me rappeler que sous Linux, la souris c'est deja galere d'entrée de jeux
Euh... Tu as quelques précisions ? Je vais reprendre ce code plus haut et le garnir un peu...
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Ouvrir un screen plus grand que la fenetre

Message par falsam »

L'art de déterrer un sujet de 2019. Ollivier a envie de discuter :mrgreen:
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Ouvrir un screen plus grand que la fenetre

Message par Ollivier »

Ollivier a écrit :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.
@Zorro

Le code qui suit cette citation de ma part : ça me semble faux ta remarque :
Zorro a écrit :surtout que je crois me rappeler que sous Linux, la souris c'est deja galere d'entrée de jeux
J'avais fait en sorte que, justement, dans ce code, ça glisse ce problème. Alors, je souhaite des précisions. Pas de code, juste des explications pour déterminer si ce code a besoin d'être aussi adapté à ce sujet que tu informes.
Répondre