Page 1 sur 4
Re: Ouvrir un screen plus grand que la fenetre
Publié : mer. 08/mai/2019 1:33
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

Re: Ouvrir un screen plus grand que la fenetre
Publié : mer. 08/mai/2019 4:39
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
Re: Ouvrir un screen plus grand que la fenetre
Publié : mer. 08/mai/2019 7:16
par MLD
Super Ollivier c'est top
Re: Ouvrir un screen plus grand que la fenetre
Publié : mer. 08/mai/2019 7:24
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 !
Re: Ouvrir un screen plus grand que la fenetre
Publié : mer. 08/mai/2019 10:49
par MLD
Mille excuses les deux codes sont top

Re: Ouvrir un screen plus grand que la fenetre
Publié : mer. 08/mai/2019 11:06
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
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
Re: Ouvrir un screen plus grand que la fenetre
Publié : mer. 08/mai/2019 12:39
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.
Re: Ouvrir un screen plus grand que la fenetre
Publié : mer. 08/mai/2019 13:09
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
Re: Ouvrir un screen plus grand que la fenetre
Publié : ven. 10/mai/2019 11:41
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().
https://www.purebasic.fr/english/viewto ... 08#p445108
L'idée de OpenWindowedScreen() dans un MDI est suggérée aussi par Rashad
https://www.purebasic.fr/english/viewto ... 24#p445124
Re: Ouvrir un screen plus grand que la fenetre
Publié : ven. 10/mai/2019 21:01
par Ollivier
J'ajouterai après-demain de quoi scroller sans API en évitant d'utiliser les threads.
Re: Ouvrir un screen plus grand que la fenetre
Publié : dim. 12/mai/2019 17:44
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.
Re: Ouvrir un screen plus grand que la fenetre
Publié : lun. 13/mai/2019 2:37
par Zorro
pourtant pas dur ....

(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
Re: Ouvrir un screen plus grand que la fenetre
Publié : lun. 13/mai/2019 10:33
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...
Re: Ouvrir un screen plus grand que la fenetre
Publié : lun. 13/mai/2019 11:53
par falsam
Intéressant ton code Zorro ! Bordelique (
le ton est juste moqueur hein ?) mais intéressant. Je jette un œil et je commente .....

Re: Ouvrir un screen plus grand que la fenetre
Publié : lun. 13/mai/2019 12:03
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