SetWindowCallBack() n'est pas portable...je voudrais le plus possible de compatibilite avec les 3 os.
ContainerGadget avec Dégradé, possible?
-
Anonyme
A partir de l'image que tu as posté, peut-être que ceci est correct?
C'est uniquement pour Windows. Pour le multi plate-forme, il existe une solution mais elle demande de gérer chaque bouton comme une fenêtre fille
.
C'est uniquement pour Windows. Pour le multi plate-forme, il existe une solution mais elle demande de gérer chaque bouton comme une fenêtre fille
Code : Tout sélectionner
#DI_Vertical = 0
#DI_Horizontal = 1
Structure FenetreInfo
No.I
X.I
Y.I
LI.I ; Largeur Interne
HI.I ; Hauteur Interne
Ti.S
Op.I
Evt.I ; Evénement fourni avec WindowEvent()
EndStructure
Procedure Rect(X.I, Y.I, L.I, H.I, C.I)
Line(X, Y, L, 0, C)
Line(X, Y, 0, H, C)
Line(X, Y + H - 1, L, 0, C)
Line(X + L - 1, Y, 0, H, C)
EndProcedure
Procedure.I DegradeImage(L.I, H.I, Dir.I)
Protected Img.I
Img = CreateImage(-1, L, H)
StartDrawing(ImageOutput(Img))
Select Dir
Case #DI_Vertical
Pas.F = L / 255.0 + 1.0
For i = 0 To 255
x.F = (i * L) / 255.0
Box(x, 0, pas, H, RGB(128 + i / 2, 128 + i / 2, 255) )
Next
Case #DI_Horizontal
Pas = H / 255.0 + 1.0
For i = 0 To 255
y.F = (i * H) / 255.0
Box(0, y, L, pas, RGB(128 + i / 2, 128 + i / 2, 255) )
Next
EndSelect
Rect(0, 0, L, H, #White)
Rect(1, 1, L - 2, H - 2, RGB(128, 128, 255) )
Rect(2, 2, L - 4, H - 4, #White)
StopDrawing()
ProcedureReturn Img
EndProcedure
Procedure FenetreTest(*Fenetre.FenetreInfo)
With *Fenetre
\No = OpenWindow(-1, \X, \Y, \LI, \HI, \Ti, \Op)
\HI = WindowHeight(\No)
ImageGauche = DegradeImage(128, \HI, #DI_Vertical)
ImageGadget(2, 0, 0, 128, \HI, ImageID(ImageGauche) )
SetWindowLong_(GadgetID(2), #GWL_STYLE, GetWindowLong_(GadgetID(2), #GWL_STYLE) | #WS_CLIPSIBLINGS)
ContainerGadget(1, 128, 0, \LI - 128, \HI)
ImageDroite = DegradeImage(\LI - 128, \HI, #DI_Horizontal)
ImageGadget(3, 0, 0, \LI - 128, \HI, ImageID(ImageDroite) )
SetWindowLong_(GadgetID(3), #GWL_STYLE, GetWindowLong_(GadgetID(2), #GWL_STYLE) | #WS_CLIPSIBLINGS)
ButtonGadget(4, 16, 16, 128, 48, "Quitter")
SetWindowPos_(GadgetID(3), GadgetID(4), -1, -1, -1, -1, #SWP_NOSIZE | #SWP_NOMOVE)
CloseGadgetList()
Repeat
Delay(1)
\Evt = WindowEvent()
Select \Evt
Case #PB_Event_Gadget
Select EventGadget()
Case 4
Break
EndSelect
EndSelect
Until \Evt = #PB_Event_CloseWindow
CloseWindow(\No)
EndWith
EndProcedure
Define Fenetre.FenetreInfo
With Fenetre
\X = 0
\Y = 0
\LI = 400
\HI = 300
\Ti = ""
\Op = $CF0001
EndWith
FenetreTest(Fenetre)
End
bonsoir
puisqu'on est dans les degradés,
voila pour le fun un post du forum anglais.
http://www.purebasic.fr/english/viewtop ... d145c44fc6
cordialement
puisqu'on est dans les degradés,
voila pour le fun un post du forum anglais.
http://www.purebasic.fr/english/viewtop ... d145c44fc6
cordialement
-
Anonyme
kernadec a écrit :bonjour Cpl.Bator
je ne comprend pas votre probleme clic?
cordialementCode : Tout sélectionner
OpenWindow(0, 0, 0, 550, 550, "Fenetre", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) CreateImage(0, WindowWidth(0), WindowHeight(0)) ContainerGadget(1, 20, 20, 512, 512 ,#PB_Container_Double) StartDrawing(ImageOutput(0)) DrawingMode(1) For n = 0 To 255 ;Box(0,n*6,512,3,RGB(n,n,n)) ;Box(0,n*5,512,5,RGB(255-n,255-n,255)) ;Box(0,n*10,512,10,RGB(255-n,255-n,255)) Box(0,n*8,512,8,RGB(255-n,255-n,255)) ;Box(0,n*3,512,3,RGB(n,n,255-n)) ;Box(0,n*3,512,3,RGB(n,255-n,n)) ;Box(0,n*3,512,3,RGB(255-n,n,n)) Next StopDrawing() ButtonGadget(2, 40, 40, 80, 20 ,"essai",#PB_Button_Toggle) ImageGadget(0,0,0,ImageWidth(0), ImageHeight(0), ImageID(0)) Repeat Event = WaitWindowEvent() Select Event Case #PB_Event_Gadget Select EventGadget() Case 2 Debug "Voila" EndSelect Case #PB_Event_CloseWindow End EndSelect ForEver
Ton code est bon effectivement , un vieux reflexe logique me dit de placer mes gadget dans l'ordre
si tu créer l'image , et qu'ensuite tu créer le bouton , le bouton deviens incliquable.
Tu as du avoir un gros coup de chance
-
Anonyme
@Kernadec
C'est ce qui s'appelle essayer de la faire à l'envers!!!
J'ai pourtant posté un code. D'ailleurs, je l'ai piqué d'un code de Gnozal: honte à moi d'agir ainsi...
Pour le multi-OS, je crois qu'il n'y a pas d'autres choix que de jouer avec plusieurs fenêtres mère et filles. Je n'ai pas testé mais je pense qu'on peut obtenir des résultats similaires avec cette méthodes.
Ollivier
C'est ce qui s'appelle essayer de la faire à l'envers!!!
J'ai pourtant posté un code. D'ailleurs, je l'ai piqué d'un code de Gnozal: honte à moi d'agir ainsi...
Pour le multi-OS, je crois qu'il n'y a pas d'autres choix que de jouer avec plusieurs fenêtres mère et filles. Je n'ai pas testé mais je pense qu'on peut obtenir des résultats similaires avec cette méthodes.
Ollivier
-
Le Soldat Inconnu
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
Pardon si ce n'est pas trop ce qui est recherché mais j'aurai fait comme cela, moi
c'est totalement multiplateforme et ça permet de faire les boutons avec l'apparence de son choix
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 4
;
; Explication du programme :
; Pour faire des programmes de test rapidement, il ne reste qu'a rajouter les gadgets et la gestion des évènements.
Enumeration
#Fond
#Fond_Decoupe_H
#Fond_Decoupe_B
#Fond_Decoupe_D
#Fond_Decoupe_G
#Bouton
EndEnumeration
; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 300, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
End
EndIf
; le fond
CreateImage(#Fond, 300, 300)
StartDrawing(ImageOutput(#Fond))
For n = 0 To 299
Line(0, n, 300, 0, RGB(170 + 80 * n / 300, 170 + 80 * n / 300, 170 + 80 * n / 300))
Next
StopDrawing()
; le bouton
CreateImage(#Bouton, 100, 25)
StartDrawing(ImageOutput(#Bouton))
Box(1, 1, 98, 23, $FFFFFF)
DrawingMode(#PB_2DDrawing_Transparent)
Texte.s = "Bonjour"
DrawText((100 - TextWidth(Texte)) / 2, (25 - TextHeight(Texte)) / 2, Texte, $000000)
StopDrawing()
; Affichage
; On découpe le fond pour faire un trou pour le bouton
GrabImage(#Fond, #Fond_Decoupe_H, 0, 0, 300, 200)
GrabImage(#Fond, #Fond_Decoupe_B, 0, 225, 300, 75)
GrabImage(#Fond, #Fond_Decoupe_G, 0, 200, 100, 25)
GrabImage(#Fond, #Fond_Decoupe_D, 200, 200, 100, 25)
; Fond
ImageGadget(#Fond_Decoupe_H, 0, 0, 300, 200, ImageID(#Fond_Decoupe_H))
ImageGadget(#Fond_Decoupe_B, 0, 225, 300, 75, ImageID(#Fond_Decoupe_B))
ImageGadget(#Fond_Decoupe_G, 0, 200, 100, 25, ImageID(#Fond_Decoupe_G))
ImageGadget(#Fond_Decoupe_D, 200, 200, 100, 25, ImageID(#Fond_Decoupe_D))
; Bouton
ImageGadget(#Bouton, 100, 200, 100, 25, ImageID(#Bouton))
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Menu
Select EventMenu() ; Menus
EndSelect
Case #PB_Event_Gadget
Select EventGadget() ; Gadgets
Case #Bouton
Select EventType()
Case #PB_EventType_LeftClick
Debug "Clic gauche sur le bouton"
EndSelect
Case #Fond_Decoupe_H, #Fond_Decoupe_B, #Fond_Decoupe_D, #Fond_Decoupe_G
Select EventType()
Case #PB_EventType_LeftClick
Debug "Clic gauche sur le fond"
Case #PB_EventType_RightClick
Debug "Clic droit sur le fond"
EndSelect
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
bonjour Soldat Inconnu
Avec votre code, En activant les thème XP pour les couleurs,
cela permet de garder l'animation du bouton.
Cordialement
Avec votre code, En activant les thème XP pour les couleurs,
cela permet de garder l'animation du bouton.
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 4
;
; Explication du programme :
; Pour faire des programmes de test rapidement, il ne reste qu'a rajouter les gadgets et la gestion des évènements.
Enumeration
#Fond
#Fond_Decoupe_H
#Fond_Decoupe_B
#Fond_Decoupe_D
#Fond_Decoupe_G
#Bouton
#Bouton1
EndEnumeration
; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 300, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
End
EndIf
; le fond
CreateImage(#Fond, 300, 300)
StartDrawing(ImageOutput(#Fond))
For n = 0 To 299
Line(0, n, 300, 0, RGB(170 + 80 * n / 300, 170 + 80 * n / 300, 170 + 80 * n / 300))
Next
StopDrawing()
font=LoadFont(0,"system",8)
; le bouton
CreateImage(#Bouton, 100, 25)
StartDrawing(ImageOutput(#Bouton))
SetGadgetFont(#PB_Default, font)
;Box(1, 1, 98, 23, $FFFFFF)
Box(1, 1, 98, 23,RGB(243,243,243))
DrawingMode(#PB_2DDrawing_Transparent)
Texte.s = "Bonjour"
DrawText((100 - TextWidth(Texte)) / 2, (34 - TextHeight(Texte)) / 4, Texte, $000000)
StopDrawing()
; Affichage
; On découpe le fond pour faire un trou pour le bouton
GrabImage(#Fond, #Fond_Decoupe_H, 0, 0, 300, 200)
GrabImage(#Fond, #Fond_Decoupe_B, 0, 225, 300, 75)
GrabImage(#Fond, #Fond_Decoupe_G, 0, 200, 100, 25)
GrabImage(#Fond, #Fond_Decoupe_D, 200, 200, 100, 25)
; Fond
ImageGadget(#Fond_Decoupe_H, 0, 0, 300, 200, ImageID(#Fond_Decoupe_H))
ImageGadget(#Fond_Decoupe_B, 0, 225, 300, 75, ImageID(#Fond_Decoupe_B))
ImageGadget(#Fond_Decoupe_G, 0, 200, 100, 25, ImageID(#Fond_Decoupe_G))
ImageGadget(#Fond_Decoupe_D, 200, 200, 100, 25, ImageID(#Fond_Decoupe_D))
; Bouton
ButtonGadget(#Bouton1, 100, 200, 100, 25, "Bonjour")
ImageGadget(#Bouton, 100, 200, 100, 25, ImageID(#Bouton))
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Menu
Select EventMenu() ; Menus
EndSelect
Case #PB_Event_Gadget
Select EventGadget() ; Gadgets
Case #Bouton ,#bouton1
Select EventType()
Case #PB_EventType_LeftClick
Debug "Clic gauche sur le bouton"
EndSelect
Case #Fond_Decoupe_H, #Fond_Decoupe_B, #Fond_Decoupe_D, #Fond_Decoupe_G
Select EventType()
Case #PB_EventType_LeftClick
Debug "Clic gauche sur le fond"
Case #PB_EventType_RightClick
Debug "Clic droit sur le fond"
EndSelect
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow -
Geo Trouvpatou
- Messages : 471
- Inscription : dim. 23/déc./2007 18:10
Salut.
Pas mal LSI.
Et un rollover sur le bouton c'est possible ?
Du style bouton au repos, survol du curseur sur le bouton et clic sur le bouton et tout ceci portable.
Kernadec, ton problème précédent revient.
Si tu sors ton interface hors de l'écran ou si une autre interface passe par dessus la 1ère, le bouton ne se redessine pas. Dommage.
Bye.
Pas mal LSI.
Et un rollover sur le bouton c'est possible ?
Du style bouton au repos, survol du curseur sur le bouton et clic sur le bouton et tout ceci portable.
Kernadec, ton problème précédent revient.
Si tu sors ton interface hors de l'écran ou si une autre interface passe par dessus la 1ère, le bouton ne se redessine pas. Dommage.
Bye.
-
Le Soldat Inconnu
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
Bien sur, c'est très facile, regarde
après, il manque juste l'event #wm_mousemove qui n'est pas portable pour le moment.
donc totalement portable, je ferais comme cela
après, il suffit de mettre tous les gadgets dans un container pour pouvoir les afficher ou les masquer d'un coup comme ce qui était demandé au début.
Je passe comme ça car le problème du fond avec un skin, c'est que les textgadget, bouton et autre ne le supporte pas bien.
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 4
;
; Explication du programme :
; Pour faire des programmes de test rapidement, il ne reste qu'a rajouter les gadgets et la gestion des évènements.
Enumeration
#Fond
#Fond_Decoupe_H
#Fond_Decoupe_B
#Fond_Decoupe_D
#Fond_Decoupe_G
#Bouton
#Bouton_Survol
EndEnumeration
; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 300, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
End
EndIf
; le fond
CreateImage(#Fond, 300, 300)
StartDrawing(ImageOutput(#Fond))
For n = 0 To 299
Line(0, n, 300, 0, RGB(170 + 80 * n / 300, 170 + 80 * n / 300, 170 + 80 * n / 300))
Next
StopDrawing()
; le bouton
CreateImage(#Bouton, 100, 25)
StartDrawing(ImageOutput(#Bouton))
Box(1, 1, 98, 23, $FFFFFF)
DrawingMode(#PB_2DDrawing_Transparent)
Texte.s = "Bonjour"
DrawText((100 - TextWidth(Texte)) / 2, (25 - TextHeight(Texte)) / 2, Texte, $000000)
StopDrawing()
CreateImage(#Bouton_Survol, 100, 25)
StartDrawing(ImageOutput(#Bouton_Survol))
Box(1, 1, 98, 23, $00FF00)
DrawingMode(#PB_2DDrawing_Transparent)
Texte.s = "Au revoir"
DrawText((100 - TextWidth(Texte)) / 2, (25 - TextHeight(Texte)) / 2, Texte, $000000)
StopDrawing()
; Affichage
; On découpe le fond pour faire un trou pour le bouton
GrabImage(#Fond, #Fond_Decoupe_H, 0, 0, 300, 200)
GrabImage(#Fond, #Fond_Decoupe_B, 0, 225, 300, 75)
GrabImage(#Fond, #Fond_Decoupe_G, 0, 200, 100, 25)
GrabImage(#Fond, #Fond_Decoupe_D, 200, 200, 100, 25)
; Fond
ImageGadget(#Fond_Decoupe_H, 0, 0, 300, 200, ImageID(#Fond_Decoupe_H))
ImageGadget(#Fond_Decoupe_B, 0, 225, 300, 75, ImageID(#Fond_Decoupe_B))
ImageGadget(#Fond_Decoupe_G, 0, 200, 100, 25, ImageID(#Fond_Decoupe_G))
ImageGadget(#Fond_Decoupe_D, 200, 200, 100, 25, ImageID(#Fond_Decoupe_D))
; Bouton
ImageGadget(#Bouton, 100, 200, 100, 25, ImageID(#Bouton))
Repeat
Event = WaitWindowEvent()
Select Event
Case #WM_MOUSEMOVE
x = WindowMouseX(0)
y = WindowMouseY(0)
If x >= GadgetX(#Bouton) And x < GadgetX(#Bouton) + GadgetWidth(#Bouton) And y >= GadgetY(#Bouton) And y < GadgetY(#Bouton) + GadgetHeight(#Bouton)
If Bouton_Actif = 0
Bouton_Actif = 1
SetGadgetState(#Bouton, ImageID(#Bouton_Survol))
EndIf
ElseIf Bouton_Actif
Bouton_Actif = 0
SetGadgetState(#Bouton, ImageID(#Bouton))
EndIf
Case #PB_Event_Menu
Select EventMenu() ; Menus
EndSelect
Case #PB_Event_Gadget
Select EventGadget() ; Gadgets
Case #Bouton
Select EventType()
Case #PB_EventType_LeftClick
Debug "Clic gauche sur le bouton"
EndSelect
Case #Fond_Decoupe_H, #Fond_Decoupe_B, #Fond_Decoupe_D, #Fond_Decoupe_G
Select EventType()
Case #PB_EventType_LeftClick
Debug "Clic gauche sur le fond"
Case #PB_EventType_RightClick
Debug "Clic droit sur le fond"
EndSelect
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindowdonc totalement portable, je ferais comme cela
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 4
;
; Explication du programme :
; Pour faire des programmes de test rapidement, il ne reste qu'a rajouter les gadgets et la gestion des évènements.
Enumeration
#Fond
#Fond_Decoupe_H
#Fond_Decoupe_B
#Fond_Decoupe_D
#Fond_Decoupe_G
#Bouton
#Bouton_Survol
EndEnumeration
; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 300, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
End
EndIf
; le fond
CreateImage(#Fond, 300, 300)
StartDrawing(ImageOutput(#Fond))
For n = 0 To 299
Line(0, n, 300, 0, RGB(170 + 80 * n / 300, 170 + 80 * n / 300, 170 + 80 * n / 300))
Next
StopDrawing()
; le bouton
CreateImage(#Bouton, 100, 25)
StartDrawing(ImageOutput(#Bouton))
Box(1, 1, 98, 23, $FFFFFF)
DrawingMode(#PB_2DDrawing_Transparent)
Texte.s = "Bonjour"
DrawText((100 - TextWidth(Texte)) / 2, (25 - TextHeight(Texte)) / 2, Texte, $000000)
StopDrawing()
CreateImage(#Bouton_Survol, 100, 25)
StartDrawing(ImageOutput(#Bouton_Survol))
Box(1, 1, 98, 23, $00FF00)
DrawingMode(#PB_2DDrawing_Transparent)
Texte.s = "Au revoir"
DrawText((100 - TextWidth(Texte)) / 2, (25 - TextHeight(Texte)) / 2, Texte, $000000)
StopDrawing()
; Affichage
; On découpe le fond pour faire un trou pour le bouton
GrabImage(#Fond, #Fond_Decoupe_H, 0, 0, 300, 200)
GrabImage(#Fond, #Fond_Decoupe_B, 0, 225, 300, 75)
GrabImage(#Fond, #Fond_Decoupe_G, 0, 200, 100, 25)
GrabImage(#Fond, #Fond_Decoupe_D, 200, 200, 100, 25)
; Fond
ImageGadget(#Fond_Decoupe_H, 0, 0, 300, 200, ImageID(#Fond_Decoupe_H))
ImageGadget(#Fond_Decoupe_B, 0, 225, 300, 75, ImageID(#Fond_Decoupe_B))
ImageGadget(#Fond_Decoupe_G, 0, 200, 100, 25, ImageID(#Fond_Decoupe_G))
ImageGadget(#Fond_Decoupe_D, 200, 200, 100, 25, ImageID(#Fond_Decoupe_D))
; Bouton
ImageGadget(#Bouton, 100, 200, 100, 25, ImageID(#Bouton))
Repeat
Event = WaitWindowEvent(50)
If Souris_X <> WindowMouseX(0) Or Souris_Y <> WindowMouseY(0)
Souris_X = WindowMouseX(0)
Souris_Y = WindowMouseY(0)
If Souris_X >= GadgetX(#Bouton) And Souris_X < GadgetX(#Bouton) + GadgetWidth(#Bouton) And Souris_Y >= GadgetY(#Bouton) And Souris_Y < GadgetY(#Bouton) + GadgetHeight(#Bouton)
If Bouton_Actif = 0
Bouton_Actif = 1
SetGadgetState(#Bouton, ImageID(#Bouton_Survol))
EndIf
ElseIf Bouton_Actif
Bouton_Actif = 0
SetGadgetState(#Bouton, ImageID(#Bouton))
EndIf
EndIf
Select Event
Case #PB_Event_Gadget
Select EventGadget() ; Gadgets
Case #Bouton
Select EventType()
Case #PB_EventType_LeftClick
Debug "Clic gauche sur le bouton"
EndSelect
Case #Fond_Decoupe_H, #Fond_Decoupe_B, #Fond_Decoupe_D, #Fond_Decoupe_G
Select EventType()
Case #PB_EventType_LeftClick
Debug "Clic gauche sur le fond"
Case #PB_EventType_RightClick
Debug "Clic droit sur le fond"
EndSelect
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindowJe passe comme ça car le problème du fond avec un skin, c'est que les textgadget, bouton et autre ne le supporte pas bien.
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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]