explorerpl

Adobe AIR like window

8 posts in this topic

It's been long enough since I started looking for a solution, so I post this with a clear conscious. 

I am developing an application that would render keystrokes and click on the screen, much like KeyCastr on Mac OS. I did this once in the past. Back then I faced with the same problem - making a nice semitransparent window. I solved it by using Adobe AIR for the interface and Visual Basic for the data. VB was the server capturing the keystrokes and mouse events and passing them via TCP over localhost to Adobe AIR (compiled to exe). This solution worked quite ok. I even tried reviving it few hours before posting it with no success.

Important note - this is NOT a keylogger, though it shares some core functionality with such application. I do not ask for tips on capturing keyboards events (though if someone could post something useful I'd be grateful). 

These are some posts that I've found on the forum:
https://www.autoitscript.com/forum/topic/137618-two-questions-about-layered-gui/#comment-963975
https://www.autoitscript.com/forum/topic/102961-multiple-png-images-as-gui-elements/
https://www.autoitscript.com/forum/topic/47651-png-as-gui-drop-shadows-curved-edges-you-name-it/
https://www.autoitscript.com/forum/topic/102920-advanced-gui-udf-design/
https://www.autoitscript.com/forum/topic/157841-gui-fun/#comment-1144334
https://www.autoitscript.com/forum/topic/140053-just-the-text/#comment-983400
and even more...

The reason for not using an existing application is that there aren't many for windows, they look ugly, and they do not behave the way I need them too.

I've tried these approaches, but I'm either to stupid to understand them fully or I'm simply missing something. The main problem that I'm having is having the window transparent and displaying a label with text on top of it. As you know regular controls will not be transparent. I figured out that making a child window (transparent) on top of the parent transparent window might be the solution (I figured it out myself before finding some posts about it so I'm pretty proud of myself :)). Still... even if I do so the text is not anti-aliased and simply looks ugly.

I could really use an example code that creates a window that has a PNG as a background with a nice label on top that has drop shadow (two labels? one black for the shadow and one white for the text). The window should also be dragable with a mouse.

Here's a video with my old app running (start watching from 0:50)https://www.youtube.com/watch?v=C7fSpZntpfA
Here's a similar application called KeyPose: http://jungsbluth.de/magnus/blog/keypose/keypose.html

At some point I thought I'd just create a flash object on my window and make it transparent (I've seen this done even back in Windows 98). The difficulty here is that it's not a binary transparency, but a 32bpc one - real, smooth alpha channel like in a PNG, which is what most of the code I've seen is doing. Unfortunately I wasn't able to check that code, because I fail to create the Shockwave.Shockwave.11 object. I've installed the Flash player and the Shockwave player manually, registered the OCX, but no success.

TL;DR

Honestly - the solution to all my problems and problems other users are having would be replicating the behavior of such apps, that take an SWF and make a windowless EXE out of them. Just take a look at the attached file. Please note that the BG is semi-transparent, the labels are anti-aliased with a drop shadow. This is my old solution using Adobe AIR (Flash). I'd like to replicate that as closely as possible.

I really hope some good soul will help me with this.
Thank you.

 

screen.png

Share this post


Link to post
Share on other sites

explorerpl,

I do not ask for tips on capturing keyboards events (though if someone could post something useful I'd be grateful). 

Good, because if the thread does stray into that area it will be closed - and anyone posting such code will be sanctioned.

M23


Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______My UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


Link to post
Share on other sites

Good, because if the thread does stray into that area it will be closed - and anyone posting such code will be sanctioned.

I've noticed :) I fully understand the policy, though hooking into system events is a valid programming skill and it would be nice to have some examples and have them stripped out of "keylogging" functionality but have them close enough so that a smart person can figure it out. Still - that wouldn't help me :) I'm not that smart, that's why I need help, but not with keylogging. I'm solving one problem at a time :)

The solution to my problem (which essentially is creating a nice antialiased text on transparent background) seems so close with all the examples on the forum, yet I can't figure it out. Examples I've seen use a binary transparency (based on one color) which causes nasty edges. 8 bit transparency like with PNG and Layered Windows) use PNG's and that's great, but doesn't help me either.

At some point I was thinking about painting the PNG "in memory" (no files required) and then passing the resulting image as a "fake PNG" to use along with the Layered Windows examples. Again - this is to complex for my brain.

As for Adobe AIR it seems this is exactly what they are doing to create these nice transparent windows. How else could they do that? There's no single color to be set as transparent, the SWF that is being displayed can be anything and it works. If someone could figure out how to do that we all would be saved and eternaly happy creating out GUIs in Adobe Flash, publish them to SWF, and then put them in out AutoIt apps.

But again... The bottom line is that I need a nice antialiased text, with a shadow, on a semi transparent window with rounded corners.

Anyone?

Share this post


Link to post
Share on other sites

Ok. I think I'm done. I've seen people asking for good keyboard and mouse hooks UDF's, but due to forum policy such a thing (especially a keyboard hook) would constitute a KeyLogger. Just as mentioned above in this thread my project is NOT a keylogger though it shares many of such application characteristics. 

Would it be ok if I posted my compiled project so that others could also use it instead of a keylogger UDF? The app sends what it captures to localhost over TCP connection. No source code.

Share this post


Link to post
Share on other sites

explorerpl,

Would it be ok if I posted my compiled project so that others could also use it instead of a keylogger UDF? The app sends what it captures to localhost over TCP connection. No source code.

You are joking? At least I do hope so. There is no way can you post something that.

M23 


Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______My UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


Link to post
Share on other sites

Just wanted to make sure :) It's somewhat strange to me that while there are examples in the AutoIt documentation on how to do global keyboard hookds it's not considered ethical to post usage of that on the forum. But whatever you say. Don't want to piss anyone off. :)

Share this post


Link to post
Share on other sites

Here something similar which I had created in the past without text and buttons:

;coded by UEZ 2013

#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GDIPlus.au3>

Global Const $SC_DRAGMOVE = 0xF012
Global Const $iW = 300, $iH = 200
_GDIPlus_Startup()

                            ;text                           x       y           text color      font                font size
Global $aText[6][6] = [ [   "Windows Translucent GUI",      10,     12,         0xFFFFFFFF,     "Arial",            18          ], _
                        [   "Connection port:",             10,     80,         0xFFFFFFFF,     "Arial",            11          ], _
                        [   "80",                           150,    80,         0xFFFFFFFF,     "Arial",            11          ], _
                        [   "Connection status:",           10,     100,        0xFFFFFFFF,     "Arial",            11          ], _
                        [   "offline",                      150,    100,        0xFFFF8080,     "Arial",            12          ], _
                        [   "Coded by UEZ 2015 ;-)",        10,     150,        0xFFFFFFFF,     "Comic Sans MS",    15          ]]

                            ;   x       y       w       h       bmp handle
Global $aButtons[2][5] = [  [   230,    150,    24,     24,     _GDIPlus_BitmapCreateFromMemory(_Nok2_24x24png())       ], _
                            [   260,    150,    24,     24,     _GDIPlus_BitmapCreateFromMemory(_Ok2_24x24png())        ]]

Global Const $hGUI = GUICreate("", $iW, $iH, -1, -1, $WS_POPUP, $WS_EX_LAYERED) ;must be set before _GDIPlus_CreateCurvedTranslucentPanel
Global Const $aReturn = _GDIPlus_CreateCurvedTranslucentPanel($aText, $aButtons, 0xE04576B2, 0x509FBADC, $iW, $iH)
GUISetState()

_WinAPI_BitmapSetTransparent($hGUI, $aReturn[0])

GUIRegisterMsg($WM_LBUTTONDOWN, "_WM_LBUTTONDOWN")

Do
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            _GDIPlus_BitmapDispose($aReturn[0])
            _GDIPlus_Shutdown()
            GUIDelete($hGUI)
            Exit
        Case $aReturn[1] ;cancel
            MsgBox(0, "Info", "Cancel was pressed")
        Case $aReturn[2] ;ok
            MsgBox(0, "Info", "Ok was pressed")
    EndSwitch
Until False


Func _WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam)
    _SendMessage($hGUI, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
EndFunc   ;==>_WM_LBUTTONDOWN

Func _GDIPlus_CreateCurvedTranslucentPanel($aText, $aButtons, $iColorBG, $iColorFrame, $iW, $iH, $iRadiusCorner = 20, $bTextShadow = True) ;build 2015-11-03 by UEZ
    Local Const $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
    Local Const $hCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hCtxt, 2)
    _GDIPlus_GraphicsSetInterpolationMode($hCtxt, 7)
    _GDIPlus_GraphicsSetPixelOffsetMode($hCtxt, 2)
    _GDIPlus_GraphicsSetTextRenderingHint($hCtxt, 5)

    Local Const $hPath = _GDIPlus_PathCreate()
    Local Const $hPath_Shape = _GDIPlus_PathCreate()

    Local $iPenSize = 2

    _GDIPlus_PathAddArc($hPath, $iW - ($iRadiusCorner * 2), 0, $iRadiusCorner * 2, $iRadiusCorner * 2, 270, 90)
    _GDIPlus_PathAddArc($hPath, $iW - ($iRadiusCorner * 2), $iH - ($iRadiusCorner * 2), $iRadiusCorner * 2, $iRadiusCorner * 2, 0, 90)
    _GDIPlus_PathAddArc($hPath, 0, $iH - ($iRadiusCorner * 2), $iRadiusCorner * 2, $iRadiusCorner * 2, 90, 90)
    _GDIPlus_PathAddArc($hPath, 0, 0, $iRadiusCorner * 2, $iRadiusCorner * 2, 180, 90)
    _GDIPlus_PathCloseFigure($hPath)

    Local $iColorBG2 = BitAND(0xFF000000, $iColorBG) + BitAND(0x00FF0000, $iColorBG) - 0x200000 + BitAND(0x0000FF00, $iColorBG) - 0x2000 + BitAND(0x000000FF, $iColorBG) - 0x20
    Local $hBrush_Bg = _GDIPlus_LineBrushCreate($iW / 2, 0, $iW / 2, $iH, $iColorBG2, $iColorBG)
    _GDIPlus_GraphicsFillPath($hCtxt, $hPath, $hBrush_Bg)


    Local $hBrush_Shape = _GDIPlus_LineBrushCreate($iW / 2, $iH / 5 + 7, $iW / 2, 0, $iColorFrame, 0xA0FFFFFF)

    _GDIPlus_PathAddArc($hPath_Shape, 0, 0, $iRadiusCorner * 2, $iRadiusCorner * 2, 180, 90)
    _GDIPlus_PathAddArc($hPath_Shape, $iW - ($iRadiusCorner * 2), 0, $iRadiusCorner * 2, $iRadiusCorner * 2, 270, 90)

    _GDIPlus_PathAddLine($hPath_Shape, 0, $iRadiusCorner, 0, $iH / 5)
    _GDIPlus_PathAddLine($hPath_Shape, 0, $iH / 5, $iW / 2, $iH / 5 + 7)
    _GDIPlus_PathAddLine($hPath_Shape, $iW, $iH / 5, $iW, $iRadiusCorner)
    _GDIPlus_PathCloseFigure($hPath_Shape)

    _GDIPlus_GraphicsFillPath($hCtxt, $hPath_Shape, $hBrush_Shape)

    Local $hPen = _GDIPlus_PenCreate(0xF0000000 + $iColorFrame, $iPenSize)
    _GDIPlus_GraphicsDrawPath($hCtxt, $hPath, $hPen)

    _GDIPlus_PathReset($hPath)
    Local $i, $hBrush, $hFamily, $hFormat, $tLayout
    Local $hBrush_Shadow = _GDIPlus_BrushCreateSolid(0xFF101010)
    For $i = 0 To UBound($aText) - 1
        $hBrush = _GDIPlus_BrushCreateSolid($aText[$i][3])  ;color
        $hFamily = _GDIPlus_FontFamilyCreate($aText[$i][4]) ;font
        $hFormat = _GDIPlus_StringFormatCreate()
        _GDIPlus_StringFormatSetAlign($hFormat, 0)  ;alignment
        $tLayout = _GDIPlus_RectFCreate($aText[$i][1] + $aText[$i][5] / 8, $aText[$i][2] + $aText[$i][5] / 8)
        _GDIPlus_PathAddString($hPath, $aText[$i][0], $tLayout, $hFamily, 0, $aText[$i][5], $hFormat)
        _GDIPlus_GraphicsFillPath($hCtxt, $hPath, $hBrush_Shadow)   ;draw shadow
        _GDIPlus_PathReset($hPath)
        $tLayout = _GDIPlus_RectFCreate($aText[$i][1], $aText[$i][2])
        _GDIPlus_PathAddString($hPath, $aText[$i][0], $tLayout, $hFamily, 0, $aText[$i][5], $hFormat)
        _GDIPlus_GraphicsFillPath($hCtxt, $hPath, $hBrush)
        _GDIPlus_PathReset($hPath)
        _GDIPlus_BrushDispose($hBrush)
        _GDIPlus_FontFamilyDispose($hFamily)
        _GDIPlus_StringFormatDispose($hFormat)
    Next

    Local $aReturn[UBound($aButtons) + 1]
    $aReturn[0] = $hBitmap
    For $i = 0 To UBound($aButtons) - 1
        _GDIPlus_GraphicsDrawImageRect($hCtxt, $aButtons[$i][4], $aButtons[$i][0], $aButtons[$i][1], $aButtons[$i][2], $aButtons[$i][3])
        _GDIPlus_ImageDispose($aButtons[$i][4])
        $aReturn[$i + 1] = GUICtrlCreateLabel("", $aButtons[$i][0], $aButtons[$i][1], $aButtons[$i][2], $aButtons[$i][3])
    Next

    _GDIPlus_PathDispose($hPath)
    _GDIPlus_PathDispose($hPath_Shape)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_BrushDispose($hBrush_Bg)
    _GDIPlus_BrushDispose($hBrush_Shape)
    _GDIPlus_BrushDispose($hBrush_Shadow)
    _GDIPlus_GraphicsDispose($hCtxt)
    Return $aReturn
EndFunc   ;==>_GDIPlus_CreateCurvedTranslucentPanel

Func _WinAPI_BitmapSetTransparent($hGUI, $hImage, $iOpacity = 0xFF)
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend
    $hScrDC = _WinAPI_GetDC(0)
    $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", 1)
    _WinAPI_UpdateLayeredWindow($hGUI, $hMemDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
EndFunc   ;==>_WinAPI_BitmapSetTransparent

;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2015-09-19

Func _Nok2_24x24png($bSaveBinary = False, $sSavePath = @ScriptDir)
    Local $Nok2_24x24png
    $Nok2_24x24png &= 'iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAABzpAAAc6QHh0LjlAAAFfUlEQVRIiYWWX2hbVxLGf+dKWDWKrJRYSuLIJVFCtFuZQLsPtpsGTO04pfQp1JSExSkJCwFTSltvk4fmqQ8l7D40gRKHPnm9mBaVFNqH4KQtBTe4gppiGpOVG0qwLNeSLNfXsixfSefOPpwospP9MzDc0WjON/PNnXvOUSLCNhHxoJQLSCmbjS1PTp5ev3nzeO2rrw6rfD4IINGo7T1xYm5HX9/t1hdeGPfv2ZMCFCIWSumtcGpbAtf1YFm6XCjsT4+NfVB5++2BnX19vuCJE/ieeQaPzweVCrpQwEmlsG/eZDWVcpquXk20nzp1qbm19UEd48kEpnKdSyb/vNDVNbLvtdf84fPnRR044CKi2NxUlMuKchkcR3AcoVgUmZuzcqOjKgOlyPj4+XBn5z/rWI0EDx2Z27eHC/39f/vDtWtuU3+/i9YeWV1VamMDNjfBcczzoUqlgtJa2NzUlelp61+JhLVrYuKv+/r7/17HVK7repRSOptMDma7ukY7xsZqVleXJSsrltrYgGrVAJbLjSTlMlQqxl5fN4lc13Xn5927N254d09Nndnd1fUPcV2PEhHK+fyhe+HwdPzy5Rbfyy+7FAoWjmMAbBtqNdAa6kyqVVhdNerzGV+pBOA6v/5qzW5srP3x22//1BwO37cA0onEpbYjR1p8nZ01WVy0sG34/XfI5eC556C5GdJpKBaNzs1BNAqDg3D/Piwvg20j2azlCwRqbbOzLekvvrgEoIqLi/EHbW3J+JUrfnXwoLC6qqhUYG0Nenuho8NUev06/PKLYfHss/DmmxAMwnffwblzsHevSa61SC6nZsPh0v5btzqt5WRyIAh+tWuXlmxWsbYGS0vQ3W3AtYadO+HMGchmTUuGhgy41tDTAx99BHfugOMguZxSgYAOzs76l3/8ccBb+v773vaTJ6FUUsq2zaJ79+DBA2hvN5VpDXv2wMcfg9cLTz9tfB6Pac/XX5tRX1lB5fPg86kgkJ6a6vX8xXEu7z140O956ikoFhUzM/DZZzA9DfPz8OKL0NICIoZJIGBsyzLgFy7AyAhEIoY5wNoaClTW621mBqq1s2dFLlwQOXnSfBWhkEg0auxXXhFJp0VERLQ2KiKyuChy6pSJqcdu0RrITChUtQAz1+k03LgBoRDk843tIxg0rXhcajUoFIxdqTz5f11+OnYs5/T0iDz/vPuogkjEPM+eFcnnTcWuK4+kziKT2c66wcB1QH7q6clx9+LFSduA6m2Bb73VAK/VGm2pt6vuy2RMIVvXRiLaBrl78eKk5e/u/sYGaGoy214gYKgdOwatrdun5b33zIguLRmf1tDWBsePmzWBAALg94sN+Lu7v6GYycR/jsfX3YfUtrXoyy9NlbmcyBtvNFowMGDYiJiYrWt6elz3pZfk51hsvZjJxBERUiMjo7+BSCxWdesgdbqJhMjwcGNa6kBDQyKffrot1n31VZF33qn+BpK6dm304U4tbGSzh6aPHLE3QyGRUEg/8bJDoYZd/731pUYihuGHH+rN11+X6WjU3shmD4kIuFp7RISlqanBGRAdj1clFNKPmESj28Hq4HXf0aPivv++yPXrWr/7bnUGZGlqalBEcLX2ICKI63pEhIWJieEZECca1RKLVQXcR4ke12hU3KEhkU8+cWVsrOoMDekZkIVbt4a3Yv7nI/PcuZF9s7P+cCgkKhBwqVQUoPD7FQcOQEeHcPiwsGOHyPy8lRsfV5mVlVLk88//y5H5+KGfz+9PJxIfVK5eHdiZSvmCgO/oUTzRKOzejfZ6cRYWsCcmWM3nnaYrVxLtp0//n0O/LluvLUtLseVk8vT6nTvHa5OTh9UPP5hrSyxme/v65nb09t5u7e7+n9eWfwNJOhRLmn3GvAAAAABJRU5ErkJggg=='
    Local $bString = _WinAPI_Base64Decode($Nok2_24x24png)
    If @error Then Return SetError(1, 0, 0)
    $bString = Binary($bString)
    If $bSaveBinary Then
        Local Const $hFile = FileOpen($sSavePath & "\Nok2_24x24.png", 18)
        If @error Then Return SetError(2, 0, $bString)
        FileWrite($hFile, $bString)
        FileClose($hFile)
    EndIf
    Return $bString
EndFunc   ;==>_Nok2_24x24png

Func _Ok2_24x24png($bSaveBinary = False, $sSavePath = @ScriptDir)
    Local $Ok2_24x24png
    $Ok2_24x24png &= 'iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA2IAAANiAGC02DBAAAGHklEQVRIiXWWW29U1xmGn3XYhzns2TNj7zE2G4cYgkU4qOEkhEqlOKqESgQ0JEpx05tK/QO5afoL0tKEi15UipqmqmiqVmlzE6jqUpckqBHCARKbAEbU5TBgPNux8Yzn4Jl96IW5sFNY3826et5X31r63k/wzeMhCQCIGUKzkd108wIptiEoIQHhVWgEE1QYZZIxPiYEJB4QEK/EicfAE4YQPMcruLyOyU5f+8o1izi2w3zjIZNLFXxtgSSiw8Xy7NIJLgQf8DEJHmKlyEoBBUT8CJ9NvIfmu57yk6LtikI6HxnKYGFxTky35rAgQZiYwlBInRgGor7UPFP+YurHnKSMhyIgWikg8YgZZis9nCah37f90LVd4Vh5ZQiD/87fodypLTsXJggDU2oMQaSxEqWVXqJxZ/LmVwd5nysESCCWeMsXjtDPGk4R0z+QGQjdVFE7Vl5ljQyVWkA5rOEbq+EIsFRaKW3qxXgp7FY9/VsGd5ziCP1AjIdUNIADwHb+BOwayA6EWSurXdOhYBdotJtcqt5ado6JKQ3UI3heOVTDBdphi36rT15vToZrrLVFt6uwOYim32cCJJCwlWNIDgxkBqKsldeO4eLaBbQ0uVedxpfLzk1pgFiGd+k8l9rn2ZveyUff/5C//uDP/Hbfr3W5ORN5zpoD/i7/GJAovgds5B3f9td1pUs4piOydpac5XJ//h4PmmW0TmOK1fCxpRu8mjnMLw8fZ4O/gSRJWN+1noWZgLHapOjJeb3lzq33JBvYh2ZPMV0iZznSsbIUU13M1+c4X72BpZ0nwId468hx+rw+6s06rVaLMAppx21pSYNsOr/He9bbJ8nxvG/4upjKx1kzRzHVxcP6PFeDGwzq0mq4sRL+Fn1dfbTaLdpLbSzDYvSrUU7O/gPf6ok1li6Wep+XWGx3zSLFdBHHyvLg4TTXK1cpR1NMRhVSMoMh1LLz1mp4s91kqbWEqUxGxkd4+eLL7HQ2EycxpjTIOe52jaDkGGnanTY3Z6aYbt0laAcMe8MoZXAy+D173f2cb17n1cwQbx95m96uXuqtOp12B0tbjEyMcPTzo7yYP0acxCA0UipMnSppFJQXy5yv/ocBWSRoB7y7512G9w9DAkcuH+LomaO81vcabx56k1KhxMLiAnEUYxv2ajgxUiikVGg0EokGr7KUgK8c2rIDpsfB5w6SslJ0wg6Hdh3ilD7FYO8g3U431VoVANu0GRl/DPxRKaWJk7AiaQXjlloeGq7MQhQwW50l7ITUG3XqzTpDW4bocXuot+pPgIMWCoCUkSZrZACo1RbHJQ85izRDE0MCYHr8YvQ4M/MzWNoiiiOa7SadsAMJy235BhwgTCBnujxb2sTTxfWyE3fCuUr5rOQGnxG2L6A0IcQ7rA38oXqSNz76GV/XvsY2bOI4JkkSbGPFgxaGiZOYmJi0TvFUbi2bugfImJm4E4U8bMxdKE+UP1PchOoOq1kq5I7qRMeRiOQmezOnmxeZvT3FnnV7KGQKaKU4c+WfvPT5S7yYP0aYhGSMLGudXny3j2KmSErbRFEc36rdlV9Ojv10/nfBleXuZxoTqYHM3ozObJLCCGNiudFay+WlG1y79QWyrfj05jl+fu1X7HS+jaUMepw19OV6yNkuljIxpIGpjHC6NquvVSb+fnnk328w5QnxKMVifkL/4Le2f5oT7lMIFSohdVrZ1OI2Y60v8Y11bE0/Q8Fy6c4USBkZDKExlIGlbSxlhpXFOT0+N3H7b5/88Tv8hjt4yNWB80O2bhncfTqv3H6ZyBAhhSVNZeoUWiiKqQJuysVQBqY0sZSFZdiRSGQS1Of01fmrd8YunzkYnAiusDypY/VIICGD4l/MBMX7f8mV8ttSqewzlrQFKJFAtCbXk7ipPKYyElvZsamtRAktG52WuF0r'
    $Ok2_24x24png &= 'q/EHl86Mnv3wcOOdxk08FI3lD/b40N+P8Pf7r5TWPv16Pl3YacuM6koVyBoZtDIRCDpxh4V2LXqwcP/irdvXTkx9MvkB57wEL3hi6K8UAYjZj/a2ebuLfu8LGcfZZqpUSQlJO2pXqtXqxOS9u6OMB2OcIwRP4gX/t7b8DwlNcnxkhYu3AAAAAElFTkSuQmCC'
    Local $bString = _WinAPI_Base64Decode($Ok2_24x24png)
    If @error Then Return SetError(1, 0, 0)
    $bString = Binary($bString)
    If $bSaveBinary Then
        Local Const $hFile = FileOpen($sSavePath & "\Ok2_24x24.png", 18)
        If @error Then Return SetError(2, 0, $bString)
        FileWrite($hFile, $bString)
        FileClose($hFile)
    EndIf
    Return $bString
EndFunc   ;==>_Ok2_24x24png

Func _WinAPI_Base64Decode($sB64String)
    Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0)
    If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "")
    Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]")
    $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0)
    If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "")
    Return DllStructGetData($bBuffer, 1)
EndFunc   ;==>_WinAPI_Base64Decode

 


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

Wow! Thanks UEZ. Once again you save the day. I have already completed the project using Adobe AIR and AutoIt, but your code will most certainly come in handy. I'm using TCP to get the applications talking, though I can only make a one way connection, but that's luckily enough. Now I'm struggling with an unfortunate memory leak. To bad I can't post the code so that someone could help me with the project. I'm an educator and the tool is designed to show all my keyboard shourcuts and mouse button combinations, but it does without a doubt a keylogger in nature.

Thanks again for your code.

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

  • Similar Content

    • Bilgus
      By Bilgus
      Draw Path Points allows you to make line paths for drawing with gdi
      You can even load an image and trace the outline
      Save and load functionality undo and redo zoom and scale; Don't Forget Rotate!
      ;Draw Path Points BILGUS 2018 ;Includes #include <File.au3> #include <GDIPlus.au3> #include <GUIConstants.au3> #include <GuiEdit.au3> #include <GuiListView.au3> #include <GuiTab.au3> #include <Misc.au3> If OnAutoItExitRegister("_Exit") <> 0 Then _GDIPlus_Startup() ;initialize GDI+ ConsoleWrite("GDI+ Started" & @CRLF) EndIf Opt("MouseCoordMode", 2) ;Relative coords to the client area of the active window Opt("PixelCoordMode", 2) ;Relative coords to the client area of the active window Global $iXScale = 8 Global $iYScale = $iXScale Global $sFileSave = @ScriptDir & "\DrawPath.txt" ;Default Global $b_ClosePath = False Global $b_ShowImage = False Global $sImagefile = "" Global $iUndo_Max = 50 Global $a_sUndo_Files[1] = [""] Global $a_sRedo_Files[1] = [""] Global $aPath_Points[1][2] = [[0, 0]] Global $aPath_Rot_Points Global $Form1 = GUICreate("Draw Path Points", 615, 437, 192, 124) Global $SelSquare = GUICtrlCreateLabel("", 0, 0, 0, 0, $SS_BLACKFRAME, $WS_EX_TOPMOST) GUICtrlSetState(-1, $GUI_HIDE) ;------------------------------------------------------------------------------- Global Enum $eC1_delete, $eC1_del_all, $eC1_update, $eC1_shift_dn, $eC1_shift_up, _ $eC1_closepath, $eC1_showimg, $eC1_lock, $eC1_undo, $eC1_redo, $aCtl1_LAST Global $aCtl1[$aCtl1_LAST] Control_Create_Group1() ;------------------------------------------------------------------------------- Global Enum $eC2_zin, $eC2_zout, $eC2_dgroup, $eC2_decx, $eC2_incx, $eC2_decy, _ $eC2_incy, $eC2_edit_rot, $eC2_rot, $eC2_ud_rot, $eC2_rev, $eC2_toall, $aCtl2_LAST Global $aCtl2[$aCtl2_LAST] Control_Create_Group2() ;------------------------------------------------------------------------------- Global $Btn_load = GUICtrlCreateButton("Load", 5, 1, 35, 20) Global $Btn_save = GUICtrlCreateButton("Save", 40, 1, 35, 20) Global $Btn_arr_disp = GUICtrlCreateButton("Array", 75, 1, 35, 20) Global $Edit_encoded = GUICtrlCreateEdit("", 115, 2, 50, 18, $ES_READONLY + $ES_AUTOHSCROLL, $WS_EX_STATICEDGE + $WS_EX_TRANSPARENT) Global $List1 = GUICtrlCreateListView("#|x|y", 5, 24, 161, 201, $LVS_SHOWSELALWAYS Or $LVS_SINGLESEL) Global $List1_LVN = GUICtrlCreateDummy() ;listview notifications Global $Image1 = GUICtrlCreatePic("", 200, 16, 400, 400, -1, $WS_EX_LAYERED) Global $Tab1 = GUICtrlCreateTab(1, 225, 20, 500, $TCS_VERTICAL) GUICtrlCreateTabItem(" ") GUICtrlSetState(-1, $GUI_SHOW) ; will be display first GUICtrlCreateTabItem(" ") GUICtrlCreateTabItem("") ; end tabitem definition For $i = 0 To UBound($aCtl2) - 1 GUICtrlSetState($aCtl2[$i], $GUI_HIDE) Next GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") List_Update() List_Index() GUISetState(@SW_SHOW) State_Save($aPath_Points) Points_Update($aPath_Points) While 1 $nMsg = GUIGetMsg() If $nMsg > 0 And $nMsg <> $aCtl2[$eC2_ud_rot] And $nMsg <> $aCtl2[$eC2_edit_rot] And GUICtrlRead($aCtl2[$eC2_edit_rot]) <> 0 Then ;ConsoleWrite("Cancel_Rotate? " & $nMsg & @CRLF) If MsgBox($MB_ICONQUESTION + $MB_OKCANCEL + $MB_DEFBUTTON2, "Save?", "Save Rotated Points?", 10) == $IDOK Then _GUICtrlEdit_SetText($aCtl2[$eC2_edit_rot], "0") $aPath_Points = $aPath_Rot_Points State_Save($aPath_Points) List_Update(List_Index()) Else _GUICtrlEdit_SetText($aCtl2[$eC2_edit_rot], "0") Points_Update($aPath_Points, $b_ClosePath, $b_ShowImage, List_Index()) ;, True) EndIf EndIf Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $Tab1 Tab1_Select() Case $SelSquare ;ConsoleWrite("SelSquare" & @CRLF) SelSquare_Drag() Case $List1 ;ConsoleWrite("List1 " & $nMsg & @CRLF) Local $iIndex = List_Index() If $iIndex <> -1 Then Points_Update($aPath_Points, $b_ClosePath, $b_ShowImage, $iIndex) _GUICtrlListView_SetItemSelected($List1, $iIndex, True, True) EndIf Case $List1_LVN Point_Selected($aPath_Points, $Image1, List_Index()) Case $List1_LVN Case $Image1 Image1_Clicked() Case $Btn_save Btn_save_Clicked() Case $Btn_load Btn_load_Clicked() Case $Btn_arr_disp _ArrayDisplay($aPath_Points) ;------------------------------------------------------------------- Case $aCtl1[$eC1_shift_up] Local $iIndex = List_Index() Point_Swap($iIndex, -1) Points_Update($aPath_Points, $b_ClosePath, $b_ShowImage) Case $aCtl1[$eC1_shift_dn] Local $iIndex = List_Index() Point_Swap($iIndex, 1) Points_Update($aPath_Points, $b_ClosePath, $b_ShowImage) Case $aCtl1[$eC1_del_all] $aPath_Points = 0 Dim $aPath_Points[1][2] = [[0, 0]] List_Update() Points_Update($aPath_Points, $b_ClosePath, $b_ShowImage) Case $aCtl1[$eC1_delete] Local $iIndex = List_Index() Point_Delete($iIndex) _GUICtrlListView_ClickItem($List1, $iIndex) Points_Update($aPath_Points, $b_ClosePath, $b_ShowImage) Case $aCtl1[$eC1_redo] $aPath_Points = State_Restore($aPath_Points, False) List_Update() Points_Update($aPath_Points, $b_ClosePath, $b_ShowImage) Case $aCtl1[$eC1_undo] $aPath_Points = State_Restore($aPath_Points, True) List_Update() Points_Update($aPath_Points, $b_ClosePath, $b_ShowImage) Case $aCtl1[$eC1_update] List_Update(List_Index()) Points_Update($aPath_Points, $b_ClosePath, $b_ShowImage) Ascii_Points($aPath_Points) _GUICtrlEdit_SetSel($Edit_encoded, 0, -1) Case $aCtl1[$eC1_closepath] $b_ClosePath = Control_IsChecked($aCtl1[$eC1_closepath]) List_Update(List_Index()) Points_Update($aPath_Points, $b_ClosePath, $b_ShowImage) If $b_ClosePath Then GUICtrlSetState($aCtl2[$eC2_rev], $GUI_DISABLE) Else GUICtrlSetState($aCtl2[$eC2_rev], $GUI_ENABLE) EndIf Case $aCtl1[$eC1_showimg] If Not $b_ShowImage Then $sImagefile = FileOpenDialog("Select an image", SplitDir($sImagefile), "All Files(*.*)", 0, SplitFileName($sImagefile), $Form1) EndIf $b_ShowImage = Control_IsChecked($aCtl1[$eC1_showimg]) List_Update(List_Index()) Points_Update($aPath_Points, $b_ClosePath, $b_ShowImage) ;------------------------------------------------------------------- Case $aCtl2[$eC2_zin] If Control_IsChecked($aCtl2[$eC2_toall]) Then Points_Scale(1, 1) Else $iXScale += 1 $iYScale += 1 Points_Update($aPath_Points, $b_ClosePath, $b_ShowImage) EndIf _GUICtrlListView_ClickItem($List1, List_Index()) Case $aCtl2[$eC2_zout] If Control_IsChecked($aCtl2[$eC2_toall]) Then Points_Scale(-1, -1) Else $iXScale -= 1 $iYScale -= 1 Points_Update($aPath_Points, $b_ClosePath, $b_ShowImage) EndIf _GUICtrlListView_ClickItem($List1, List_Index()) Case $aCtl2[$eC2_rev] Local $iIndex = List_Index() $aPath_Points = Points_Reverse($aPath_Points) Points_Update($aPath_Points, $b_ClosePath, $b_ShowImage, $iIndex) ;, True) List_Update($iIndex) Case $aCtl2[$eC2_edit_rot] ;ConsoleWrite("Rotate" & @CRLF) Local $iIndex = List_Index() Local $iDegrees = GUICtrlRead($aCtl2[$eC2_edit_rot]) $aPath_Rot_Points = Points_Rotate($aPath_Points, $iDegrees) Points_Update($aPath_Rot_Points, $b_ClosePath, $b_ShowImage, $iIndex) ;, True) Case $aCtl2[$eC2_incx] Point_Adjust(1, 0, Control_IsChecked($aCtl2[$eC2_toall])) Case $aCtl2[$eC2_decx] Point_Adjust(-1, 0, Control_IsChecked($aCtl2[$eC2_toall])) Case $aCtl2[$eC2_incy] Point_Adjust(0, 1, Control_IsChecked($aCtl2[$eC2_toall])) Case $aCtl2[$eC2_decy] Point_Adjust(0, -1, Control_IsChecked($aCtl2[$eC2_toall])) EndSwitch WEnd ;---------------------------------------------------------------------------------------------------- Func _Exit() _GDIPlus_Shutdown() ConsoleWrite("GDI+ Stopped" & @CRLF) State_Destroy() EndFunc ;==>_Exit Func Ascii_Points($aPts) ;encodes points into an ascii string Local Const $iChrOffset = 33 Local Const $iMaxOffset = 126 - $iChrOffset If Not IsArray($aPts) Then Return Local $sAscEnc = StringFormat("%03i%05i", $iChrOffset, UBound($aPts) * 2 + 8) If _ArrayMin($aPts) >= 0 And (_ArrayMax($aPts) - _ArrayMin($aPts)) <= $iMaxOffset Then For $i = 0 To UBound($aPts) - 1 $sAscEnc = $sAscEnc & Chr($aPts[$i][0] + $iChrOffset) & Chr($aPts[$i][1] + $iChrOffset) Next EndIf _GUICtrlEdit_SetText($Edit_encoded, $sAscEnc) EndFunc ;==>Ascii_Points Func Btn_load_Clicked() ConsoleWrite("Load: " & SplitDir($sFileSave) & @CRLF) $sFileSave = FileOpenDialog("Select a save file", SplitDir($sFileSave), "All Files(*.*)", 0, SplitFileName($sFileSave), $Form1) _FileReadToArray($sFileSave, $aPath_Points, 0, ",") If @error Then Dim $aPath_Points[1][2] = [[0, 0]] Else State_Destroy() State_Save($aPath_Points) EndIf List_Update() Points_Update($aPath_Points, $b_ClosePath, $b_ShowImage) EndFunc ;==>Btn_load_Clicked Func Btn_save_Clicked() List_Update(List_Index()) $sFileSave = FileOpenDialog("Select a save file", SplitDir($sFileSave), "All Files(*.*)", 0, SplitFileName($sFileSave), $Form1) _FileWriteFromArray($sFileSave, $aPath_Points, 0, Default, ",") EndFunc ;==>Btn_save_Clicked Func Control_Create_Group1() Local $iX = 30 Local $iY = 225 $aCtl1[$eC1_delete] = GUICtrlCreateButton("Delete", $iX + 0, $iY + 0, 50, 20) $aCtl1[$eC1_shift_dn] = GUICtrlCreateButton("+", $iX + 70, $iY + 0, 20, 20) $aCtl1[$eC1_shift_up] = GUICtrlCreateButton("-", $iX + 95, $iY + 0, 20, 20) $aCtl1[$eC1_del_all] = GUICtrlCreateButton("Delete All", $iX + 0, $iY + 25, 50, 20) $aCtl1[$eC1_update] = GUICtrlCreateButton("Update", $iX + 70, $iY + 25, 50, 20) $aCtl1[$eC1_undo] = GUICtrlCreateButton("Undo", $iX + 0, $iY + 50, 50, 20) $aCtl1[$eC1_redo] = GUICtrlCreateButton("Redo", $iX + 70, $iY + 50, 50, 20) GUICtrlSetState($aCtl1[$eC1_undo], $GUI_DISABLE) GUICtrlSetState($aCtl1[$eC1_redo], $GUI_DISABLE) $aCtl1[$eC1_closepath] = GUICtrlCreateCheckbox("Complete", $iX + 0, $iY + 70, 65, 25) $aCtl1[$eC1_showimg] = GUICtrlCreateCheckbox("Image", $iX + 0, $iY + 90, 65, 25) $aCtl1[$eC1_lock] = GUICtrlCreateCheckbox("Locked", $iX + 0, $iY + 110, 65, 25) EndFunc ;==>Control_Create_Group1 Func Control_Create_Group2() Local $iX = 30 Local $iY = 225 $aCtl2[$eC2_rev] = GUICtrlCreateButton("Reverse", $iX + 0, $iY + 0, 50, 20) $aCtl2[$eC2_edit_rot] = GUICtrlCreateInput("0", $iX + 0, $iY + 25, 40, 20) $aCtl2[$eC2_ud_rot] = GUICtrlCreateUpdown(-1) GUICtrlSetLimit($eC2_ud_rot, 360, -360) $aCtl2[$eC2_rot] = GUICtrlCreateButton("", $iX + 40, $iY + 25, 10, 20) $aCtl2[$eC2_dgroup] = GUICtrlCreateGroup("Coords", 5 + $iX + 70, $iY + 0, 55, 70) $aCtl2[$eC2_decy] = GUICtrlCreateButton("-", 24 + $iX + 70, 16 + $iY + 0, 17, 17) $aCtl2[$eC2_incy] = GUICtrlCreateButton("+", 24 + $iX + 70, 48 + $iY + 0, 17, 17) $aCtl2[$eC2_decx] = GUICtrlCreateButton("-", 8 + $iX + 70, 32 + $iY + 0, 17, 17) $aCtl2[$eC2_incx] = GUICtrlCreateButton("+", 40 + $iX + 70, 32 + $iY + 0, 17, 17) GUICtrlCreateGroup("", -99, -99, 1, 1) $aCtl2[$eC2_zout] = GUICtrlCreateButton("Zoom -", $iX + 0, $iY + 75, 50, 20) $aCtl2[$eC2_zin] = GUICtrlCreateButton("Zoom +", $iX + 75, $iY + 75, 50, 20) $aCtl2[$eC2_toall] = GUICtrlCreateCheckbox("Apply to all", $iX + 0, $iY + 100, 80, 25) EndFunc ;==>Control_Create_Group2 Func Control_IsChecked($IdCtrl) Return (BitAND(GUICtrlRead($IdCtrl), $GUI_CHECKED) = $GUI_CHECKED) EndFunc ;==>Control_IsChecked Func GDI_Draw_ArrayPoints(ByRef $aPts, $hImage, $b_ClosePath, $iX, $iY, $sFileName, $iSelected = -1) Local $hWnd = GUICtrlGetHandle($hImage) If UBound($aPts) > 1 Then Local $aPoints = GDI_Points($aPts, $iX, $iY) Else Local $aPoints[1][2] = [[0, 0]] EndIf Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd) ;create a graphics object from a window handle _GDIPlus_GraphicsClear($hGraphics, 0xFFFFFFFF) If FileExists($sFileName) Then Local $hBitmap = _GDIPlus_BitmapCreateFromFile($sFileName) Local Const $iWidth = ScaleX(_GDIPlus_ImageGetWidth($hBitmap)) Local Const $iHeight = ScaleY(_GDIPlus_ImageGetHeight($hBitmap)) Local $hBitmap_Scaled = _GDIPlus_ImageResize($hBitmap, $iWidth, $iHeight) ;resize image _GDIPlus_BitmapDispose($hBitmap) ;Done with initial bitmap _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap_Scaled, 0, 0) _GDIPlus_BitmapDispose($hBitmap_Scaled) EndIf Local $hPen = _GDIPlus_PenCreate(0xFFFF0000, ScaleX(1)) $hEndCap = _GDIPlus_ArrowCapCreate(1, 1) _GDIPlus_PenSetCustomEndCap($hPen, $hEndCap) If $b_ClosePath Then _GDIPlus_GraphicsDrawPolygon($hGraphics, $aPoints, $hPen) Local $iX0, $iY0, $iX1, $iY1 For $i = 1 To $aPoints[0][0] If Not $b_ClosePath And $i < $aPoints[0][0] Then $iX0 = $aPoints[$i][0] $iY0 = $aPoints[$i][1] $iX1 = $aPoints[$i + 1][0] $iY1 = $aPoints[$i + 1][1] _GDIPlus_GraphicsDrawLine($hGraphics, $iX0, $iY0, $iX1, $iY1, $hPen) EndIf Next _GDIPlus_ArrowCapDispose($hEndCap) _GDIPlus_PenDispose($hPen) _GDIPlus_GraphicsDispose($hGraphics) Point_Selected($aPts, $hImage, $iSelected) EndFunc ;==>GDI_Draw_ArrayPoints Func GDI_Line_hPath_From_Points($aPts, $iXorig, $iYorig) ;Returns hpath object be sure to delete it when finished Local $hPath = _GDIPlus_PathCreate() ;Create new path object Local $aPoints = GDI_Points($aPts, $iXorig, $iYorig) Local $iX0, $iY0, $iX1, $iY1 If IsArray($aPoints) Then For $i = 1 To $aPoints[0][0] - 1 $iX0 = $aPoints[$i][0] $iY0 = $aPoints[$i][1] $iX1 = $aPoints[$i + 1][0] $iY1 = $aPoints[$i + 1][1] _GDIPlus_PathAddLine($hPath, $iX0, $iY0, $iX1, $iY1) Next EndIf Return $hPath ;_GDIPlus_PathDispose($hPath) EndFunc ;==>GDI_Line_hPath_From_Points Func GDI_Points($aPts, $iXo, $iYO) Local $aGDIPts If IsArray($aPts) And UBound($aPts) > 1 Then Local $aGDIPts[UBound($aPts) + 1][2] $aGDIPts[0][0] = UBound($aPts) For $i = 1 To $aGDIPts[0][0] ;Build points list $aGDIPts[$i][0] = ScaleX($aPts[$i - 1][0]) + $iXo $aGDIPts[$i][1] = ScaleY($aPts[$i - 1][1]) + $iYO Next Else Local $aGDIPts[1][2] = [[0, 0]] EndIf Return $aGDIPts EndFunc ;==>GDI_Points Func Image1_Clicked() If Not Control_IsChecked($aCtl1[$eC1_lock]) Then Local $aCPos = ControlGetPos(GUICtrlGetHandle($Image1), "", 0) Local $aPos = MouseGetPos() If IsArray($aPos) And IsArray($aCPos) Then Local $iXn = Int(($aPos[0] - $aCPos[0] + ScaleX(1) / 2) / ScaleX(1)) Local $iYn = Int(($aPos[1] - $aCPos[1] + ScaleY(1) / 2) / ScaleY(1)) Point_Add(List_Index(), $iXn, $iYn) EndIf Points_Update($aPath_Points, $b_ClosePath, $b_ShowImage) Else ToolTip("Locked") Sleep(500) ToolTip("") EndIf EndFunc ;==>Image1_Clicked Func List_Index() Static Local $hWndList1 = GUICtrlGetHandle($List1) Local $iIndex = _GUICtrlListView_GetSelectionMark($hWndList1) If _GUICtrlListView_GetItemSelected($List1, $iIndex) Then Return $iIndex Return -1 EndFunc ;==>List_Index Func List_Update($iIndex = -1) Static $hWnd_List1 = GUICtrlGetHandle($List1) _GUICtrlListView_BeginUpdate($List1) _GUICtrlListView_DeleteAllItems($hWnd_List1) For $i = 0 To UBound($aPath_Points) - 1 GUICtrlCreateListViewItem($i & "|" & $aPath_Points[$i][0] & "|" & $aPath_Points[$i][1], $List1) Next If $iIndex > -1 Then _GUICtrlListView_ClickItem($List1, $iIndex) _GUICtrlListView_EnsureVisible($List1, $iIndex) EndIf _GUICtrlListView_EndUpdate($List1) EndFunc ;==>List_Update Func Point_Add($iIndex, $iX, $iY) If $iIndex <> -1 Then _ArrayInsert($aPath_Points, $iIndex, $iX & "|" & $iY, 0) _GUICtrlListView_InsertItem($List1, $iIndex, $iIndex) _GUICtrlListView_SetItemText($List1, $iIndex, $iX, 1) _GUICtrlListView_SetItemText($List1, $iIndex, $iY, 2) _GUICtrlListView_EnsureVisible($List1, $iIndex) Else _ArrayAdd($aPath_Points, $iX & "|" & $iY, 0) GUICtrlCreateListViewItem(UBound($aPath_Points) - 1 & "|" & $iX & "|" & $iY, $List1) _GUICtrlListView_EnsureVisible($List1, UBound($aPath_Points) - 1) EndIf State_Save($aPath_Points) EndFunc ;==>Point_Add Func Point_Adjust($iX, $iY, $bToAll) If Not $bToAll Then Local $iIndex = List_Index() If $iIndex == -1 And IsArray($aPath_Points) Then $iIndex = UBound($aPath_Points) - 1 If $iIndex == -1 Then Return $aPath_Points[$iIndex][0] += $iX $aPath_Points[$iIndex][1] += $iY _GUICtrlListView_SetItemText($List1, $iIndex, $aPath_Points[$iIndex][0], 1) _GUICtrlListView_SetItemText($List1, $iIndex, $aPath_Points[$iIndex][1], 2) If $iIndex <> UBound($aPath_Points) - 1 Then _GUICtrlListView_ClickItem($List1, $iIndex) Else For $i = 0 To UBound($aPath_Points) - 1 $aPath_Points[$i][0] += $iX $aPath_Points[$i][1] += $iY Next List_Update(List_Index()) EndIf State_Save($aPath_Points) Points_Update($aPath_Points, $b_ClosePath, $b_ShowImage) EndFunc ;==>Point_Adjust Func Point_Delete($iIndex) If $iIndex <> -1 Then _ArrayDelete($aPath_Points, $iIndex) _GUICtrlListView_DeleteItem($List1, $iIndex) State_Save($aPath_Points) ;List_Update($iIndex) EndIf EndFunc ;==>Point_Delete Func Point_Modify($iIndex, $iX, $iY) If $iIndex <> -1 Then $aPath_Points[$iIndex][0] = $iX $aPath_Points[$iIndex][1] = $iY _GUICtrlListView_SetItemText($List1, $iIndex, $iX, 1) _GUICtrlListView_SetItemText($List1, $iIndex, $iY, 2) _GUICtrlListView_EnsureVisible($List1, $iIndex) State_Save($aPath_Points) EndIf EndFunc ;==>Point_Modify Func Point_Selected($aPts, $hImage, $iIndex) If $iIndex > -1 Then GUICtrlSetState($SelSquare, $GUI_HIDE) Local $hWnd = GUICtrlGetHandle($hImage) Local $aPos = ControlGetPos($hWnd, "", 0) If IsArray($aPos) And IsArray($aPts) Then _WinAPI_RedrawWindow($hWnd, Default, Default, $RDW_ERASENOW) Local $iXs = ScaleX($aPts[$iIndex][0]) + $aPos[0] - ScaleX(1) / 2 Local $iYs = ScaleY($aPts[$iIndex][1]) + $aPos[1] - ScaleY(1) / 2 WinMove(GUICtrlGetHandle($SelSquare), "", $iXs, $iYs, ScaleX(1), ScaleY(1)) GUICtrlSetState($SelSquare, $GUI_SHOW) ;ConsoleWrite("Point_Selected" & @CRLF) Else ConsoleWriteError("Error: Point_Selected" & @CRLF) EndIf EndIf EndFunc ;==>Point_Selected Func Point_Swap($iIndex1, $iNext) _GUICtrlListView_BeginUpdate($List1) Local $iIndex2 If $iIndex1 <> -1 Then $iIndex2 = $iIndex1 + $iNext If $iIndex2 > UBound($aPath_Points) - 1 Then $iIndex2 = 0 ElseIf $iIndex2 < 0 Then $iIndex2 = UBound($aPath_Points) - 1 EndIf _ArraySwap($aPath_Points, $iIndex1, $iIndex2) Local $iX1 = _GUICtrlListView_GetItemText($List1, $iIndex1, 2) Local $iY1 = _GUICtrlListView_GetItemText($List1, $iIndex1, 2) Local $iX2 = _GUICtrlListView_GetItemText($List1, $iIndex2, 2) Local $iY2 = _GUICtrlListView_GetItemText($List1, $iIndex2, 2) _GUICtrlListView_SetItemText($List1, $iIndex1, $iX2, 1) _GUICtrlListView_SetItemText($List1, $iIndex1, $iY2, 2) _GUICtrlListView_SetItemText($List1, $iIndex2, $iX1, 1) _GUICtrlListView_SetItemText($List1, $iIndex2, $iY1, 2) _GUICtrlListView_ClickItem($List1, $iIndex2) _GUICtrlListView_EnsureVisible($List1, $iIndex2) Else ;ConsoleWrite("Array Shift" & @CRLF) If $iNext > 0 Then ;ARRAY SHIFT -- Melba23 Local $iUBound = UBound($aPath_Points) ; Get size of array Local $aTmp = _ArrayExtract($aPath_Points, 0, $iUBound - 2) ; Extract all but last _ArrayInsert($aTmp, 0, _ArrayExtract($aPath_Points, $iUBound - 1, Default)) ; Insert last at top $aPath_Points = $aTmp Else Local $aTmp = _ArrayExtract($aPath_Points, 1, Default) ; Extract all but top row _ArrayAdd($aTmp, _ArrayExtract($aPath_Points, 0, 0)) ; Add top row at bottom $aPath_Points = $aTmp EndIf List_Update(List_Index()) Points_Update($aPath_Points, $b_ClosePath, $b_ShowImage) EndIf State_Save($aPath_Points) _GUICtrlListView_EndUpdate($List1) EndFunc ;==>Point_Swap Func Points_Reverse($aPts) Local $hPath = GDI_Line_hPath_From_Points($aPts, 0, 0) ;_GDIPlus_PathFlatten($hPath) _GDIPlus_PathReverse($hPath) $aPoints = _GDIPlus_PathGetPoints($hPath) _GDIPlus_PathDispose($hPath) If IsArray($aPoints) Then ;ConsoleWrite("Flipped_Points" & @CRLF) Dim $aPts_Rev[$aPoints[0][0]][2] For $i = 1 To $aPoints[0][0] $aPts_Rev[$i - 1][0] = Int($aPoints[$i][0] / ScaleX(1)) $aPts_Rev[$i - 1][1] = Int($aPoints[$i][1] / ScaleY(1)) Next Return $aPts_Rev Else Return $aPts EndIf EndFunc ;==>Points_Reverse Func Points_Rotate($aPts, $iDegrees) Local $hPath = GDI_Line_hPath_From_Points($aPts, 0, 0) ;_GDIPlus_PathFlatten($hPath) Local $hPen = _GDIPlus_PenCreate(0x0, ScaleX(1)) Local $aBounds = _GDIPlus_PathGetWorldBounds($hPath, 0, $hPen) _GDIPlus_PenDispose($hPen) If IsArray($aBounds) Then $hMatrix = _GDIPlus_MatrixCreate() _GDIPlus_MatrixTranslate($hMatrix, $aBounds[0] + $aBounds[2] / 2, $aBounds[1] + $aBounds[3] / 2) _GDIPlus_MatrixRotate($hMatrix, $iDegrees) _GDIPlus_MatrixTranslate($hMatrix, -($aBounds[0] + $aBounds[2] / 2), -($aBounds[1] + $aBounds[3] / 2)) _GDIPlus_PathTransform($hPath, $hMatrix) _GDIPlus_MatrixDispose($hMatrix) EndIf Local $aPoints = _GDIPlus_PathGetPoints($hPath) _GDIPlus_PathDispose($hPath) If IsArray($aPoints) Then ;ConsoleWrite("Rotate_Points" & @CRLF) Dim $aPts_Rev[$aPoints[0][0]][2] For $i = 1 To $aPoints[0][0] $aPts_Rev[$i - 1][0] = Int($aPoints[$i][0] / ScaleX(1)) $aPts_Rev[$i - 1][1] = Int($aPoints[$i][1] / ScaleY(1)) Next Return $aPts_Rev Else Return $aPts EndIf EndFunc ;==>Points_Rotate Func Points_Scale($iScaleX, $iScaleY) For $i = 0 To UBound($aPath_Points) - 1 If $iScaleX > 0 Then $aPath_Points[$i][0] *= 2 Else $aPath_Points[$i][0] /= 2 EndIf If $iScaleY > 0 Then $aPath_Points[$i][1] *= 2 Else $aPath_Points[$i][1] /= 2 EndIf Next State_Save($aPath_Points) List_Update(List_Index()) Points_Update($aPath_Points, $b_ClosePath, $b_ShowImage) EndFunc ;==>Points_Scale Func Points_Update($aPts, $b_ClosePath = False, $b_Show_Image = True, $iSelected = -1) Local $_Image_File = $sImagefile If Not $b_Show_Image Then $_Image_File = "" GDI_Draw_ArrayPoints($aPts, $Image1, $b_ClosePath, 0, 0, $_Image_File, $iSelected) EndFunc ;==>Points_Update Func ScaleX($iX) Local $iXs = $iXScale If $iXs == 0 Then $iXs = -1 If $iXs > 0 Then $iX = $iX * $iXs Else $iX = $iX / Abs($iXs) EndIf Return $iX EndFunc ;==>ScaleX Func ScaleY($iY) Local $iYs = $iYScale If $iYs == 0 Then $iYs = -1 If $iYs > 0 Then $iY = $iY * $iYs Else $iY = $iY / Abs($iYs) EndIf Return $iY EndFunc ;==>ScaleY Func SelSquare_Drag() Local $iIndex = List_Index() If $iIndex <> -1 Then Local $cInfo = GUIGetCursorInfo($Form1) Local $aPosSelOrig = ControlGetPos($Form1, "", $SelSquare) If IsArray($aPosSelOrig) Then Local $iSubtractX = $cInfo[0] - $aPosSelOrig[0] Local $iSubtractY = $cInfo[1] - $aPosSelOrig[1] EndIf If IsArray($cInfo) Then Do $cInfo = GUIGetCursorInfo($Form1) ControlMove($Form1, "", $SelSquare, $cInfo[0] - $iSubtractX, $cInfo[1] - $iSubtractY) Until Not $cInfo[2] EndIf Local $aPosSelNew = ControlGetPos($Form1, "", $SelSquare) If IsArray($aPosSelNew) And IsArray($aPosSelOrig) Then Local $iXm = $aPath_Points[$iIndex][0] + Int(($aPosSelNew[0] - $aPosSelOrig[0]) / ScaleX(1)) Local $iYm = $aPath_Points[$iIndex][1] + Int(($aPosSelNew[1] - $aPosSelOrig[1]) / ScaleY(1)) Point_Modify($iIndex, $iXm, $iYm) Points_Update($aPath_Points, $b_ClosePath, $b_ShowImage, $iIndex) EndIf EndIf EndFunc ;==>SelSquare_Drag Func SplitDir($FullPath) Local $sDrive, $sDir, $sDummy _PathSplit($FullPath, $sDrive, $sDir, $sDummy, $sDummy) Return $sDrive & $sDir EndFunc ;==>SplitDir Func SplitFileName($FullPath) Local $sDummy, $sFileName, $sExt _PathSplit($FullPath, $sDummy, $sDummy, $sFileName, $sExt) Return $sFileName & "" & $sExt EndFunc ;==>SplitFileName Func State_Cleanup(ByRef $a1) If (UBound($a1) > $iUndo_Max + 2) Then Local $a1Rem = _ArrayExtract($a1, 1, Default) $a1Rem[0] = $a1[0] Local $sTmp = $a1[1] If $sTmp <> "" And FileExists($sTmp) Then FileDelete($sTmp) ;ConsoleWrite("Cleanup Delete (UnD) " & $sTmp & @CRLF) EndIf $a1 = $a1Rem EndIf EndFunc ;==>State_Cleanup Func State_Destroy($bRedo_Only = False) Local $sTmp While (UBound($a_sRedo_Files) > 1) $sTmp = _ArrayPop($a_sRedo_Files) If $sTmp <> "" And FileExists($sTmp) Then FileDelete($sTmp) ;ConsoleWrite(", Delete (ReD) " & $sTmp) If @error Then ConsoleWriteError("Failed to Delete " & $sTmp) EndIf WEnd GUICtrlSetState($aCtl1[$eC1_redo], $GUI_DISABLE) If $bRedo_Only Then Return While (UBound($a_sUndo_Files) > 1) $sTmp = _ArrayPop($a_sUndo_Files) If $sTmp <> "" And FileExists($sTmp) Then FileDelete($sTmp) ;ConsoleWrite(", Delete (UnD)" & $sTmp) If @error Then ConsoleWriteError("Failed to Delete " & $sTmp) EndIf WEnd GUICtrlSetState($aCtl1[$eC1_undo], $GUI_DISABLE) EndFunc ;==>State_Destroy Func State_Is_Diff(ByRef $a1, ByRef $a2) Local $bIsDiff = True If UBound($a1) = UBound($a2) Then $bIsDiff = False For $i = UBound($a1) - 1 To 0 Step -1 If $a1[$i][0] == $a2[$i][0] And $a1[$i][1] == $a2[$i][1] Then ContinueLoop Else ;ConsoleWrite("Diff " & $i & @CRLF) $bIsDiff = True ExitLoop EndIf Next Else ;ConsoleWrite("Diff " & @CRLF) EndIf Return $bIsDiff EndFunc ;==>State_Is_Diff Func State_Restore(ByRef $aPts, $bUndo) Local $sTmp = "" Local $aRes If $bUndo Then $sTmp = _ArrayPop($a_sUndo_Files) ;ConsoleWrite(", Restore (UnD)" & $sTmp) If $sTmp <> "" And FileExists($sTmp) Then _ArrayAdd($a_sRedo_Files, $sTmp) _FileReadToArray($sTmp, $aRes, 0, ",") If UBound($a_sUndo_Files) < 2 Then GUICtrlSetState($aCtl1[$eC1_undo], $GUI_DISABLE) If UBound($a_sRedo_Files) > 2 Then GUICtrlSetState($aCtl1[$eC1_redo], $GUI_ENABLE) If UBound($a_sUndo_Files) > 1 And Not State_Is_Diff($aPts, $aRes) Then Return State_Restore($aPts, $bUndo) If Not @error Then Return $aRes Else ConsoleWriteError("Failed to Restore " & $sTmp) EndIf Else $sTmp = _ArrayPop($a_sRedo_Files) ;ConsoleWrite(", Restore (ReD) " & $sTmp) If $sTmp <> "" And FileExists($sTmp) Then _ArrayAdd($a_sUndo_Files, $sTmp) _FileReadToArray($sTmp, $aRes, 0, ",") If UBound($a_sRedo_Files) < 2 Then GUICtrlSetState($aCtl1[$eC1_redo], $GUI_DISABLE) If UBound($a_sUndo_Files) > 2 Then GUICtrlSetState($aCtl1[$eC1_undo], $GUI_ENABLE) If UBound($a_sRedo_Files) > 1 And Not State_Is_Diff($aPts, $aRes) Then Return State_Restore($aPts, $bUndo) If Not @error Then Return $aRes Else ConsoleWriteError("Failed to Restore " & $sTmp) EndIf EndIf Return $aPts EndFunc ;==>State_Restore Func State_Save($aPts, $bClean = True) If $iUndo_Max < 1 Then Return Local $bFileDiff = True Local $sTmp = _TempFile(@TempDir, "DPP_") If UBound($a_sRedo_Files) > 2 Then _ArrayAdd($a_sUndo_Files, _ArrayPop($a_sRedo_Files)) _ArrayAdd($a_sUndo_Files, $sTmp) _FileWriteFromArray($sTmp, $aPath_Points, 0, Default, ",") If UBound($a_sRedo_Files) > 2 Then State_Destroy(True) State_Cleanup($a_sUndo_Files) ;ConsoleWrite("Save State " & UBound($a_sUndo_Files) & " " & $sTmp & @CRLF) If UBound($a_sUndo_Files) > 2 Then GUICtrlSetState($aCtl1[$eC1_undo], $GUI_ENABLE) If @error Then MsgBox(0, @ScriptName & " Error", "Unable to create undo file " & $sTmp) GUICtrlSetState($aCtl1[$eC1_undo], $GUI_DISABLE) GUICtrlSetState($aCtl1[$eC1_redo], $GUI_DISABLE) $iUndo_Max = 0 EndIf EndFunc ;==>State_Save Func Tab1_Select() Local $iStateCtl1, $iStateCtl2 Local $tabindex = GUICtrlRead($Tab1) ;ConsoleWrite("tab" & $tabindex + 1 & "_selected" & @CRLF) Select Case $tabindex = 0 $iStateCtl1 = $GUI_SHOW $iStateCtl2 = $GUI_HIDE Case $tabindex = 1 $iStateCtl1 = $GUI_HIDE $iStateCtl2 = $GUI_SHOW Case Else _GUICtrlTab_ActivateTab($Tab1, 0) Return EndSelect For $i = 0 To UBound($aCtl1) - 1 GUICtrlSetState($aCtl1[$i], $iStateCtl1) Next For $i = 0 To UBound($aCtl2) - 1 GUICtrlSetState($aCtl2[$i], $iStateCtl2) Next EndFunc ;==>Tab1_Select Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam) Static Local $hWndList1 = GUICtrlGetHandle($List1) If Not IsHWnd($hWndList1) Then $hWndList1 = GUICtrlGetHandle($List1) If @error Then Return $GUI_RUNDEFMSG If $wParam = $List1 Then Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam) Local $iCode = DllStructGetData($tNMHDR, "Code") Switch DllStructGetData($tNMHDR, "Code") Case $LVN_KEYDOWN, $NM_CLICK GUICtrlSendToDummy($List1_LVN, $lParam) EndSwitch EndIf Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY  


    • fenhanxue
      By fenhanxue
      i want to copy a picture file to clipboard, so that i can paste the picture through ctrl+V
      this is my code ,but it dosen't work :
      #AutoIt3Wrapper_UseX64 = n #Include <Clipboard.au3> #include <GDIPlus.au3> _GDIPlus_Startup() $hClipboard_Bitmap = _GDIPlus_BitmapCreateFromFile('C:\1.jpg') _ClipBoard_Open(0) _ClipBoard_SetDataEx($hClipboard_Bitmap,$CF_BITMAP) _ClipBoard_Close() _GDIPlus_Shutdown() can you help me
    • UEZ
      By UEZ
      I saw this code here: http://zoomquilt.org/ and here: http://arkadia.xyz and thought how this can be implemented in AutoIt. Here the results.
       
      The Zoomquilt:
      ;coded by UEZ build 2018-01-10, idea and images taken from http://zoomquilt.org/ ;thanks to spudw2k for the MouseZoom function #pragma compile(Icon, "c:\Program Files (x86)\AutoIt3\Icons\au3.ico") #AutoIt3Wrapper_Run_Au3Stripper=y #Au3Stripper_Parameters=/so /pe /rm #AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3" #include <GDIPlus.au3> #include <GuiConstantsEx.au3> #include <WindowsConstants.au3> _GDIPlus_Startup() Global $hGUI, $iFPS = 0, $iShowFPS = 0, $bExit, $iW, $iH Global Const $sTitle = "GDI Image Zoom v2.1.2 coded by UEZ" AutoItSetOption("GUIOnEventMode", 1) Downloader() GDIPlus_ZoomImage() AutoItSetOption("GUIOnEventMode", 0) _GDIPlus_Shutdown() Func GDIPlus_ZoomImage($bMultimonitor = False) $bExit = False Local $i, $aImages[46], $hImage, $hObj ConsoleWrite("Loading images from local disk..." & @CRLF) Local $fTimer = TimerInit() For $i = 0 To UBound($aImages) - 1 $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Images\TheZoomquilt" & StringFormat("%02i.jpg", $i)) $aImages[$i] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage) _GDIPlus_ImageDispose($hImage) Next ConsoleWrite(UBound($aImages) & " images loaded in " & TimerDiff($fTimer) & " ms" & @CRLF) Local $tDim = DllStructCreate($tagBITMAP) DllCall("GDI32.dll", 'int', 'GetObject', 'int', $aImages[0], 'int', DllStructGetSize($tDim), 'ptr', DllStructGetPtr($tDim)) $iW = $tDim.bmWidth $iH = $tDim.bmHeight Local $hFullScreen = WinGetHandle("[TITLE:Program Manager;CLASS:Progman]"), $aFullScreen[4], $iW_Dt, $iH_Dt $aFullScreen = WinGetPos($hFullScreen) If $bMultimonitor Then $iW_Dt = $aFullScreen[2] $iH_Dt = $aFullScreen[3] Else $iW_Dt = @DesktopWidth $iH_Dt = @DesktopHeight $aFullScreen[0] = "" $aFullScreen[1] = "" EndIf $hGUI = GUICreate($sTitle, $iW_Dt, $iH_Dt, $aFullScreen[0], $aFullScreen[1], $WS_POPUP, $WS_EX_TOPMOST) GUISetState(@SW_SHOW, $hGUI) GUISetCursor(16, 1) ;create canvas elements Local Const $hDC = _WinAPI_GetDC($hGUI) Local Const $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iW_Dt, $iH_Dt) Local Const $hDC_backbuffer = _WinAPI_CreateCompatibleDC($hDC) Local Const $DC_obj = _WinAPI_SelectObject($hDC_backbuffer, $hHBitmap) Local Const $hMemDC = _WinAPI_CreateCompatibleDC($hDC) _WinAPI_SetStretchBltMode($hDC_backbuffer, $STRETCH_DELETESCANS) Local Const $hCanvas = _GDIPlus_GraphicsCreateFromHDC($hDC_backbuffer) _GDIPlus_GraphicsSetSmoothingMode($hCanvas, $GDIP_SMOOTHINGMODE_HIGHQUALITY) _GDIPlus_GraphicsSetPixelOffsetMode($hCanvas, $GDIP_PIXELOFFSETMODE_HIGHQUALITY) Local Const $hBrush_Clr = _GDIPlus_BrushCreateSolid(0xFF000000), _ $hBrush_FPS = _GDIPlus_BrushCreateSolid(0xFFFFFFFF), _ $hFormat_FPS = _GDIPlus_StringFormatCreate(), _ $hFamily_FPS = _GDIPlus_FontFamilyCreate("Arial"), _ $hFont_FPS = _GDIPlus_FontCreate($hFamily_FPS, 8), _ $tLayout_FPS = _GDIPlus_RectFCreate(0, 0, 130, 16) $iFPS = 0 GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit_About") AdlibRegister("CalcFPS", 1000) Local $a[3], $b = 1, $c, $x, $e, $y, $w, $h, $w2 = $iW_Dt / 2, $h2 = $iH_Dt / 2, $q, $r If $iW_Dt > 1.5 * $iH_Dt Then $q = $iW_Dt $r = 0.75 * $iW_Dt Else $q = 1.5 * $iH_Dt $r = 0.75 * $iH_Dt EndIf Do For $e = 0 To 2 $a[$e] = $aImages[Mod(Floor($b) + $e, UBound($aImages))] Next $c = 2^(Mod($b, 1)) For $e = 0 To 2 $x = $w2 - $q / 2 * $c $y = $h2 - $r / 2 * $c $w = $q * $c $h = $r * $c $hObj = _WinAPI_SelectObject($hMemDC, $a[$e]) _WinAPI_StretchBlt($hDC_backbuffer, $x, $y, $w, $h, $hMemDC, 0, 0, $iW, $iH, $SRCCOPY) $c *= 0.5 Next $b += MouseZoom() IF $b < 0 Then $b = UBound($aImages) - $b _GDIPlus_GraphicsDrawStringEx($hCanvas, "FPS: " & $iShowFPS & " @ " & $iW_Dt & "x" & $iH_Dt & " px", $hFont_FPS, $tLayout_FPS, $hFormat_FPS, $hBrush_FPS) _WinAPI_BitBlt($hDC, 0, 0, $iW_Dt, $iH_Dt, $hDC_backbuffer, 0, 0, $SRCCOPY) $iFPS += 1 If $bExit Then ExitLoop Until Not Sleep(0) AdlibUnRegister("CalcFPS") ;release resources _GDIPlus_FontDispose($hFont_FPS) _GDIPlus_FontFamilyDispose($hFamily_FPS) _GDIPlus_StringFormatDispose($hFormat_FPS) _GDIPlus_BrushDispose($hBrush_Clr) _GDIPlus_BrushDispose($hBrush_FPS) _GDIPlus_GraphicsDispose($hCanvas) _WinAPI_SelectObject($hMemDC, $hObj) _WinAPI_DeleteDC($hMemDC) _WinAPI_SelectObject($hDC_backbuffer, $DC_obj) _WinAPI_DeleteDC($hDC_backbuffer) _WinAPI_DeleteObject($hHBitmap) _WinAPI_ReleaseDC($hGUI, $hDC) For $i = 0 To UBound($aImages) - 1 _WinAPI_DeleteObject($aImages[$i]) Next GUIDelete($hGUI) EndFunc ;==>GDIPlus_ZoomImage Func MouseZoom() ;https://www.arduino.cc/reference/en/language/functions/math/map/ Local $iInput = MouseGetPos(1), $iInMin = 0, $iInMax = @DesktopHeight, $iOutMin = 1, $iOutMax = -1, $iStep = 0.025 Return (($iInput - $iInMin) * ($iOutMax - $iOutMin) / ($iInMax - $iInMin) + $iOutMin) * $iStep EndFunc ;MouseZoom() Func _Exit_About() $bExit = True EndFunc ;==>_Exit_About Func CalcFPS() ;display FPS $iShowFPS = $iFPS $iFPS = 0 EndFunc ;==>CalcFPS Func Downloader() Local $i, $A = StringSplit("FUjD9hf gbHhxTR 8YyzJdR xP3aNkR 2Qi4fQr E6pW5Ky zmtWIBF Af7LtYp TuXy30d 3nKGLr2 hNoWscB mSBvv3K f4wJ70e mIt9XmM M4TkAyh P4L4qhd hNM6bTv VoT8JXM jqcGH0B DYVoN8n bOPQkOI NeaTfJ1 18ppMNr FZ3d8Jv HsoX2RP mjv4kzI 6rpJbef pySKauq WjNQYRV Ffooo8y Xei5XfD T5A415r LiV0VNB nGcwiO4 b1Gdjjy GE828iy eSQ7SLe 1mPyGgL GNtwJIr KxBlU7E aKXhms5 9Quu2wu Y07quDf r0yC5Qa 273fCkD 2wMyCUw FUjD9hf", " ", 2) Local $sURL For $i = 0 To UBound($A) - 1 If Not FileExists(@ScriptDir & "\Images\TheZoomquilt" & StringFormat("%02i.jpg", $i)) Then If Not FileExists(@ScriptDir & "\Images") Then DirCreate(@ScriptDir & "\Images") $sURL = "http://imgur.com/" & $A[Mod(20 + $i, 46)] & ".jpg" ConsoleWrite("Downloading " & $sURL & ": " & InetGet($sURL, @ScriptDir & "\Images\TheZoomquilt" & StringFormat("%02i.jpg", $i), 8) & " bytes" & @CRLF) ToolTip("Downloading images...Please wait! -> " & $i + 1 & " / " & UBound($A), MouseGetPos(0), MouseGetPos(1)) EndIf Next ToolTip("") EndFunc ;==>Downloader  
       
      Arkadia:
      ;coded by UEZ build 2018-01-10, idea and images taken from http://arkadia.xyz ;thanks to spudw2k for the MouseZoom function #pragma compile(Icon, "c:\Program Files (x86)\AutoIt3\Icons\au3.ico") #AutoIt3Wrapper_Run_Au3Stripper=y #Au3Stripper_Parameters=/so /pe /rm #AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3" #include <GDIPlus.au3> #include <GuiConstantsEx.au3> #include <WindowsConstants.au3> _GDIPlus_Startup() Global $hGUI, $iFPS = 0, $iShowFPS = 0, $bExit, $iW, $iH Global Const $sTitle = "GDI Image Zoom v2.2.1 coded by UEZ" AutoItSetOption("GUIOnEventMode", 1) Downloader() GDIPlus_ZoomImage() AutoItSetOption("GUIOnEventMode", 0) _GDIPlus_Shutdown() Func GDIPlus_ZoomImage($bMultimonitor = False) $bExit = False Local $i, $aImages[49], $hImage, $hObj ConsoleWrite("Loading images from local disk..." & @CRLF) Local $fTimer = TimerInit() For $i = 0 To UBound($aImages) - 1 $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Images\Arkadia" & $i & ".jpg") $aImages[$i] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage) _GDIPlus_ImageDispose($hImage) Next ConsoleWrite(UBound($aImages) & " images loaded in " & TimerDiff($fTimer) & " ms" & @CRLF) Local $tDim = DllStructCreate($tagBITMAP) DllCall("GDI32.dll", "int", "GetObject", "int", $aImages[0], "int", DllStructGetSize($tDim), "ptr", DllStructGetPtr($tDim)) $iW = $tDim.bmWidth $iH = $tDim.bmHeight Local $hFullScreen = WinGetHandle("[TITLE:Program Manager;CLASS:Progman]"), $aFullScreen[4], $iW_Dt, $iH_Dt $aFullScreen = WinGetPos($hFullScreen) If $bMultimonitor Then $iW_Dt = $aFullScreen[2] $iH_Dt = $aFullScreen[3] Else $iW_Dt = @DesktopWidth $iH_Dt = @DesktopHeight $aFullScreen[0] = "" $aFullScreen[1] = "" EndIf $hGUI = GUICreate($sTitle, $iW_Dt, $iH_Dt, $aFullScreen[0], $aFullScreen[1], $WS_POPUP, $WS_EX_TOPMOST) GUISetState(@SW_SHOW, $hGUI) GUISetCursor(16, 1) ;create canvas elements Local Const $hDC = _WinAPI_GetDC($hGUI) Local Const $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iW_Dt, $iH_Dt) Local Const $hDC_backbuffer = _WinAPI_CreateCompatibleDC($hDC) Local Const $DC_obj = _WinAPI_SelectObject($hDC_backbuffer, $hHBitmap) Local Const $hMemDC = _WinAPI_CreateCompatibleDC($hDC) _WinAPI_SetStretchBltMode($hDC_backbuffer, $STRETCH_DELETESCANS) Local Const $hCanvas = _GDIPlus_GraphicsCreateFromHDC($hDC_backbuffer) _GDIPlus_GraphicsSetSmoothingMode($hCanvas, $GDIP_SMOOTHINGMODE_HIGHQUALITY) _GDIPlus_GraphicsSetPixelOffsetMode($hCanvas, $GDIP_PIXELOFFSETMODE_HIGHQUALITY) Local Const $hBrush_Clr = _GDIPlus_BrushCreateSolid(0xFF000000), _ $hBrush_FPS = _GDIPlus_BrushCreateSolid(0xFFFFFFFF), _ $hFormat_FPS = _GDIPlus_StringFormatCreate(), _ $hFamily_FPS = _GDIPlus_FontFamilyCreate("Arial"), _ $hFont_FPS = _GDIPlus_FontCreate($hFamily_FPS, 8), _ $tLayout_FPS = _GDIPlus_RectFCreate(0, 0, 130, 16) $iFPS = 0 GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit_About") AdlibRegister("CalcFPS", 1000) Local $a[3], $b = 1, $c, $x, $e, $y, $w, $h, $w2 = $iW_Dt / 2, $h2 = $iH_Dt / 2, $q, $r If $iW_Dt > 1.5 * $iH_Dt Then $q = $iW_Dt $r = 0.75 * $iW_Dt Else $q = 1.5 * $iH_Dt $r = 0.75 * $iH_Dt EndIf Do For $e = 0 To 2 $a[$e] = $aImages[Mod(Floor($b) + $e, UBound($aImages))] Next $c = 2^(Mod($b, 1)) For $e = 0 To 2 $x = $w2 - $q / 2 * $c $y = $h2 - $r / 2 * $c $w = $q * $c $h = $r * $c $hObj = _WinAPI_SelectObject($hMemDC, $a[$e]) _WinAPI_StretchBlt($hDC_backbuffer, $x, $y, $w, $h, $hMemDC, 0, 0, $iW, $iH, $SRCCOPY) $c *= 0.5 Next $b += MouseZoom() IF $b < 0 Then $b = UBound($aImages) - $b _GDIPlus_GraphicsDrawStringEx($hCanvas, "FPS: " & $iShowFPS & " @ " & $iW_Dt & "x" & $iH_Dt & " px", $hFont_FPS, $tLayout_FPS, $hFormat_FPS, $hBrush_FPS) _WinAPI_BitBlt($hDC, 0, 0, $iW_Dt, $iH_Dt, $hDC_backbuffer, 0, 0, $SRCCOPY) $iFPS += 1 If $bExit Then ExitLoop Until Not Sleep(0) AdlibUnRegister("CalcFPS") ;release resources _GDIPlus_FontDispose($hFont_FPS) _GDIPlus_FontFamilyDispose($hFamily_FPS) _GDIPlus_StringFormatDispose($hFormat_FPS) _GDIPlus_BrushDispose($hBrush_Clr) _GDIPlus_BrushDispose($hBrush_FPS) _GDIPlus_GraphicsDispose($hCanvas) _WinAPI_SelectObject($hMemDC, $hObj) _WinAPI_DeleteDC($hMemDC) _WinAPI_SelectObject($hDC_backbuffer, $DC_obj) _WinAPI_DeleteDC($hDC_backbuffer) _WinAPI_DeleteObject($hHBitmap) _WinAPI_ReleaseDC($hGUI, $hDC) For $i = 0 To UBound($aImages) - 1 _WinAPI_DeleteObject($aImages[$i]) Next GUIDelete($hGUI) EndFunc ;==>GDIPlus_ZoomImage Func MouseZoom() ;https://www.arduino.cc/reference/en/language/functions/math/map/ Local $iInput = MouseGetPos(1), $iInMin = 0, $iInMax = @DesktopHeight, $iOutMin = 1, $iOutMax = -1, $iStep = 0.025 Return (($iInput - $iInMin) * ($iOutMax - $iOutMin) / ($iInMax - $iInMin) + $iOutMin) * $iStep EndFunc ;MouseZoom() Func _Exit_About() $bExit = True EndFunc ;==>_Exit_About Func CalcFPS() ;display FPS $iShowFPS = $iFPS $iFPS = 0 EndFunc ;==>CalcFPS Func Downloader() Local $sURL, $i For $i = 0 To 48 If Not FileExists(@ScriptDir & "\Images\Arkadia" & $i & ".jpg") Then If Not FileExists(@ScriptDir & "\Images") Then DirCreate(@ScriptDir & "\Images") $sURL = "http://arkadia.xyz/images/arkadia" & $i & ".jpg" ConsoleWrite("Downloading " & $sURL & ": " & InetGet($sURL, @ScriptDir & "\Images\Arkadia" & $i & ".jpg", 8) & " bytes" & @CRLF) ToolTip("Downloading images...Please wait! -> " & $i + 1 & " / " & $i, MouseGetPos(0), MouseGetPos(1)) EndIf Next ToolTip("") EndFunc ;==>Downloader  
      The missing images will be download and saved to script dir in folder images. Due to internal integer format of the GDI functions the screen is little bit wobbling.
       
      Happy watching. 
    • Miliardsto
      By Miliardsto
      Hello I have problem with my object drawn in gdi
      Func drawTriangle($tabName,$gui_active = 0) _GDIPlus_Startup() ;initialize GDI+ Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($sGUI[$gui_active]) ;create a graphics object from a window handle _GDIPlus_GraphicsSetSmoothingMode($hGraphics, $GDIP_SMOOTHINGMODE_HIGHQUALITY) ;sets the graphics object rendering quality (antialiasing) Local $hBrush = _GDIPlus_BrushCreateSolid(0xFFEFEFEF) ;color format AARRGGBB (hex) Local $aPoints[5][3] $aPoints[0][0] = 4 $aPoints[1][0] = 0.0 ; left $aPoints[1][1] = 0.0 ; top $aPoints[2][0] = 0.0 ; left $aPoints[2][1] = 30.0 ; top $aPoints[3][0] = 80.0 ; left $aPoints[3][1] = 30.0 ; top $aPoints[4][0] = 110.0 ; left $aPoints[4][1] = 0.0 ; top _GDIPlus_GraphicsFillPolygon($hGraphics, $aPoints, $hBrush) ;draw the triangle Local $fBrush = _GDIPlus_BrushCreateSolid(0xFFAAAAAA) ;color format AARRGGBB (hex) Local $sString = $tabName, $aInfo ; from the func param Local $hFormat, $hFamily, $hFont, $tLayout $hFormat = _GDIPlus_StringFormatCreate() $hFamily = _GDIPlus_FontFamilyCreate("Segoe UI") $hFont = _GDIPlus_FontCreate($hFamily, 12, 2) $tLayout = _GDIPlus_RectFCreate(6, 2) $aInfo = _GDIPlus_GraphicsMeasureString($hGraphics, $sString, $hFont, $tLayout, $hFormat) _GDIPlus_GraphicsDrawStringEx($hGraphics, $sString, $hFont, $aInfo[0], $hFormat, $fBrush) ;_GDIPlus_GraphicsDrawString($hGraphics, $tabName, 6, 3, "Segoe UI", 12) ; write text ;cleanup GDI+ resources _GDIPlus_FontDispose($hFont) _GDIPlus_FontFamilyDispose($hFamily) _GDIPlus_StringFormatDispose($hFormat) _GDIPlus_BrushDispose($hBrush) _GDIPlus_GraphicsDispose($hGraphics) _GDIPlus_Shutdown() EndFunc After this code execution I got new object rectangle
      Global $ma_border = GUICtrlCreateGraphic(100, 180, 40, 40) GUICtrlSetGraphic($ma_border, $GUI_GR_COLOR, 0x00000, $COLOR_BLUE) GUICtrlSetGraphic($ma_border, $GUI_GR_RECT, 0, 0, 40, 40) GUICtrlSetState(-1,$GUI_DISABLE) And what happens is first func = draw rectangle is pushed to parameters from GUICtrlCreateGraphic func. Left: 100, Top: 180.
      I can simplu reverse order of these func execution but There is too much things to change in my code.
      Can something be done to prevent this slipping?
    • Larnil
      By Larnil
      This script generates Barnsleys Fractal Fern using script only.
      ; version 2017-10-03 ; Barnsley Fractal Fern ; by larnil #include <GUIConstants.au3> Dim $x, $y, $xn, $yn, $n, $r, $dc $WinSize = 800 ; window size ;Create graphics windows AutoItSetOption("GUIOnEventMode", 1) $GUI = GUICreate("Barnsley Fractal Fern", $WinSize, $WinSize, -1, -1) $Graphic = GuiCtrlCreateGraphic(0, 0, $WinSize, $WinSize) GUICtrlSetBkColor(-1, 0x000000) GUICtrlSetGraphic(-1,$GUI_GR_COLOR, 0x00ff00) GUISetState(@SW_SHOW) GUISetOnEvent($GUI_EVENT_CLOSE,"Bye") ;Main $start = TimerInit() _Fern(800) ; hight of fern - can be larger than window MsgBox(0,"Time taken:",Round(TimerDiff($start)/1000,3) &" seconds") While 1 Sleep(100) WEnd Func Bye() Exit EndFunc Func _Fern($height) $f = $height/10.6 ; scale factor. Complete fern is within 0 <= y <= 9.9983 (with no scale) $offset_x = $height/2 - $height/40 ; Side adjustment. Fern is within −2.1820 < x < 2.6558 (with no scale) For $n = 1 To $height*200 ; Number of iterations $r = Random(0, 99, 1) Select Case $r < 85 ; 0-84 = 85% of the time $xn = 0.85 * $x + 0.04 * $y $yn = -0.04 * $x + 0.85 * $y + 1.6 Case $r > 84 AND $r < 92 ; 85-91 = 7% of the time $xn = 0.2 * $x - 0.26 * $y $yn = 0.23 * $x + 0.22 * $y + 1.6 Case $r > 91 AND $r < 99 ; 92-98 = 7% of the time $xn = -0.15 * $x + 0.28 * $y $yn = 0.26 * $x + 0.24 * $y + 0.44 Case Else ; 99-99 = 1% of the time $xn = 0 $yn = 0.16 * $y EndSelect $x = $xn $y = $yn GUICtrlSetGraphic($Graphic, $GUI_GR_PIXEL, $offset_x + $x * $f, $height - $y * $f) Next GUICtrlSetGraphic($Graphic, $GUI_GR_REFRESH) EndFunc ;==> Fern  
      Here is another example where I have used GDI (my very first attempt at using GDI by the way). This script can generate much larger Ferns and save them to file (png). I have used this script to generate a 20000 x 20000 pixel @ 600 dpi image. Looks really good printed out in full size.
      #include <GDIPlus.au3> #include <GUIConstantsEx.au3> ; Param Local Const $iPxColor = 0xFF00FF00 ; Pixel color for fractal Alpha/R/G/B Local Const $iBgColor = 0xFFFFFFFF ; Background color for image Alpha/R/G/B Local Const $iSize = 1000 ; Hight of fern in pixels - image will have this hight and width too Local Const $iIter = $iSize*400 ; Number of iterations - $iSize * 200 is a good starting point ; Call function ;$start = TimerInit() _Fern($iSize,$iIter) ;MsgBox(0,"Time taken:",Round(TimerDiff($start)/1000,3) &" seconds") ; Function for generating Barnsley Fractal Fern Func _Fern($Size,$Iter) _GDIPlus_Startup() ; initialize GDI+ Local $hBitmap = _GDIPlus_BitmapCreateFromScan0($Size, $Size) ; create an empty bitmap Local $hBmpCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap) ; get the graphics context of the image _GDIPlus_GraphicsClear($hBmpCtxt, $iBgColor) ; Set the background color for empty bitmap ; Here the magic happens $x=0 ; init $y=0 ; init $f = $Size/10.6 ; scale factor. Complete fern is within 0 <= y <= 9.9983 (with no scale) $offset_x = $Size/2 - $Size/40 ; Side adjustment. Fern is within −2.1820 < x < 2.6558 (with no scale) For $n = 1 To $Iter ; Number of iterations $r = Random(0, 99, 1) Select Case $r < 85 ; 0-84 = 85% of the time $xn = 0.85 * $x + 0.04 * $y $yn = -0.04 * $x + 0.85 * $y + 1.6 Case $r > 84 AND $r < 92 ; 85-91 = 7% of the time $xn = 0.2 * $x - 0.26 * $y $yn = 0.23 * $x + 0.22 * $y + 1.6 Case $r > 91 AND $r < 99 ; 92-98 = 7% of the time $xn = -0.15 * $x + 0.28 * $y $yn = 0.26 * $x + 0.24 * $y + 0.44 Case Else ; 99-99 = 1% of the time $xn = 0 $yn = 0.16 * $y EndSelect $x = $xn $y = $yn _GDIPlus_BitmapSetPixel($hBitmap, $offset_x + $x * $f, $Size - $y * $f, $iPxColor) ; Change pixel color for calculated X,Y Next ; ==> End of magic $File = "\Fractal_Fern_"&StringRight(Hex($iPxColor),6)&"-"&StringRight(Hex($iBgColor),6)&"-"&$iSize&".png" _GDIPlus_ImageSaveToFile($hBitmap, @MyDocumentsDir & $File) ;save bitmap to disk ShellExecute(@MyDocumentsDir & $File); Show it to the world in your default image viewer ; Cleanup GDI+ resources _GDIPlus_GraphicsDispose($hBmpCtxt) _GDIPlus_BitmapDispose($hBitmap) _GDIPlus_Shutdown() EndFunc ;==> _Fern