en créant une sorte de paint online, j'ai eu comme soucis la disparition du dessin lorsque la fenêtre sort de l'écran (et lorsqu'une autre fenêtre passe dessus sous XP). J'aimerais savoir s'il existe une façon de remédier à ce problème.
Et sinon, comment pourrais-je faire en sorte qu'à la connexion d'un nouveau client, celui-ci récupère ce qui a déjà été dessiné précédemment sur ce même serveur.
Merci d'avance.
Voici le code (version TommyDDR à 99.99%) au cas où :
► Afficher le texteClient
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
#include <ScreenCapture.au3>
Opt("GUIOnEventMode", 1)
Opt("MouseCoordMode", 2)
Opt("MustDeclareVars", 1)
Dim $IP = @IPAdress1
Dim $Port = 27017
Dim $ASCII3 = StringLeft(BinaryToString(3), 1) & "§EnD"
Dim $Socket = 0
Dim $Buffer = ""
Dim $Recv = ""
Dim $test = ""
Dim $Gui
Dim $GuiBis
Dim $GuiUse
Dim $GuiCouleurs
Dim $MyhWnd
Dim $bConnect = False
Dim $TailleFenetre[2] = [800, 600]
Dim $PositionSousFenetre[2] = [35, 10]
Dim $TailleSousFenetre[2] = [$TailleFenetre[0]-$PositionSousFenetre[0]-10, $TailleFenetre[1]-$PositionSousFenetre[1]-10]
Dim $Couleurs[8][2] = [[-1, 0x000000], [-1, 0xFFFFFF], [-1, 0xFF0000], [-1, 0x00FF00], [-1, 0x0000FF], [-1, 0xFFFF00], [-1, 0x00FFFF], [-1, 0xFF00FF]]
Dim $BoutonPrintScreen
Dim $CouleurUse = 0
Dim $TailleCrayonUse = 5
HotKeySet("²", "debug")
Func debug()
ToolTip($test)
EndFunc
ToolTip("Connexion en cours...", (@DesktopWidth/2)-50, (@DesktopHeight/2)-5)
TCPStartup()
Do
$Socket = TCPConnect($IP, $Port)
If($Socket <= 0) Then
Sleep(1000)
EndIf
Until($Socket > 0)
ToolTip("")
$Gui = GUICreate("Tableau Blanc", $TailleFenetre[0], $TailleFenetre[1])
GUISetOnEvent($GUI_EVENT_CLOSE, "quit")
GUISetState()
$GuiBis = GUICreate("", $TailleSousFenetre[0], $TailleSousFenetre[1], $PositionSousFenetre[0], $PositionSousFenetre[1], $WS_CHILD, $WS_EX_CLIENTEDGE, $Gui)
GUISetBkColor(0xFFFFFF)
GUISetState()
$GuiCouleurs = GUICreate("", $PositionSousFenetre[0]-20, 1000, 10, 10, $WS_CHILD, -1, $Gui)
For $i = 0 To UBound($Couleurs, 1)-1
$Couleurs[$i][0] = GUICtrlCreateLabel("", 0, $i*16, 15, 15, $SS_SUNKEN)
GUICtrlSetBkColor($Couleurs[$i][0], $Couleurs[$i][1])
GUICtrlSetOnEvent($Couleurs[$i][0], "ChangerCouleur")
Next
$BoutonPrintScreen = GUICtrlCreateLabel( "Enregistrer", 0, 256, 15, 15 )
GUICtrlSetOnEvent( $BoutonPrintScreen, "OnEventPrintScreen")
GUISetState()
$GuiUse = $GuiBis
$MyhWnd = WinGetHandle($GuiUse)
ChargerCouleur($TailleCrayonUse, $Couleurs[$CouleurUse][1])
While(True)
$Recv = TCPRecv($Socket, 2048, 1)
If($Recv <> "") Then
;~ ToolTip(BinaryToString($Recv))
Recv($Recv)
EndIf
If((BitAND(WinGetState($Gui), 8) = 8 Or $GuiUse = 0) And _IsPressed("01")) Then
Dessiner($GuiUse)
EndIf
Sleep(10)
WEnd
Func Recv($Donnee)
AdlibRegister("CheckCo", 5000)
$Buffer &= BinaryToString($Donnee)
;~ ToolTip($Buffer)
If(StringRight($Buffer, 5) = $ASCII3) then
$Buffer = StringTrimRight($Buffer, 5)
Local $Commandes = StringSplit($Buffer, $ASCII3, 1)
For $i = 1 To $Commandes[0]
$test &= $Commandes[$i] & @CRLF
If(StringLeft($Commandes[$i], 8) = "Connecté") Then
$bConnect = True
ElseIf($Commandes[$i] = "CheckCo") Then
;~ Ok
ElseIf(StringLeft($Commandes[$i], 8) = "Dessiner") Then
$Commandes[$i] = StringTrimLeft($Commandes[$i], 8)
;~ ToolTip($Commandes[$i])
DessinerDistance($Commandes[$i], $GuiUse)
EndIf
Next
$Buffer = ""
EndIf
EndFunc
Func CheckCo()
Envoyer("CheckCo")
EndFunc
Func Envoyer($Donnee)
If(TCPSend($Socket, $Donnee & $ASCII3) = 0) Then
AdlibUnRegister("CheckCo")
MsgBox(0, "", "ServDown")
EndIf
EndFunc
Func DessinerDistance($Recv, $GuiUse)
;~ ToolTip($Recv)
Local $bChange
$Recv = StringSplit($Recv, "|")
If("0x" & $Recv[2] <> InverserCouleur(String(Hex($Couleurs[$CouleurUse][1])))) Then
$bChange = True
EndIf
Local $MyHDC = DLLCall("user32.dll","int","GetDC","hwnd",$GuiUse)
If(Not(@error)) Then
If($bChange) Then
ChargerCouleur($Recv[1], $Recv[2])
EndIf
;~ $test &= $Recv[1] & ", " & $Recv[2] & ", " & $Recv[3] & ", " & $Recv[4] & @CRLF
DLLCall("gdi32.dll", "int", "MoveToEx", "ptr", $MyHDC[0], "int", $Recv[3], "int", $Recv[4], 'ptr', 0)
DLLCall("gdi32.dll", "int", "LineTo", "int", $MyHDC[0], "int", $Recv[5], "int", $Recv[6])
If($bChange) Then
ChargerCouleur($TailleCrayonUse, String(Hex($Couleurs[$CouleurUse][1])))
EndIf
EndIf
DLLCall("user32.dll","int","ReleaseDC","int",$MyHDC[0],"hwnd",0)
EndFunc
Func Dessiner($GuiUse)
Local $Dessiner[2]
Local $BordureCote
Local $AnciennePos[2] = [-1, -1]
Local $MyHDC = DLLCall("user32.dll","int","GetDC","hwnd",$GuiUse)
If(Not(@error)) Then
$Dessiner = MouseGetPos()
$Dessiner[0] -= $PositionSousFenetre[0]+Floor($TailleCrayonUse/2)
$Dessiner[1] -= $PositionSousFenetre[1]+Floor($TailleCrayonUse/2)
If(Not(@error)) Then
DLLCall ("gdi32.dll", "int", "MoveToEx", "ptr", $MyHDC[0], "int", $Dessiner[0], "int", $Dessiner[1], 'ptr', 0)
While(_IsPressed("01"))
$Dessiner = MouseGetPos()
$Dessiner[0] -= $PositionSousFenetre[0]+Floor($TailleCrayonUse/2)
$Dessiner[1] -= $PositionSousFenetre[1]+Floor($TailleCrayonUse/2)
If($Dessiner[0] <> $AnciennePos[0] Or $Dessiner[1] <> $AnciennePos[1])Then
If($AnciennePos[0] = -1 And $AnciennePos[1] = -1) Then
$AnciennePos[0] = $Dessiner[0]
$AnciennePos[1] = $Dessiner[1]
EndIf
DLLCall ("gdi32.dll", "int", "MoveToEx", "ptr", $MyHDC[0], "int", $AnciennePos[0], "int", $AnciennePos[1], 'ptr', 0)
DLLCall ("gdi32.dll", "int", "LineTo", "int", $MyHDC[0], "int", $Dessiner[0], "int", $Dessiner[1])
Envoyer("Dessiner" & $TailleCrayonUse & "|" & string(Hex($Couleurs[$CouleurUse][1])) & "|" & $AnciennePos[0] & "|" & $AnciennePos[1] & "|" & $Dessiner[0] & "|" &$Dessiner[1])
$AnciennePos[0] = $Dessiner[0]
$AnciennePos[1] = $Dessiner[1]
EndIf
Sleep(10)
WEnd
EndIf
EndIf
DLLCall("user32.dll","int","ReleaseDC","int",$MyHDC[0],"hwnd",0)
EndFunc
Func ChangerCouleur()
For $i = 0 To UBound($Couleurs, 1)-1
If($Couleurs[$i][0] = @GUI_CtrlId) Then
$CouleurUse = $i
ChargerCouleur($TailleCrayonUse, String(Hex($Couleurs[$CouleurUse][1])))
ExitLoop
EndIf
Next
EndFunc
Func ChargerCouleur($Taille, $Couleur)
$Couleur = InverserCouleur($Couleur)
Local $MyHDC = DLLCall("user32.dll","int","GetDC","hwnd", $GuiUse)
Local $pen = DllCall("gdi32.dll", "int", "CreatePen", "int", 0, "int", $Taille, "int", $Couleur)
DllCall("gdi32.dll", "int", "SelectObject", "int", $MyHDC[0], "int", $pen[0])
DLLCall("user32.dll","int","ReleaseDC","int",$MyHDC[0],"hwnd",0)
EndFunc
Func InverserCouleur($Couleur)
Local $Retour = $Couleur
;~ ToolTip($Couleur & @CRLF & StringRight($Retour, 2) & @CRLF & StringMid($Retour, 5, 2) & @CRLF & StringMid($Retour, 3, 2))
$Retour = "0x00" & StringRight($Retour, 2) & StringMid($Retour, 5, 2) & StringMid($Retour, 3, 2)
Return $Retour
EndFunc
Func OnEventPrintScreen()
Local $hBmp
Local $fFreeBmp
Local $date = @HOUR & @MIN & @SEC
Local $PosWindow = WinGetPos("Tableau Blanc")
Local $LocationBmp = @MyDocumentsDir & "\" & $date & "_Image.jpg"
$hBmp = _ScreenCapture_Capture("" , $PosWindow[0]+40 , $PosWindow[1]+34 , $PosWindow[0]+790 , $PosWindow[1]+610 , False)
_ScreenCapture_SaveImage ($LocationBmp, $hBmp, $fFreeBmp)
EndFunc
Func quit()
Exit
EndFunc
► Afficher le texteServeur
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
Opt("MustDeclareVars", 1)
Opt("GUIOnEventMode", 1)
Dim $Gui
Dim $SrvIP = @IPAddress1
Dim $SrvPort = "27017"
Dim $NombreClients = 0
Dim $ASCII3 = StringLeft(BinaryToString(3), 1) & "§EnD"
Dim $Liste
Dim $Clients[1]
Dim $ListeClients[1]
TCPStartup()
Dim $MainSocket = TCPListen($SrvIP, $SrvPort)
$Gui = GUICreate("test", 300, 300)
$Liste = GUICtrlCreateListView("Socket", 5, 5, 295, 295)
GUISetOnEvent($GUI_EVENT_CLOSE, "quit")
GUISetState()
Local $Socket
Local $Recv
AdlibRegister("CheckCo", 5000)
While(True)
$Socket = TCPAccept($MainSocket)
If($Socket <> -1) Then
ConnexionClient($Socket)
EndIf
For $i = 0 To UBound($Clients)-2
$Recv = TCPRecv($Clients[$i], 2048, 1)
If($Recv <> "") Then
;~ ToolTip(BinaryToString($Recv))
BroadCast(BinaryToString($Recv), $Clients[$i], False)
EndIf
Next
Wend
Func ConnexionClient($Socket)
$Clients[$NombreClients] = $Socket
$ListeClients[$NombreClients] = GUICtrlCreateListViewItem($Socket, $Liste)
$NombreClients += 1
Redim $Clients[$NombreClients+1]
Redim $ListeClients[$NombreClients+1]
Envoyer($Socket, "Connecté")
EndFunc
Func CheckCo()
Broadcast("CheckCo")
EndFunc
Func Broadcast($Donnee, $Socket = -1, $Ascii = True)
For $i = 0 To UBound($Clients, 1)-2
If($Clients[$i] <> $Socket) Then
Envoyer($Clients[$i], $Donnee, $Ascii)
EndIf
Next
EndFunc
Func Envoyer($Socket, $Donnee, $Ascii = True)
If($Ascii) Then
$Donnee &= $ASCII3
EndIf
If(TCPSend($Socket, $Donnee) = 0) Then
For $i = 0 To UBound($Clients, 1)-1
;~ ToolTip($Clients[$i] & " = " & $Socket)
If($Clients[$i] = $Socket) Then
;~ ToolTip($i)
GUICtrlDelete($ListeClients[$i])
For $j = $i To UBound($Clients, 1)-2
$Clients[$j] = $Clients[$j+1]
$ListeClients[$j] = $ListeClients[$j+1]
Next
ExitLoop
EndIf
Next
$NombreClients -= 1
ReDim $Clients[$NombreClients+1]
TCPCloseSocket($Socket)
EndIf
EndFunc
Func quit()
Exit
EndFunc



