Page 1 sur 1
[R] _GDIPlus et la disparition
Posté : jeu. 08 déc. 2011 15:19
par TommyDDR
Suite au message de mikell :
http://autoitscript.fr/forum/viewtopic. ... 288#p59288
mikell a écrit :Bah autant préserver ses synapses et utiliser GDI+ et les exemples de l'aide
► Afficher le texte
Code : Tout sélectionner
#include <GDIPlus.au3>
$hGUI = GUICreate("GDI+", 400, 300)
GUISetState()
_GDIPlus_Startup ()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hGUI)
$hPen = _GDIPlus_PenCreate(0xFF000000, 2)
_GDIPlus_GraphicsDrawLine ($hGraphic, 10, 150, 390, 10, $hPen)
Do
Until GUIGetMsg() = -3 ;$GUI_EVENT_CLOSE
_GDIPlus_PenDispose ($hPen)
_GDIPlus_GraphicsDispose ($hGraphic)
_GDIPlus_Shutdown ()
Edit
des scripts de labyrinthe yen a même plusieurs
J'en profite pour demander si quelqu'un sait comment faire en sorte le dessin ne disparaisse pas en utilisant GDIPlus, dessiner un trait, mettre une fenêtre par dessus pour cacher le dessin, puis pousser cette même fenêtre pour le faire réapparaitre.
Testez le code de mikell, placez une fenêtre par dessus le trait, enlevez là, vous constaterez que le dessin à été effacé.
De plus, si vous utilisez CV (Un AutoIt Windows Info qui était, il me semblait dans le tableau des étoiles, Tlem pourras peut être nous éclairer sur le pourquoi il n'y est plus.) vous constaterez qu'il y a un aperçu qui ne disparait pas lorsque l'on passe une fenêtre par dessus.
Donc, c'est possible !
Merci à celui qui trouvera.
Re: [..] _GDIPlus et la disparition
Posté : jeu. 08 déc. 2011 15:32
par jchd
Il n'y a pas de "redraw" automatique avec GDI+, donc recouvert = effacé.
AU3Info n'est pas écrit en AutoIt mais en C++ pour autant que je sache. Je n'ai pas vu le source mais je parie qu'il s'appuye sur MFC ou un autre framework qui prend en charge le redraw automagiquement.
Re: [..] _GDIPlus et la disparition
Posté : jeu. 08 déc. 2011 17:57
par mikell
On peut régler le pb comme ça :
► Afficher le texte
Code : Tout sélectionner
#include <GDIPlus.au3>
#Include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
$hGUI = GUICreate("GDI+", 400, 300)
GUISetState()
GUIRegisterMsg(0xF, "MY_PAINT")
_GDIPlus_Startup ()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hGUI)
$hPen = _GDIPlus_PenCreate(0xFF000000, 2)
_GDIPlus_GraphicsDrawLine ($hGraphic, 10, 150, 390, 10, $hPen)
Do
Until GUIGetMsg() = -3 ;$GUI_EVENT_CLOSE
_GDIPlus_PenDispose ($hPen)
_GDIPlus_GraphicsDispose ($hGraphic)
_GDIPlus_Shutdown ()
Func MY_PAINT($hWnd, $msg, $wParam, $lParam)
_WinAPI_RedrawWindow($hGUI, "", "", BitOR($RDW_INVALIDATE, $RDW_UPDATENOW))
_GDIPlus_GraphicsDrawLine ($hGraphic, 10, 150, 390, 10, $hPen)
Return $GUI_RUNDEFMSG
EndFunc ;==>MY_PAINT
mais si on est réfractaire aux GUIRegisterMsg (ce qui est mon cas

) ya cette solution un peu plus compliquée mais intéressante
► Afficher le texte
Code : Tout sélectionner
#include <GDIPlus.au3>
$hGUI = GUICreate("GDI+", 400, 300)
$Pic = GUICtrlCreatePic("", 0, 0, 400, 300)
GUISetState()
_SetPic($hGui, ControlGetHandle($hGui, "", $Pic))
Do
Until GUIGetMsg() = -3 ;$GUI_EVENT_CLOSE
Func _SetPic($hWnd, $hPic )
Local $aBmp, $hbmp, $MainImage, $MainGraphic, $hGraphic
_GDIPlus_Startup()
[color=#008000];on crée une image[/color]
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
$MainImage = _GDIPlus_BitmapCreateFromGraphics(400, 300, $hGraphic)
$MainGraphic = _GDIPlus_ImageGetGraphicsContext($MainImage)
_GDIPlus_GraphicsClear($MainGraphic, 0xff0000)
[color=#008000]; on y met ce qu'on veut[/color]
$hPen = _GDIPlus_PenCreate(0xFF000000, 2)
_GDIPlus_GraphicsDrawLine ($MainGraphic, 10, 150, 390, 10, $hPen)
[color=#008000]; on balance l'image dans la gui [/color]
$hbmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($MainImage)
$aBmp = DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hPic, "int", "0x0172", "int", "0", "int", $hbmp)
If $aBmp[0] <> 0 Then _WinAPI_DeleteObject($aBmp[0])
_WinAPI_DeleteObject($hbmp)
[color=#008000]; et on nettoie[/color]
_GDIPlus_PenDispose ($hPen)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_GraphicsDispose($MainImage)
_GDIPlus_GraphicsDispose($MainGraphic)
_GDIPlus_Shutdown()
EndFunc
Re: [..] _GDIPlus et la disparition
Posté : ven. 09 déc. 2011 21:57
par TommyDDR
@jchd, je ne parle pas de autoit windows info justement, je parle de CV, je ne retrouve plus le lien donc je le poste, et il est bien en autoit.
@mikell, je me penche sur ton code.
Re: [..] _GDIPlus et la disparition
Posté : ven. 09 déc. 2011 21:58
par Tlem
TommyDDR a écrit :je ne retrouve plus le lien
C'était pourtant simple :
http://www.autoitscript.fr/forum/viewto ... =37&t=8081
Dans la section
Outils Divers !!!
Re: [..] _GDIPlus et la disparition
Posté : lun. 12 déc. 2011 09:13
par TommyDDR
Ah, je me disais bien qu'il ne pouvait pas disparaître du forum comme ça !
@jchd, si tu as le temps de te pencher dessus, peux tu me dire comment le dessin fait pour redessiner ?
... Au temps pour moi, il passe par une écriture dans un GUICtrlCreatePic.
Résolu.
Re: [R] _GDIPlus et la disparition
Posté : lun. 12 déc. 2011 14:40
par jchd
Bon sang, je n'avais pas vu celui-là. Faut dire que j'ai parfois du mal à suivre tout, surtout les trucs dont je ne me sers pas.
Yashied est toujours au top !
Oui, une fois dans un contrôle, plus besoin de s'en préoccuper. Tandis que dans la "client area" hors contrôles, c'est pour tes pieds (et heureusement).