Jump to content
Sign in to follow this  
Nothing2Lose

Draw a line...

Recommended Posts

Nothing2Lose

Hi,

I am writing a script using GDI+ library. I want to draw to lines (Horizontal & Vertical) through a point (coordinate = mouse coordinate) and delete the old lines when mouse move. I used Redrawwindow. It deleted the lines perfectly but the screen ... (you know, like refreshing desktop). That's my trouble. Can anyone help me? Thank you!

Share this post


Link to post
Share on other sites
UEZ

Is this what you mean?

#include <GDIPLus.au3>
#include <GUIConstants.au3>
Opt("MouseCoordMode", 2)
Opt("GUIOnEventMode", 1)

$w = 400
$h = 400
$hWnd = GUICreate("GDI+ Test", 400, 400)
GUISetState()

_GDIPlus_Startup()

$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics(400, 400, $hGraphic)
$hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
$hPen = _GDIPlus_PenCreate(0xFF000000, 2)
_GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)

GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
AdlibRegister("_ReDraw", 20)
GUIRegisterMsg(0x000F, "_ReFresh") ;$WM_PAINT = 0x000F
OnAutoItExitRegister("_Exit")

While Sleep(2000)
WEnd

Func _ReDraw()
    _GDIPlus_GraphicsClear($hBuffer, 0xFFFFFFFF)
    _GDIPlus_GraphicsDrawEllipse($hBuffer, 0, 0, $w, $h, $hPen)
    $mpos = MouseGetPos()
    If $mpos[0] > 0 And $mpos[0] < $w And $mpos[1] > 0 And $mpos[1] < $h Then
        _GDIPlus_GraphicsDrawLine($hBuffer, $mpos[0], 0, $mpos[0], $h, $hPen)
        _GDIPlus_GraphicsDrawLine($hBuffer, 0, $mpos[1], $w, $mpos[1], $hPen)
    EndIf
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $w, $h)
EndFunc

Func _ReFresh()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $w, $h)
    Return "GUI_RUNDEFMSG"
EndFunc

Func _Exit()
    GUIRegisterMsg(0x000F, "")
    AdlibUnRegister("_ReDraw")
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    GUIDelete($hWnd)
    Exit
EndFunc

Br,

UEZ

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites
Nothing2Lose

Thanks! I want to draw them on the desktop ;)

Share this post


Link to post
Share on other sites
UEZ

And what about this version?

;coded by UEZ
#include <GDIPLus.au3>
#include <GUIConstants.au3>
#include <WindowsConstants.au3>

Opt("MouseCoordMode", 0)
Opt("GUIOnEventMode", 1)

$w = @DesktopWidth
$h = @DesktopHeight
$hWnd = GUICreate("GDI+ Test", $w, $h, 0, 0, 0, $WS_EX_LAYERED + $WS_EX_TOPMOST)
GUISetState()

_GDIPlus_Startup()

$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics($w, $w, $hGraphic)
$hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
$hPen = _GDIPlus_PenCreate(0xFFA0A0A0, 2)
_GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)

$ScreenDc = _WinAPI_GetDC($hWnd)
$gdibitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
$dc = _WinAPI_CreateCompatibleDC($ScreenDc)
_WinAPI_SelectObject($dc, $gdibitmap)
; _WinAPI_UpdateLayeredWindow parameters
$tSize = DllStructCreate($tagSIZE)
$pSize = DllStructGetPtr($tSize)
DllStructSetData($tSize, "X", $w)
DllStructSetData($tSize, "Y", $h)
$tSource = DllStructCreate($tagPOINT)
$pSource = DllStructGetPtr($tSource)
$tBlend = DllStructCreate($tagBLENDFUNCTION)
$pBlend = DllStructGetPtr($tBlend)
$alpha = 0xFF
DllStructSetData($tBlend, "Alpha", $alpha)
DllStructSetData($tBlend, "Format", 1)
$tPoint = DllStructCreate($tagPOINT)
$pPoint = DllStructGetPtr($tPoint)
DllStructSetData($tPoint, "X", 0)
DllStructSetData($tPoint, "Y", 0)

GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

$mpos_ox = 0
$mpos_oy = 0

While Sleep(50)
    _GDIPlus_GraphicsClear($hBuffer, 0x00000000)
    $mpos = MouseGetPos()
    If $mpos[0] <> $mpos_oy Or $mpos[1] <> $mpos_oy Then
    _GDIPlus_GraphicsDrawLine($hBuffer, $mpos[0], 0, $mpos[0], $h, $hPen)
    _GDIPlus_GraphicsDrawLine($hBuffer, 0, $mpos[1], $w, $mpos[1], $hPen)
        $mpos_ox = $mpos[0]
        $mpos_oy = $mpos[1]
    EndIf
    $gdibitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _WinAPI_SelectObject($dc, $gdibitmap)
    _WinAPI_UpdateLayeredWindow($hWnd, $ScreenDc, 0, $pSize, $dc, $pSource, 0, $pBlend, 2)
    _WinAPI_DeleteObject($gdibitmap)
WEnd


Func _Exit()
    _WinAPI_DeleteDC($dc)
    _WinAPI_ReleaseDC($hWnd, $ScreenDc)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    GUIDelete($hWnd)
    $tSize = ""
    $tSource = ""
    $tBlend = ""
    $tPoint = ""
    Exit
EndFunc

Br,

UEZ


Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites
Nothing2Lose

Thanks so much! It works perfectly!!!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×