Ouvrir un screen plus grand que la fenetre

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Christophe
Messages : 43
Inscription : lun. 22/oct./2018 19:34
Localisation : Haisnes (62)

Re: Ouvrir un screen plus grand que la fenetre

Message par Christophe »

Super Ollivier, ça fonctionne très bien chez moi ! Par contre j'ai une petite question... pourquoi as tu créé un menu ? au départ je pensais que c'etait une astuce de programmation mais je me suis aperçu que ça fonctionnait sans

Code : Tout sélectionner

#MainWin = 0
#ScreenWin = 1
ScreenW = 2048
ScreenH = 2048
InitSprite()

If OpenWindow(#MainWin, 0, 0, 400, 300, Str(ScreenW) + " x " + Str(ScreenH), #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget)
  
  MDIGadget(0, 0, 0, WindowWidth(#MainWin), WindowHeight(#MainWin), 0, 0, #PB_MDI_AutoSize | #PB_MDI_BorderLess)
  OpenWindowedScreen(GadgetID(0), 0, 0, ScreenW, ScreenH) ;, 0, 0, 0, #PB_Screen_NoSynchronization) 
  
  CreateSprite(101, ScreenW, ScreenH, #PB_Sprite_AlphaBlending)
  If StartDrawing(SpriteOutput(101) )
    For I = 1 To 1000
      x = Random(ScreenW)
      y = Random(ScreenH)
      r = 50 + Random(50)
      c = RGB(Random(255), Random(255), Random(255) )
      Circle(x, y, r, c)
      Circle(x - ScreenW, y, r, c)
      Circle(x + ScreenW, y, r, c)
    Next
    StopDrawing()
  EndIf
  
  x = 0
  Repeat
    DisplaySprite(101, x, 0)
    DisplaySprite(101, ScreenW + x, 0)
    x - 1
    If x <= 0 - ScreenW
      X = 0
    EndIf
    FlipBuffers()
    Delay(3)
  Until WindowEvent() = #PB_Event_CloseWindow
EndIf
Encore un grand merci c'est exactement ce qu'il me fallait :D
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Ouvrir un screen plus grand que la fenetre

Message par Ollivier »

Pourquoi un menu ?

Dans ta version sans menu, qu'est-ce que ça donne si tu redimensionnes la fenêtre à l'aide de la souris ?

Est-ce que l'écran prend les proportions des nouvelles dimensions de la fenêtre ?

[Edit] : j'ai soumis ton code sur le forum US pour tests :https://www.purebasic.fr/english/viewto ... 13&t=72764
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Ouvrir un screen plus grand que la fenetre

Message par MLD »

Super Ollivier c'est top
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Ouvrir un screen plus grand que la fenetre

Message par Ollivier »

@MLD

Sympa d'avoir testé ! Mais le code de Christophe mérite aussi : son code semble bien fonctionner aussi.

@Christophe

Je te recommande de mettre ton code dans Trick&Tips du forum US.
Elle est bien cette astuce :
OpenWindowedScreen(GadgetID(0), 0, 0, ScreenW, ScreenH)
Ça marche même avec une image dans un ImageGadget !
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Ouvrir un screen plus grand que la fenetre

Message par MLD »

Mille excuses les deux codes sont top :oops:
Christophe
Messages : 43
Inscription : lun. 22/oct./2018 19:34
Localisation : Haisnes (62)

Re: Ouvrir un screen plus grand que la fenetre

Message par Christophe »

Pourriez vous tester (j'ai une petite config...)
La même chose mais non bloquant lors du redimensionnement ou deplacement. Par contre la valeur du delay ligne 29 doit être augmenter. Peut être une erreur de programmation de ma pars... je ne suis vraiment pas familiarisé avec les Semaphore :oops:

Code : Tout sélectionner

#MainWin = 0
#ScreenWin = 1
Global ScreenW = 2048
Global ScreenH = 2048
Global Thread
Global ThreadSemaphore = CreateSemaphore()

InitSprite()

Procedure UpdateScreen()
  WaitSemaphore(ThreadSemaphore)
  ResizeGadget(0, #PB_Ignore, #PB_Ignore,  WindowWidth(#MainWin), WindowHeight(#MainWin))
  SignalSemaphore(ThreadSemaphore)
EndProcedure

Procedure Scrolling(nul)
  
  Repeat
    WaitSemaphore(ThreadSemaphore)
    TrySemaphore(ThreadSemaphore)
    DisplaySprite(101, x, 0)
    DisplaySprite(101, ScreenW + x, 0)
    x - 1
    If x <= 0 - ScreenW
      X = 0
    EndIf
    FlipBuffers()
    SignalSemaphore(ThreadSemaphore)
    Delay(20)   ; 3
    ForEver
 
EndProcedure

If OpenWindow(#MainWin, 0, 0, 400, 300, Str(ScreenW) + " x " + Str(ScreenH), #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget)
  
  MDIGadget(0, 0, 0, WindowWidth(#MainWin), WindowHeight(#MainWin), 0, 0, #PB_MDI_BorderLess )

  OpenWindowedScreen(GadgetID(0), 0, 0, ScreenW, ScreenH) 
  
  CreateSprite(101, ScreenW, ScreenH, #PB_Sprite_AlphaBlending)
  If StartDrawing(SpriteOutput(101) )
    For I = 1 To 1000
      x = Random(ScreenW)
      y = Random(ScreenH)
      r = 50 + Random(50)
      c = RGB(Random(255), Random(255), Random(255) )
      Circle(x, y, r, c)
      Circle(x - ScreenW, y, r, c)
      Circle(x + ScreenW, y, r, c)
    Next
    StopDrawing()
  EndIf
  
  x = 0
  DisplaySprite(101, x, 0)
  DisplaySprite(101, ScreenW + x, 0)
  FlipBuffers()
  
   BindEvent(#PB_Event_SizeWindow, @UpdateScreen())
   Thread = CreateThread(@Scrolling(),0)
   SignalSemaphore(ThreadSemaphore)

  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
  KillThread(Thread) : FreeSemaphore(ThreadSemaphore)
EndIf
Et maintenant sans Thread

Code : Tout sélectionner

#MainWin = 0
#ScreenWin = 1
Global ScreenW = 2048
Global ScreenH = 2048
Global Thread
Global ThreadSemaphore = CreateSemaphore()

InitSprite()

Procedure UpdateScreen()
  ResizeGadget(0, #PB_Ignore, #PB_Ignore,  WindowWidth(#MainWin), WindowHeight(#MainWin))
EndProcedure

Procedure Scrolling()
  Static x
  
    DisplaySprite(101, x, 0)
    DisplaySprite(101, ScreenW + x, 0)
    x - 1
    If x <= 0 - ScreenW
      X = 0
    EndIf
    FlipBuffers()
 
EndProcedure

If OpenWindow(#MainWin, 0, 0, 400, 300, Str(ScreenW) + " x " + Str(ScreenH), #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget)
  AddWindowTimer(#MainWin,1,1)
  MDIGadget(0, 0, 0, WindowWidth(#MainWin), WindowHeight(#MainWin), 0, 0, #PB_MDI_BorderLess )

  OpenWindowedScreen(GadgetID(0), 0, 0, ScreenW, ScreenH,0,0,0,#PB_Screen_NoSynchronization) 
  
  CreateSprite(101, ScreenW, ScreenH, #PB_Sprite_AlphaBlending)
  If StartDrawing(SpriteOutput(101) )
    For I = 1 To 1000
      x = Random(ScreenW)
      y = Random(ScreenH)
      r = 50 + Random(50)
      c = RGB(Random(255), Random(255), Random(255) )
      Circle(x, y, r, c)
      Circle(x - ScreenW, y, r, c)
      Circle(x + ScreenW, y, r, c)
    Next
    StopDrawing()
  EndIf
  
  x = 0
  DisplaySprite(101, x, 0)
  DisplaySprite(101, ScreenW + x, 0)
  FlipBuffers()
  
  BindEvent(#PB_Event_SizeWindow, @UpdateScreen())
  BindEvent(#PB_Event_Timer,@Scrolling())

  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Ouvrir un screen plus grand que la fenetre

Message par MLD »

@ Christophe
Honnêtement je ne vois pas de différence de fonctionnement avec l'un ou l'autre code.
Pour le Delay (3) ou 20 je n'est vu aucune différence de fonctionnement.
Christophe
Messages : 43
Inscription : lun. 22/oct./2018 19:34
Localisation : Haisnes (62)

Re: Ouvrir un screen plus grand que la fenetre

Message par Christophe »

@MLD
merci d'avoir testé, comme je l'ai dit j'ai une petite config donc si le delay est inferieur à 20 dans la version threadé lors d'un redimensionnement il arrive que le debugger plante ce qui n'arrive pas avec la version "bindevent" mais c'est un peu moins fluide
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Ouvrir un screen plus grand que la fenetre

Message par falsam »

Le sujet je pense est maintenant résolu.

En complément d'information, Rashad sur le forum anglophone propose en 2014 un code à grand renfort d'API windows sans fenetre MDI permettant de scroller un OpenWindowedScreen().
:arrow: https://www.purebasic.fr/english/viewto ... 08#p445108

L'idée de OpenWindowedScreen() dans un MDI est suggérée aussi par Rashad
:arrow: https://www.purebasic.fr/english/viewto ... 24#p445124
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Ouvrir un screen plus grand que la fenetre

Message par Ollivier »

J'ajouterai après-demain de quoi scroller sans API en évitant d'utiliser les threads.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Ouvrir un screen plus grand que la fenetre

Message par Ollivier »

Ce système de merde va me rendre fou... J'arrive à quelquechose qui fonctionne. Je vais pour renommer les variables, pour qu'elles aient un nom, une signification, quelquechose de compréhensible, d'analysable, et là je n'arrive pas à isoler toutes les étapes. Pire, à chaque fois que j'isole, j'arrive à tout isoler sauf une.

La réalité, c'est que, au moins pour Windows, c'est de l'orienté objet, et c'est une grosse usine à gaz strictement inutile. C'est du << on vous la fait pour le symbole (dans le sens de l'image de marque) et ce n'est pas grave si ça plante. >>

Donc, pas la peine de pondre quelquechose de pas fini. Mais je me dis que vu le délire avec des redondances de signal strictement inutiles, des absences (pour ne pas dire << manquement >>) de signal, je parie que ceux qui testeront sur Win XP, Windows 7 et Windows 10 ne verront pas le système fonctionner.

Pour exemple, lâcher le bouton de souris c'est trois signaux de souris lâchée : claclaclac. Et c'est le même signal qui envoie un << clac >> quand la souris se déplace uniquement dans la fenêtre.

Autrement dit, leur architecture orientée objet est
pourrie. Bravo Microsoft. Merci Microsoft.

J'ai bien dit leur architecture orientée objet de l'OS, pas l'orienté objet. C'est leur choix d'architecture qui est bugué puisque chaque tâche doit se contraindre à vérifier des babioles dans d'autres tâches.

Donc, je ne lâche pas, j'ai réussi sans API le scroll horizontal contrôlé par la souris mais uniquement en StickyWindows. Le scroll en direct c'est faisable. Par contre, le resizing en direct, c'est-à-dire en voyant tourner l'accélération graphique simultanément, ça, ce sera impossible.
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Ouvrir un screen plus grand que la fenetre

Message par Zorro »

pourtant pas dur .... :roll: (pas la peine de t'en prendre a Microsoft , lorsqu'on sait pas ... on sait pas ! )

Code : Tout sélectionner


; Codé par Dobro
;Pb 5.70



;- Window Constants
;
Declare Open_Window_0()
Enumeration
		#Window_0 ; numero de la fenetre
		#sprite ; numero du sprite
		#Button_0 ; numero du bouton 
		#Gadget_scroll
		#Container
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

nombre_de_Sprite=200
Dim sprite.sprite(nombre_de_Sprite)


For i=1 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=10 ; on donne un sens de deplacement par defaut au sprite
				sprite(i)\sensy=10 ; ce chiffre correspond a la vitesse de deplacement du sprite
		Else
				sprite(i)\sensx=-10 ; on donne un sens de deplacement par defaut au sprite
				sprite(i)\sensy=10 ; 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()
Open_Window_0() ; appel de la procedure qui ouvre la fenetre

; ****** creation des sprites *********
For i=1 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()


For i=1 To nombre_de_Sprite
		; **************Affichage du sprite ***********
		DisplaySprite(i,sprite(i)\x,sprite(i)\Y)
Next i
DisplaySprite(300,1920-32,1080-32)
FlipBuffers()




Repeat ; boucle principale , qui gere les affichages dans l'ecran graphique et les evenement de la fenetre
		
		select  WaitWindowEvent(2)
				
				Case  #PB_Event_CloseWindow 
				End 
				Case  #PB_Event_Gadget 
				Select EventGadget()
						Case #Gadget_scroll						
						;		debug	GetGadgetAttribute(#Gadget_scroll, #PB_ScrollArea_X) 
						;		debug	GetGadgetAttribute(#Gadget_scroll, #PB_ScrollArea_Y)
						Case #Button_0
						Debug "appuis sur le bouton ok"
						End
						EndSelect				
				EndSelect
				; Resize sans API 
				Largeur = WindowWidth(#Window_0, #PB_Window_InnerCoordinate)
				Hauteur = WindowHeight(#Window_0, #PB_Window_InnerCoordinate)
				
				If mem_largeur<>Largeur or mem_Hauteur<>Hauteur
						ResizeGadget(#Button_0,#Pb_ignore,Hauteur-88,#Pb_ignore,#Pb_ignore)
						ResizeGadget(#Gadget_scroll,#Pb_ignore,#Pb_ignore,largeur-224,Hauteur-168)
						
						
						mem_largeur=Largeur
						mem_Hauteur=Hauteur
				Endif
				
				
		Until Event = #PB_Event_CloseWindow ; End of the event loop
		
		End
		;
		
		
		Procedure Open_Window_0()
				If OpenWindow(#Window_0, 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
						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() 
				EndIf
		EndProcedure
		
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Ouvrir un screen plus grand que la fenetre

Message par Ollivier »

Ah ben ça... C'est une bonne soufflée. Pas une API pour empêcher de changer d'OS. Je vais regarder ça...
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Ouvrir un screen plus grand que la fenetre

Message par falsam »

Intéressant ton code Zorro ! Bordelique (le ton est juste moqueur hein ?) mais intéressant. Je jette un œil et je commente ..... :mrgreen:
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Ouvrir un screen plus grand que la fenetre

Message par falsam »

S'agissant d'une démonstration, j'ai un peu élagué ton code des choses inutiles et corrigé quelques trucs:
- Ajouter un EnableExplicite
- Supprimer les variables inutilisées
- Fermer un container
- Ajouter un #PB_Event_SizeWindow ^^

Ton nouveau code

Code : Tout sélectionner

; Codé par Dobro
;Pb 5.70

;- Window Constants
;
EnableExplicit

Declare Open_Window_0()

Enumeration
  #Window_0 ; numero de la fenetre
  #Button_0 ; numero du bouton 
  #Gadget_scroll
  #Container
EndEnumeration

Structure sprite
      num.l ; numero du sprite
      x.l ; la coordonée x du sprites
      Y.l ; la coordonée y du sprites
      coul.l ; la couleur du sprite
EndStructure
Global nombre_de_Sprite=200, i, largeur, hauteur
Global Dim sprite.sprite(nombre_de_Sprite)

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

; ****** creation des sprites *********
For i=1 To nombre_de_Sprite
  With sprite(i)
    \x = Random(1920)
    \y = Random(1080)
    \coul = RGB(Random(200)+50,Random(200)+50,Random(200)+50)
    
    CreateSprite(i, 16, 16) ; creation d'une cellule vide (un sprite)
    StartDrawing(SpriteOutput(i)) ; on va dessiner dans notre sprite un carre coloré
    Box(0, 0, 16, 16, \coul)    ; voila le dessin du carre vert dans notre sprite
    StopDrawing()
    DisplaySprite(i, \x, \y)
  EndWith
Next i

FlipBuffers()

Repeat ; boucle principale , qui gere les affichages dans l'ecran graphique et les evenement de la fenetre
  
  Select  WaitWindowEvent(2)
    Case  #PB_Event_Gadget 
      Select EventGadget()
        Case #Gadget_scroll                  
          ;      debug   GetGadgetAttribute(#Gadget_scroll, #PB_ScrollArea_X) 
          ;      debug   GetGadgetAttribute(#Gadget_scroll, #PB_ScrollArea_Y)
        Case #Button_0
          Debug "appuis sur le bouton ok"
          End
      EndSelect
      
    Case #PB_Event_SizeWindow
      ; Resize sans API 
      Largeur = WindowWidth(#Window_0, #PB_Window_InnerCoordinate)
      Hauteur = WindowHeight(#Window_0, #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_CloseWindow 
      End 
      
  EndSelect 
ForEver ; End of the event loop

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 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
    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() ;Ferme le container 
    CloseGadgetList() ;Ferme le scrollGadget
  EndIf
EndProcedure
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre