Fenétre et la couleur de fond

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ulix
Messages : 315
Inscription : ven. 04/juin/2004 14:27
Localisation : Frontignan

Fenétre et la couleur de fond

Message par Ulix »

Bonjour a tous ! :wink:

Je cherche a connaître la couleur de fond d'une fenêtre.

Naturellement j'ai regarder l'aide est trouvé la fonction :
GetWindowColor(#fenetre), sauf qu'elle renvoie la couleur précédemment
affecté par SetWindowColor(#fenetre,RGB(x, x, x)).

Même en utilisant la valeur par defaut : SetWindowColor(#fenetre,#PB_Default)
et en réutilisant GetWindowColor(#fenetre), la valeur retourné est toujour -1, donc pas de couleur de fond !


J'ai aussi pensé a ouvrir la fenêtre avec un :
StartDrawing(WindowOutput(#fenetre)), et faire
Couleur = Point(5, 5):Debug "Couleur de fond = "+Str(Couleur)

Apparemment la fonction point() ne marche pas sur les fenêtres (ou alors
je m'y prend comme un manche !)
L'aide sur la fonction point() déclare : "Cette commande ne fonctionne pas
avec PrinterOutput()"
Elle ne dit pas qu'avec WindowOutput() cela ne marche pas, donc récupéré
la couleur d'un point, devrait être possible !

Il est possible de dessiné sur la fenêtre, mais impossible de récupérer
la couleur d'un point sur la fenêtre où sur les dessins (dessiné sur la fenêtre).

Est-ce un bug ???
Où je m'y prend mal !

Merci d'avance de me faire part de vos solutions !
A j'allais oublier, je suis sous linux, MATE Desktop Environment 1.12.1.

Je vous joint mon code de test. :oops:

Code : Tout sélectionner


Enumeration 
#fenetre
#Bouton
EndEnumeration

Define Couleur.q

  If OpenWindow(#fenetre, 0, 0, 220, 100, "Exemple...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    ButtonGadget  (#Bouton, 10, 60, 200, 30, "Donne couleur ")
   
      
  ;		Commande normal sans canal alpha !
  SetWindowColor(#fenetre,RGB(255, 255, 0)) 				;	Passe le fond de la fenetre en jaune
  Couleur = GetWindowColor(#fenetre)						;	Renvoie la couleur Ok
  Debug Couleur
  ;	Vérification des couleurs           
  Debug "La couleur de la fenêtre est " + Str(Couleur)
  Debug "Composante Rouge : " + Str(Red(Couleur))
  Debug "Composante Verte : " + Str(Green(Couleur))
  Debug "Composante Bleue : " + Str(Blue(Couleur))
  
  
;	; 	Présence du canal Alpha ???		Apparament pas d'influence
;   SetWindowColor(#fenetre,RGBA(255, 255, 0, 255)) 		;	Passe le fond de la fenetre en jaune
;   Couleur = GetWindowColor(#fenetre)						;	Renvoie la couleur Ok
;   Debug Couleur
;   ;		Vérification des couleurs           
;   Debug "La couleur de la fenêtre est " + Str(Couleur)
;   Debug "Composante Rouge : " + Str(Red(Couleur))
;   Debug "Composante Verte : " + Str(Green(Couleur))
;   Debug "Composante Bleue : " + Str(Blue(Couleur))
;   Debug "Composante Alpha : " + Str(Alpha(Couleur))  
 
              
   
   
    
Repeat
      Event = WaitWindowEvent()
          
      Select Event
     
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #Bouton
             
              
              		;------------------------Premier Test
              		;	Annule la couleur affecter par le précedent SetWindowColor
            		SetWindowColor(#fenetre,  #PB_Default)		
            		Delay(1000)
            		;	Redemande la couleur de la fenétre 
            		Debug GetWindowColor(#fenetre)
            		;	Renvoi toujour -1  ????
            		
            		;------------------------Deuxiéme Test
            		;		Autre test - récupérer la couleur de fiond de la fenétre, et (soyons fou)
            		;		différentes couleurs dessiné sur la fenétre !		
; 		            If StartDrawing(WindowOutput(#fenetre))
; 		            
; 						            
; 			            	DrawingMode(#PB_2DDrawing_Default )	;	Avec/Sans pas d'effet !
; 			                 	Box(10,10, 200, 30, RGB(255, 0, 0))		;	Dessin d'un rectangle
; 			                 	Circle(50, 25, 10, RGB(0, 255, 255)) 		;	Dessin d'un cercle 
; 			                 
; 			                 	;DrawingMode(#PB_2DDrawing_AlphaClip )			;	Avec/Sans pas d'effet !
; 			                 	;Box(	10,	10, 200, 30, 	RGBA(255, 0, 0, 255))		;	Dessin d'un rectangle
; 			                 	;Circle(	50, 25, 10, 		RGBA(0, 255, 255, 255)) 	;	Dessin d'un cercle 
; 			                 
; 			                 	;DrawingMode(#PB_2DDrawing_AlphaChannel)
; 			  			;Box(	10,	10, 200, 30, 	RGBA(255, 0, 0, 255))		;	Dessin d'un rectangle
; 			                 	;Circle(	50, 25, 10, 		RGBA(0, 255, 255, 255));0)) 	;	Dessin d'un cercle 
; 			                 
; 			   			;DrawingMode(#PB_2DDrawing_AlphaBlend )
; 			  			;Box(	10,	10, 200, 30, 	RGBA(255, 0, 0, 255))		;	Dessin d'un rectangle
; 			                 	;Circle(	50, 25, 10, 		RGBA(0, 255, 255, 255));0)) 	;	Dessin d'un cercle 
; 			  			
; 			  			
; 			  	
; 			                 Debug "aprés le bouton"
; 			                 ;	Couleur de fond de la fenétre
; 			                 Couleur =  Point(5, 5)		:	Debug "Couleur de la fenétre = "+Str(Couleur)
; 			                 ;	Couleur de la Box
; 			                 Couleur =  Point(15, 15)	:	Debug "Couleur du rectangle = "+Str(Couleur)
; 			                 ;	Couleur du cercle
; 			                 Couleur =  Point(50, 25)	:	Debug "Couleur du cercle = "+Str(Couleur)
; 			                 
; 			                StopDrawing()
; 		             EndIf
                           
                           
                           
                                                          
          EndSelect
            
      EndSelect
    Until Event = #PB_Event_CloseWindow
  EndIf

F6LYON
Messages : 6
Inscription : lun. 06/avr./2009 20:08

Re: Fenétre et la couleur de fond

Message par F6LYON »

Bonjour,

Regarde de nouveau l'aide de "GetWindowColor()"

je cite:
" Valeur de retour

" Renvoie la couleur de fond d'une fenêtre qui a été préalablement spécifiée par " la commande SetWindowColor().
" Si aucune couleur de fond n'a été spécifiée, la valeur -1 est renvoyée. "
"
Debug #PB_Default renvoie -1

L'erreur est juste!
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Fenétre et la couleur de fond

Message par JohnJohnsonSHERMAN »

Moi ca me renvoie bien la couleur des différents dessins que tu fais sur ta fenêtre (avec ton code non modifié, juste décommenté ton deuxiéme test)

Voici mon Debug :

Code : Tout sélectionner

65535
La couleur de la fenêtre est 65535
Composante Rouge : 255
Composante Verte : 255
Composante Bleue : 0
-1
aprés le bouton
Couleur de la fenétre = 65535
Couleur du rectangle = 255
Couleur du cercle = 16776960
Le rectangle est bien rouge et le cercle bleu clair

Systéme : Windows 10 (x64), PB 5.42 LTS (x64)

Edit : c'est sans doute un probléme spécifique à Linux... faudrait que d'autres menbres testent eux aussi
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Fenétre et la couleur de fond

Message par djes »

C'est parce que tu n'attends pas qu'un événement repaint() ait eu lieu. Voir l'aide de WindowOutput() et ce code :

Code : Tout sélectionner

Procedure.s ColorValues(color)
  ProcedureReturn "R : " + Str(Red(color)) + " ; G : " + Str(Green(color)) + " ; B : " + Str(Blue(color))
EndProcedure

If OpenWindow(0, 0, 0, 220, 100, "Exemple...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  ButtonGadget (0, 10, 60, 200, 30, "Donne couleur ")
    
  Repeat
    Event = WaitWindowEvent()
    
    Select Event
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            
            Debug "------------------------------"
            Debug "Bouton pressé"
            ; Annule la couleur affectée par le précédent SetWindowColor
            NewRed = Random(255) : NewGreen = Random(255) : NewBlue = Random(255)
            NewColor = RGB(NewRed, NewGreen, NewBlue)
            SetWindowColor(0, NewColor)
            Debug "Nouvelle couleur à donner à la fenêtre : " + ColorValues(NewColor)
            ; Redemande la couleur de la fenêtre 
            Couleur = GetWindowColor(0)
            Debug "Couleur récupérée : " + ColorValues(Couleur)
        EndSelect
        
      Case #PB_Event_Repaint 
        
        Debug "------------------------------"
        Debug "Un événement repaint a eu lieu"
        
        ; récupérer la couleur de fond de la fenêtre
        If StartDrawing(WindowOutput(0))
          
          DrawingMode(#PB_2DDrawing_Default ) ; Avec/Sans pas d'effet !
          Box(10, 10, 200, 30, RGB(255, 0, 0)); Dessin d'un rectangle
          Circle(50, 25, 10, RGB(0, 255, 255)); Dessin d'un cercle 
          
          ;DrawingMode(#PB_2DDrawing_AlphaClip ) ; Avec/Sans pas d'effet !
          ;Box( 10, 10, 200, 30, RGBA(255, 0, 0, 255)) ; Dessin d'un rectangle
          ;Circle( 50, 25, 10, RGBA(0, 255, 255, 255)) ; Dessin d'un cercle 
          
          ;DrawingMode(#PB_2DDrawing_AlphaChannel)
          ;Box( 10, 10, 200, 30, RGBA(255, 0, 0, 255)) ; Dessin d'un rectangle
          ;Circle( 50, 25, 10, RGBA(0, 255, 255, 255));0)) ; Dessin d'un cercle 
          
          ;DrawingMode(#PB_2DDrawing_AlphaBlend )
          ;Box( 10, 10, 200, 30, RGBA(255, 0, 0, 255)) ; Dessin d'un rectangle
          ;Circle( 50, 25, 10, RGBA(0, 255, 255, 255));0)) ; Dessin d'un cercle 
          
          ; Couleur de fond de la fenêtre
          Couleur = Point(5, 5) : Debug "Couleur de la fenêtre = " + ColorValues(Couleur)
          ; Couleur de la Box
          Couleur = Point(15, 15) : Debug "Couleur du rectangle = " + ColorValues(Couleur)
          ; Couleur du cercle
          Couleur = Point(50, 25) : Debug "Couleur du cercle = " + ColorValues(Couleur)
          
          StopDrawing()
        EndIf
        
    EndSelect
  Until Event = #PB_Event_CloseWindow
EndIf
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: Fenétre et la couleur de fond

Message par Marc56 »

Code : Tout sélectionner

NewRed = Random(255) : NewGreen = Random(255) : NewBlue = Random(255)
            NewColor = RGB(NewRed, NewGree, NewBlue)
            SetWindowColor(0, NewColor)
Oui mais non: avec ça tu affectes une couleur > 0 donc différente de la constante #PB_Default (-1)
Donc getWindowColor retourne bien une couleur :wink:

Code : Tout sélectionner

SetWindowColor(#fenetre,  #PB_Default) 
While WindowEvent() : Wend  ; <--- Forcer la régénération de la fenêtre 
; comme ça on voit qu'elle redevient couleur "systeme" (gris clair par défaut sous windows)
; COLOR_BACKGROUND en terme API
; Delay(1000) 
;   Redemande la couleur de la fenétre
Debug GetWindowColor(#fenetre)
;   Renvoi toujours -1  ????
Normal: -1 (ou #PB_Default) = pas de couleur = Couleur par défaut du système

Code : Tout sélectionner

Debug "Constante PB #PB_Default = " + #PB_Default

Code : Tout sélectionner

Constante PB #PB_Default = -1
La méthode conseillée est de toujours affecter soi-même des couleurs à chaque fenêtres, ça évite que l'utilisateur fasse des horreurs en bidouillant les couleurs système :mrgreen: 8)

:arrow: Donc la solution pour récupérer la couleur du fond (-1) est de récupérer dans l'API la couleur système COLOR_BACKGROUND (mais je ne sais pas comment :| )

PS. :idea: Ligne magique à mettre dans ses modèles de code:

Code : Tout sélectionner

While WindowEvent() : Wend
Ceci va créer une boucle d'évènement (et une seule), sans attente et donc régénérer l'affichage de tous les gadgets (c'est dans la doc)
Très utile par exemple quand on peuple une liste et qu'on veut voir arriver les éléments avant la fin de la boucle.
:)
Avatar de l’utilisateur
Ulix
Messages : 315
Inscription : ven. 04/juin/2004 14:27
Localisation : Frontignan

Re: Fenétre et la couleur de fond

Message par Ulix »

Merci a vous tous d'avoir testé !


Pour : @6LYON
J'avais bien vu "préalablement" dans l'aide de GetWindowColor().
C'est pour ça que dans mon 1er test, j'affecte une premiére couleur,
puis je l'annule avec SetWindowColor(#fenetre, #PB_Default), en espérant
que la prochaine utilisation de GetWindowColor(#fenetre) me donne la vrai couleur de fond de la fenêtre ! Hélas c'est toujours -1 .
D’où mon deuxième test pour contourner cette commande GetWindowColor().
Merci de m'avoir répondu.


Pour : @JohnJohnsonSHERMAN
Comme dit " c'est sans doute un problème spécifique à Linux... faudrait que d'autres membres testent eux aussi"
Apparemment sous windows cela ne pose pas de problème !
La fonction point() retourne bien une couleur.
Ok merci pour ton test.

Pour : @djes
Je n'avais pas capter qu'il fallait attendre après un événement repaint !
J'avais bien une tempo dans mon premier test, mais pas pensé a repaint.
Merci pour ton code, j’ai mieux compris.

Pour ! @Marc56
Comme tu dit : "on voit qu'elle redevient couleur "systeme" (gris clair par défaut sous windows)" pour moi sous linux, mais c'est bien la couleur de fond systeme où du thème que je veux !
Merci pour l'astuce :
While WindowEvent() : Wend ; <--- Forcer la régénération de la fenêtre
Excellent !


Merci a vous tous !

Je cherche toujours a obtenir la couleur de fond de la fenêtre, peut-être avec une api GTK ?

Si quelqu'un a un bout de code sur ce thème, je suis preneur ! :oops:

Merci d'avance.
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: Fenétre et la couleur de fond

Message par Marc56 »

Il faut que tu trouves l'équivalent linux de GetSysColor_()

Voir dans la liste des constantes PB, les constantes #COLOR_xxx

:wink:
Répondre