Page 1 sur 1

fen avec OpenWindowedScreen + fen avec transparente = bug

Publié : ven. 25/févr./2005 20:44
par Le Soldat Inconnu
Salut Fred,

J'ai 2 fen, une avec un OpenWindowedScreen en plein écran, et une autre toujours au premier plan et avec de la transparence.

et j'ai un gros prob de rafraichissement, la fenête avec transparence se mets à clignoter

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.90
;
; Explication du programme :
; Mettre la fenêtre toujours au premier plan (la fenêtre reste au dessus des autres fenêtres ouvertes)

Procedure SetWinTransparency(WinHandle.l, Transparency_Level.l)
  If OpenLibrary(0, "user32.dll")
    CallFunction(0, "SetLayeredWindowAttributes", WinHandle, 0, Transparency_Level, 2)
    CloseLibrary(0)
  EndIf
EndProcedure

If OpenWindow(0, 0, 0, 100, 100, #PB_Window_BorderLess, "Premier plan")
  
  SetWindowPos_(WindowID(), -1, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE) ; Pour mettre la fenêtre toujours au premier plan
  ; Paramètres de SetWindowPos_(Handle, Pos, x, y, TailleX, TailleY, Option)
  ; Handle = handle de la fenetre
  ; Pos = -1 : Définis la position de la fenetre, une valeur négative donne une fenetre toujours devant les autres
  ; x, y = 0, 0 : position de la fenetre
  ; TailleX, TailleY = 0, 0 : nouvelle taille de la fenetre mais ne sert pas car j'ai mis l'option #SWP_NOSIZE qui interdit de redimmentionner la fenetre
  ; Option : l'option #SWP_NOSIZE interdit de redimmentionner la fenetre avec la fonction SetWindowPos_() donc les paramètres de taille peuvent être mis à 0, 0
  
  SetWindowLong_(WindowID(), #GWL_EXSTYLE, GetWindowLong_(WindowID(), #GWL_EXSTYLE) | $00080000) ; #WS_EX_LAYERED = $00080000
  SetWinTransparency (WindowID(), 180)
  
  If OpenWindow(1, 0, 0, 200, 200, #PB_Window_BorderLess, "Ecran")
    InitSprite()
    OpenWindowedScreen(WindowID(1), 0, 0, 200, 200, 1, 0, 0)
    
    ShowWindow_(WindowID(1), #SW_MAXIMIZE) ; Met la fenêtre en plein écran
    
  EndIf
  
  Repeat
    Event = WindowEvent()
    ClearScreen(0, 0, 0)
    StartDrawing(ScreenOutput())
      Circle(50, 50, 25, $FFFF)
    StopDrawing()
    FlipBuffers()
  Until Event = #WM_CLOSE
  
EndIf
Par contr, cela fonctionne si je retire la transparence sur la 2ème fen

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.90
;
; Explication du programme :
; Mettre la fenêtre toujours au premier plan (la fenêtre reste au dessus des autres fenêtres ouvertes)

Procedure SetWinTransparency(WinHandle.l, Transparency_Level.l)
  If OpenLibrary(0, "user32.dll")
    CallFunction(0, "SetLayeredWindowAttributes", WinHandle, 0, Transparency_Level, 2)
    CloseLibrary(0)
  EndIf
EndProcedure

If OpenWindow(0, 0, 0, 100, 100, #PB_Window_BorderLess, "Premier plan")
  
  SetWindowPos_(WindowID(), -1, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE) ; Pour mettre la fenêtre toujours au premier plan
  ; Paramètres de SetWindowPos_(Handle, Pos, x, y, TailleX, TailleY, Option)
  ; Handle = handle de la fenetre
  ; Pos = -1 : Définis la position de la fenetre, une valeur négative donne une fenetre toujours devant les autres
  ; x, y = 0, 0 : position de la fenetre
  ; TailleX, TailleY = 0, 0 : nouvelle taille de la fenetre mais ne sert pas car j'ai mis l'option #SWP_NOSIZE qui interdit de redimmentionner la fenetre
  ; Option : l'option #SWP_NOSIZE interdit de redimmentionner la fenetre avec la fonction SetWindowPos_() donc les paramètres de taille peuvent être mis à 0, 0
  
  ; SetWindowLong_(WindowID(), #GWL_EXSTYLE, GetWindowLong_(WindowID(), #GWL_EXSTYLE) | $00080000) ; #WS_EX_LAYERED = $00080000
  ; SetWinTransparency (WindowID(), 180)
  
  If OpenWindow(1, 0, 0, 200, 200, #PB_Window_BorderLess, "Ecran")
    InitSprite()
    OpenWindowedScreen(WindowID(1), 0, 0, 200, 200, 1, 0, 0)
    
    ShowWindow_(WindowID(1), #SW_MAXIMIZE) ; Met la fenêtre en plein écran
    
  EndIf
  
  Repeat
    Event = WindowEvent()
    ClearScreen(0, 0, 0)
    StartDrawing(ScreenOutput())
      Circle(50, 50, 25, $FFFF)
    StopDrawing()
    FlipBuffers()
  Until Event = #WM_CLOSE
  
EndIf
Et cela fonctionne si l'openwindowedscreen n'est pas en plein écran

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.90
;
; Explication du programme :
; Mettre la fenêtre toujours au premier plan (la fenêtre reste au dessus des autres fenêtres ouvertes)

Procedure SetWinTransparency(WinHandle.l, Transparency_Level.l)
  If OpenLibrary(0, "user32.dll")
    CallFunction(0, "SetLayeredWindowAttributes", WinHandle, 0, Transparency_Level, 2)
    CloseLibrary(0)
  EndIf
EndProcedure

If OpenWindow(0, 0, 0, 100, 100, #PB_Window_BorderLess, "Premier plan")
  
  SetWindowPos_(WindowID(), -1, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE) ; Pour mettre la fenêtre toujours au premier plan
  ; Paramètres de SetWindowPos_(Handle, Pos, x, y, TailleX, TailleY, Option)
  ; Handle = handle de la fenetre
  ; Pos = -1 : Définis la position de la fenetre, une valeur négative donne une fenetre toujours devant les autres
  ; x, y = 0, 0 : position de la fenetre
  ; TailleX, TailleY = 0, 0 : nouvelle taille de la fenetre mais ne sert pas car j'ai mis l'option #SWP_NOSIZE qui interdit de redimmentionner la fenetre
  ; Option : l'option #SWP_NOSIZE interdit de redimmentionner la fenetre avec la fonction SetWindowPos_() donc les paramètres de taille peuvent être mis à 0, 0
  
  SetWindowLong_(WindowID(), #GWL_EXSTYLE, GetWindowLong_(WindowID(), #GWL_EXSTYLE) | $00080000) ; #WS_EX_LAYERED = $00080000
  SetWinTransparency (WindowID(), 180)
  
  If OpenWindow(1, 0, 0, 200, 200, #PB_Window_BorderLess, "Ecran")
    InitSprite()
    OpenWindowedScreen(WindowID(1), 0, 0, 200, 200, 1, 0, 0)
    
    ; ShowWindow_(WindowID(1), #SW_MAXIMIZE) ; Met la fenêtre en plein écran
    
  EndIf
  
  Repeat
    Event = WindowEvent()
    ClearScreen(0, 0, 0)
    StartDrawing(ScreenOutput())
      Circle(50, 50, 25, $FFFF)
    StopDrawing()
    FlipBuffers()
  Until Event = #WM_CLOSE
  
EndIf

Publié : sam. 26/févr./2005 15:40
par Fred
en fait c'est la taille de la fenetre "ecran" qui a l'air de faire ce scintillement. c'est nouveau avec la 3.93 ou ca faisait deja ca avant ?

Publié : sam. 26/févr./2005 18:56
par Le Soldat Inconnu
idem 3.92 et 3.93

Publié : sam. 26/févr./2005 20:45
par Fred
Apres quelques recherche, c'est du au fait que la carte graphique ne suit pas et n'arrive pas à afficher le bitmap stretché en plein ecran durant le petit intervalle (vertical blank) qui ferait ca de maniere invisible. Il n'ya pas de vrai double buffering en mode windowed, c'est pour ca que c'est pas parfait en plein ecran (je suggere d'ouvrir un vrai 'openscreen').

Publié : sam. 26/févr./2005 23:22
par Le Soldat Inconnu
ok :D

Regarde ceci (en openscreen) :lol: , la fenêtre transparente clignote pendant 1 seconde puis disparaît.

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu 
; Version de PB : 3.90 
; 
; Explication du programme : 
; Mettre la fenêtre toujours au premier plan (la fenêtre reste au dessus des autres fenêtres ouvertes) 

Procedure SetWinTransparency(WinHandle.l, Transparency_Level.l) 
  If OpenLibrary(0, "user32.dll") 
    CallFunction(0, "SetLayeredWindowAttributes", WinHandle, 0, Transparency_Level, 2) 
    CloseLibrary(0) 
  EndIf 
EndProcedure 

If OpenWindow(0, 0, 0, 100, 100, #PB_Window_BorderLess, "Premier plan") 
  
  SetWindowPos_(WindowID(), -1, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE) ; Pour mettre la fenêtre toujours au premier plan 
  ; Paramètres de SetWindowPos_(Handle, Pos, x, y, TailleX, TailleY, Option) 
  ; Handle = handle de la fenetre 
  ; Pos = -1 : Définis la position de la fenetre, une valeur négative donne une fenetre toujours devant les autres 
  ; x, y = 0, 0 : position de la fenetre 
  ; TailleX, TailleY = 0, 0 : nouvelle taille de la fenetre mais ne sert pas car j'ai mis l'option #SWP_NOSIZE qui interdit de redimmentionner la fenetre 
  ; Option : l'option #SWP_NOSIZE interdit de redimmentionner la fenetre avec la fonction SetWindowPos_() donc les paramètres de taille peuvent être mis à 0, 0 
  
  SetWindowLong_(WindowID(), #GWL_EXSTYLE, GetWindowLong_(WindowID(), #GWL_EXSTYLE) | $00080000) ; #WS_EX_LAYERED = $00080000 
  SetWinTransparency (WindowID(), 180) 
  UpdateWindow_(WindowID())
  
  Delay(500)
  
  InitSprite() 
  OpenScreen(1024, 768, 32, "Test")
    
  
  Repeat 
    ClearScreen(0, 0, 0) 
    StartDrawing(ScreenOutput()) 
    Circle(50, 50, 25, $FFFF) 
    StopDrawing() 
    FlipBuffers() 
    ExamineKeyboard()
  Until KeyboardPushed(#PB_Key_All)
  
EndIf

Publié : dim. 27/févr./2005 14:17
par Fred
En plein écran, ton application a le controle total sur l'écran et il n'est pas possible d'afficher des fenetres normales dedans :).

Publié : dim. 27/févr./2005 14:23
par Le Soldat Inconnu
oui, je suis entièrement d'accord, mais pourquoi elle apparait dedans ? bon elle n'apparait que 1 seconde mais c'est pas logique.

Surtout que moi, j'ai d'autre programme qui ont le style de la fen de l'exemple (premier plan + transparence) et qui apparaissent dans l'openscreen de la même manière.