Mon MessageResqueter Perso ...
- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
mon message requester a moi
j'ai voulu faire un truc comme en gfa basic sur atari pour les connaisseurs ^^
enregistrez cette image dans le répertoire ou vous compilez l'exemple

ou commentez la ligne pour charger l'image
ou utilisez votre propre image XD

enregistrez cette image dans le répertoire ou vous compilez l'exemple

ou commentez la ligne pour charger l'image
ou utilisez votre propre image XD
Code : Tout sélectionner
;----------------------------------------------------------------------
;boite de dialogue comme en gfa sur atari st
;syntaxe : requester(titre$,texte$,reponses$[,image])
;le titre de la fenetre est une chaine de caractere normale
;le texte est multiligne les lignes sont séparées par le caractere |
;le nombre de reponses possible est illimité (sauf par la taille de l'ecran)
;chaque bouton est delimité par le caractere |
;il est posible de specifier une image comme icone elle sera positionée en haut a gauche de la fenetre
;---------------------------------------------------------------------
;auteur Case,forums pure basic. domaine public
Procedure requester(req_title$,req_txt$,req_reply$,req_icon=0)
req_lines=CountString(req_txt$,"|")+1
req_winheight=req_lines*16
; verifie la plus grande longueur de chaine dans le résumé
For req_a=1 To req_lines
req_l=Len(StringField(req_txt$,req_a,"|"))
If req_mx<req_l
req_mx=req_l
EndIf
Next
;verrifie si le contenu des boutons au total est plus grand que laplus grande des chaines
If req_mx<Len(req_reply$)+2
req_mx=Len(req_reply$)+2
EndIf
;verifie la presence d'une image en tant qu'icone et modifie la taille de la fenetre en focntion
If req_icon<>0
req_icon_h=ImageHeight(req_icon)+4
req_icon_w=ImageWidth(req_icon)+4
If req_winheight<req_icon_h
req_winheight=req_icon_h
EndIf
Else
req_icon_h=0
req_icon_w=0
EndIf
;ouvre la fenetre
req_main=OpenWindow(#PB_Any,0,0,req_mx*6+req_icon_w,req_winheight+20,req_title$,#PB_Window_TitleBar| #PB_Window_ScreenCentered)
;ecrit les lignes de texte
For req_a=0 To req_lines-1
TextGadget(#PB_Any,req_icon_w,req_a*16,req_mx*6,16,StringField(req_txt$,req_a+1,"|"))
Next
;cree les boutons
req_nb_b=CountString(req_reply$,"|")+1
NewList req_buttons()
req_butsize=(WindowWidth(req_main))/req_nb_b
For req_a=1 To req_nb_b
AddElement(req_buttons())
req_buttons()=ButtonGadget(#PB_Any,(req_a-1)*req_butsize,req_winheight,req_butsize,20,StringField(req_reply$,req_a,"|"))
Next
Repeat
If req_icon<>0
StartDrawing(WindowOutput(req_main))
DrawImage(ImageID(req_icon),0,0)
StopDrawing()
EndIf
req_ev=WaitWindowEvent()
Until req_ev=#PB_Event_Gadget
ForEach req_buttons()
If req_buttons()=EventGadget()
req_ret=ListIndex(req_buttons())
ClearList(req_buttons())
CloseWindow(req_main)
ProcedureReturn req_ret+1 ; pour eviter de renvoyer un zero
EndIf
Next
ProcedureReturn 0 ; erreur
EndProcedure
; exemple d'utilisation
UsePNGImageDecoder()
img=LoadImage(#PB_Any,"Image2.png") ; charger une image pour l'exemple
;
reply=requester("boite d'alerte GFA like","enorme j'en ai révé|c'est a ma portée enfin|et super flexible","ok|mitho|lol")
Select reply
Case 1
requester("fin du programme","jeul savais","ok",img)
Case 2
requester("Mitho","comment ca mitho ?","je m'excuse",img)
Case 3
requester("lol ?", "rien d'amusant la dedans","pas drole",img)
EndSelect
Dernière modification par case le dim. 23/août/2009 0:00, modifié 1 fois.
la taille de la fenêtre est calculée en multipliant le nombre de caractères par une valeur arbitraire, 6 horizontalement et 16 verticalement, ce qui si l'on a pas la même police de caractère ni la même taille de police est imprécis.
je n'ai pas trouvé le moyen de calculer la taille exacte en pixel des textes
textwidth() et textheight() nécessite un écran d'ouvert ou une fenêtre, ceci dit je n'ouvre la fenêtre qu'une fois sa taille calculée... donc je ne peux pas connaitre a l'avance la taille exact du texte utilisé par le requester
si quelqu'un a une idée ,)
dobro il s'enflamme il vois déjà mon code intégré a pb
je n'ai pas trouvé le moyen de calculer la taille exacte en pixel des textes
textwidth() et textheight() nécessite un écran d'ouvert ou une fenêtre, ceci dit je n'ouvre la fenêtre qu'une fois sa taille calculée... donc je ne peux pas connaitre a l'avance la taille exact du texte utilisé par le requester
si quelqu'un a une idée ,)
dobro il s'enflamme il vois déjà mon code intégré a pb

- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
Peut-être que l'API GetTextExtentPoint32() peut t'aider.
je peux pas t'en dire plus ni tester, je suis en version Demo de PB
doc de l'API ici : GetTextExtentPoint32
je peux pas t'en dire plus ni tester, je suis en version Demo de PB

doc de l'API ici : GetTextExtentPoint32
Pour TextWidth() comme pour GetTextExtentPoint32_(), il faut un contexte (hdc).
On peut cacher la fenêtre, faire les calculs, redimensionner les gadgets et/ou la fenêtre), puis afficher la fenêtre.
Exemple rapide :
On peut cacher la fenêtre, faire les calculs, redimensionner les gadgets et/ou la fenêtre), puis afficher la fenêtre.
Exemple rapide :
Code : Tout sélectionner
Procedure GadgetTextWidth(Gagdet, GagdetText.s)
Protected Size.Size, hdc, hFontOld
hdc = GetDC_(GadgetID(Gagdet))
hFontOld = SelectObject_(hdc, GetGadgetFont(Gagdet))
GetTextExtentPoint32_(hdc, @GagdetText, Len(GagdetText), @Size)
SelectObject_(hdc, hFontOld)
ReleaseDC_(GadgetID(Gagdet), hdc)
ProcedureReturn Size\cx
EndProcedure
If OpenWindow(0, 450, 200, 380, 104, "Largeur en fonction du texte", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_Invisible)
Texte.s = "Texte du bouton (essayez différentes longueurs !)"
ButtonGadget(0, 0, 32, 0, 36, Texte)
SetGadgetFont(0, LoadFont(0, "Arial", 10))
ResizeGadget(0, #PB_Ignore, #PB_Ignore, GadgetTextWidth(0, Texte) + GetSystemMetrics_(#SM_CXEDGE) * 2, #PB_Ignore)
ResizeWindow(0, #PB_Ignore, #PB_Ignore, GadgetWidth(0), #PB_Ignore)
HideWindow(0, #False)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
Break
EndSelect
ForEver
EndIf
et pourquoi pas !!.??case a écrit : dobro il s'enflamme il vois déjà mon code intégré a pb
comme je l'ai suggeré sur le forum anglais
on peut tres bein faire avancer le langage, en y mettant nos contributions
cela permetrai d'enrichire les bibliotheques , sans avoir a recourir a des lib externe !!
de plus cela donnerai de la motivation de la part des membres !!
bien sur ce serai du "boulot" benevole , sans rémunerations , mais notre rémuneration, serai que le langage Purebasic serai a notre image !!

ptete pas si con mon idée non ?
-
- Messages : 471
- Inscription : dim. 23/déc./2007 18:10
Salut.
Hummmm!!!! ça sent bon part ici, je vois que case a concocté une bonne petite mixture.
Comme je disait dans mon 3ème post ici, j'avais trouvé un petit code sympa pour faire un messageRequester perso.
Mais j'aurais eu pas mal de boulot pour supprimer tout ce qui était inutile pour moi.
Tu utilises un peu le même principe que lui, pour le système des séparateurs qui détermine chaque lignes de texte et chaque boutons.
Sauf que ton code est juste ce qu'il faut pour ma pomme.
A première vue, il n'y a pas d'Api Windows, donc no problemo sous Linux
Si tu vas voir mon post, tu verras que Dobro a filé une super combine (pour windows) pour ce qui est des sons d'avertissements.
Merci d'avance, tu m'as mâché le travail.
Bye.
[EDIT] C'était plus fort que moi, j'ai donc testé sous Linux et cela se comporte bien.
Par contre de petits problèmes d'apparence à cause d'une police trop grosse, mais bon je pense que je réussirais à m'en sortir, le code n'est pas trop complexe.
Petit défaut aussi, on ne peut pas mettre de long mot sur les boutons.
Ex : Annuler.
Mais bon, pas trop dur de mon côté à trouver l'astuce, puisqu'il n'y aura que les noms de bouton habituel d'un messageRequester classique.
Donc à chaque mot je determinerais une taille qui sera OK chez Win et Nux.
Hummmm!!!! ça sent bon part ici, je vois que case a concocté une bonne petite mixture.
Comme je disait dans mon 3ème post ici, j'avais trouvé un petit code sympa pour faire un messageRequester perso.
Mais j'aurais eu pas mal de boulot pour supprimer tout ce qui était inutile pour moi.
Tu utilises un peu le même principe que lui, pour le système des séparateurs qui détermine chaque lignes de texte et chaque boutons.
Sauf que ton code est juste ce qu'il faut pour ma pomme.
A première vue, il n'y a pas d'Api Windows, donc no problemo sous Linux

Si tu vas voir mon post, tu verras que Dobro a filé une super combine (pour windows) pour ce qui est des sons d'avertissements.
Merci d'avance, tu m'as mâché le travail.
Bye.
[EDIT] C'était plus fort que moi, j'ai donc testé sous Linux et cela se comporte bien.
Par contre de petits problèmes d'apparence à cause d'une police trop grosse, mais bon je pense que je réussirais à m'en sortir, le code n'est pas trop complexe.
Petit défaut aussi, on ne peut pas mettre de long mot sur les boutons.
Ex : Annuler.
Mais bon, pas trop dur de mon côté à trouver l'astuce, puisqu'il n'y aura que les noms de bouton habituel d'un messageRequester classique.
Donc à chaque mot je determinerais une taille qui sera OK chez Win et Nux.
-
- Messages : 471
- Inscription : dim. 23/déc./2007 18:10
Tiens essaies ça :
Bon ok le mot "aagggggggggggggggggggggggggggggggggggggaa" ne se trouve pas dans le dico, mais il y a peut-être cause d'un potentiel bug.
Et pour tout ce que j'ai dit dans mon EDIT, cela se passe sous Linux.
Et comme dit dans mon précédent message, t'inquiètes je vais réussir à adapter
C'est juste ce qu'il me fallait, tu as dû lire dans mes pensées.
Bye.
Code : Tout sélectionner
reply=requester("boite d'alerte GFA like","enorme j'en ai révé|c'est a ma portée enfin|et super flexible","j'ai essayé avec anticonstitutionnellement et ca passe|aagggggggggggggggggggggggggggggggggggggaa|ca passe")
Et pour tout ce que j'ai dit dans mon EDIT, cela se passe sous Linux.
Et comme dit dans mon précédent message, t'inquiètes je vais réussir à adapter

C'est juste ce qu'il me fallait, tu as dû lire dans mes pensées.
Bye.