fen avec OpenWindowedScreen + fen avec transparente = bug

Archive.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

fen avec OpenWindowedScreen + fen avec transparente = bug

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message 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 ?
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

idem 3.92 et 3.93
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message 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').
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message 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 :).
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre