L'utilisateur saisie un message qui sera affiché sur son screen et envoyé à un serveur qui lui même l'enverra aux autres client.
■ Contraintes:
- La saisie du message sera traitée avec la fonction KeyboardInkey()
- Le message envoyé avec la touche Entrée KeyboardReleased(#PB_Key_Return)
- La correction arrière d'un caractère avec la touche BackSpace KeyboardReleased(#PB_Key_Back)
- Le premier caractère sera toujours en majuscule.
- Le curseur de saisie clignotera.
- Les accents circonflexes seront traités.
- Les messages affichés à l’écran s'estompent du plus ancien ou plus récent.
- Je ne traiterais pas de l'envoie au serveur.
■ Code
Code : Tout sélectionner
EnableExplicit
Enumeration Font
#FontApp
#FontMessage
EndEnumeration
Structure NewSprite
id.i
x.i
y.i
opacity.f
text.s
EndStructure
Global NewList UserMessages.NewSprite()
Global Buffer.s, Character.s
Global ScreenBackground = RGB(75, 0, 130)
Global StringBackground = RGB(128, 128, 128)
Global FontColor = RGB(255, 255, 255)
Global CursorToken = 1, CursorTimer = 0, CursorColor
Global Circumflex.b
Declare Start()
Declare MessageInsert(UserMessage.s)
Declare MessageDisplay()
Declare onTimer()
Start()
Procedure Start()
InitSprite()
InitKeyboard()
InitMouse()
;Font des messages affichés
LoadFont(#FontMessage, "", 11)
OpenWindow(0, 0, 0, 0, 0, "FullScreen", #PB_Window_BorderLess | #PB_Window_Maximize)
;Timer de gestion du curseur (500 ms)
AddWindowTimer(0, CursorTimer, 500)
BindEvent(#PB_Event_Timer, @onTimer(), 0, CursorTimer)
OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0), WindowHeight(0))
;Message de bienvenue
MessageInsert("Welcome, Bienvenue ....")
MessageInsert("Enter your message and press the enter key")
MessageInsert("Escape key to exit")
;Boucle
Repeat
Repeat : Until WindowEvent() = 0
ClearScreen(ScreenBackground)
ExamineKeyboard()
If KeyboardReleased(#PB_Key_Return)
If Len(buffer) <> 0
MessageInsert(Buffer)
Buffer = ""
EndIf
ElseIf KeyboardReleased(#PB_Key_Back)
Buffer = Left(Buffer, Len(Buffer)-1)
Else
Character = KeyboardInkey()
;Traitement de l'accent circonflex
If Asc(Character) = 24158
Circumflex = #True
EndIf
;Les caractéres à controler.
If FindString("1234567890 @/?,;.!:()éàèâêîôûç'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", Character)
;Traitement de l'accent circonflexe
If Circumflex
Select Character
Case "a" : Character = "â"
Case "e" : Character = "ê"
Case "i" : Character = "î"
Case "o" : Character = "ô"
Case "u" : Character = "û"
EndSelect
Circumflex = #False
EndIf
;Le premier caractére sera en majuscule
If Len(Buffer) = 0
Buffer + UCase(Character)
Else
Buffer + Character
EndIf
EndIf
EndIf
;Dessin de la zone de saisie
If StartDrawing(ScreenOutput())
RoundBox(20, ScreenHeight() - 50, ScreenWidth() - 60, 30, 4, 4, RGB(128, 128, 128))
DrawingMode(#PB_2DDrawing_Transparent)
FrontColor(FontColor)
DrawText(25, ScreenHeight() - 45, Buffer)
DrawText(25 + TextWidth(Buffer), ScreenHeight() - 45, "|", CursorColor)
StopDrawing()
EndIf
;Affichage des messages
MessageDisplay()
FlipBuffers()
Until KeyboardReleased(#PB_Key_Escape)
EndProcedure
;Ajout d'un message dans la pile des messages à afficher à l'écran
Procedure MessageInsert(UserMessage.s)
;Ajout du message
AddElement(UserMessages())
UserMessages()\text = UserMessage
;Création du sprite correspondant au message
UserMessages()\id = CreateSprite(-1, ScreenWidth(), 24, #PB_Sprite_AlphaBlending)
UserMessages()\x = 20
UserMessages()\y = 50
UserMessages()\opacity = 255
If StartDrawing(SpriteOutput(UserMessages()\id))
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0, 0, ScreenWidth(), 24, RGBA(0, 0, 0, 0))
DrawingFont(FontID(#FontMessage))
DrawText(0, 0, UserMessages()\text, RGBA(255, 255, 255, 255), RGBA(0, 0, 0, 0))
StopDrawing()
EndIf
EndProcedure
;Affichage de la pile de messages
Procedure MessageDisplay()
ForEach UserMessages()
;Affichage du message
UserMessages()\y = (ScreenHeight() - 24 * (ListSize(UserMessages()) - ListIndex(UserMessages()))) - 70
UserMessages()\opacity - 0.2
DisplayTransparentSprite(UserMessages()\id, UserMessages()\x , UserMessages()\y , UserMessages()\opacity)
;Suppression du message si transparent
If UserMessages()\opacity < 0
FreeSprite(UserMessages()\id)
DeleteElement(UserMessages())
EndIf
Next
EndProcedure
Procedure onTimer()
CursorToken * -1
If CursorToken = 1
CursorColor = FontColor
Else
CursorColor = StringBackground
EndIf
EndProcedure