Jump to content
Sign in to follow this  
MachinistProgrammer

Drawing on a window

Recommended Posts

MachinistProgrammer

im trying to make an image editor but i need to be able to draw on a GUI and have seen very little to do with it. i made a very crude script do do it but their hase to be a better way

you need px.bmp

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <GuiButton.au3>
$Paint = GUICreate("Paint",350,350,-1,-1,-1,-1)
GUISetState(@SW_SHOW,$Paint)

While 1
 $nMsg = GUIGetMsg()
 Switch $nMsg
  Case $GUI_EVENT_CLOSE
   Exit
  Case $GUI_EVENT_PRIMARYDOWN
   _paint()
 EndSwitch
WEnd
Func _paint()
 Do
 $cPos = GUIGetCursorInfo()
 GUICtrlCreatePic(@ScriptDir & "\px.bmp",$cPos[0],$cPos[1],10,10)
 Until Not $cPos[2]
EndFunc

Edit: Spelling error

px.bmp

Edited by sycam0inc

All my projects live on github

Share this post


Link to post
Share on other sites
PhoenixXL

You can do it with GDIPlus.

Here is an example

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

Opt("TrayIconDebug", 1)

$Paint = GUICreate("Paint", 350, 350, -1, -1, -1, -1)
_GDIPlus_Startup()

$hGraphic_GUI = _GDIPlus_GraphicsCreateFromHWND($Paint)

$hBuffer_Bmp = _GDIPlus_BitmapCreateFromGraphics(350, 350, $hGraphic_GUI)
$hGraphic_Buffer_Bmp = _GDIPlus_ImageGetGraphicsContext($hBuffer_Bmp)

GUIRegisterMsg($WM_PAINT, "WM_PAINT")
GUISetState()

While 1

    Switch GUIGetMsg()

        Case $GUI_EVENT_CLOSE

            ;release the resources
            _GDIPlus_GraphicsDispose($hGraphic_Buffer_Bmp)
            _GDIPlus_ImageDispose($hBuffer_Bmp)

            _GDIPlus_GraphicsDispose($hGraphic_GUI)
            _GDIPlus_Shutdown()

            Exit

        Case $GUI_EVENT_PRIMARYDOWN

            ;paint the Buffer-Img
            Paint_Buffer()

    EndSwitch
WEnd

Func Paint_Buffer()
    Do

        $cPos = GUIGetCursorInfo()
        _GDIPlus_GraphicsFillRect($hGraphic_Buffer_Bmp, $cPos[0] - 1, $cPos[1] - 1, 2, 2)

        ;don't wait for the processing of the GUI
        _Winapi_PostMessage($Paint, $WM_PAINT, 0, 0)

    Until Not $cPos[2]
EndFunc   ;==>_paint

Func WM_PAINT($hWnd, $iMsg, $wParam, $lParam)

    ;paint the buffer image on the GUI.
    _GDIPlus_GraphicsDrawImage($hGraphic_GUI, $hBuffer_Bmp, 0, 0)

EndFunc   ;==>WM_PAINT

Seems for a workaround to make the points joined.

Regards :)

Edited by PhoenixXL

My code:

PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.

Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners.

MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. 

Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression.

Share this post


Link to post
Share on other sites
UEZ

Here a basic image editor extracted from an older version of AutoIt Windows Screenshooter which I found on my disk:

 

#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GuiMenu.au3>
#include <Misc.au3>
#include <GuiReBar.au3>
#include <ScrollBarConstants.au3>
#include <GuiScrollBars.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <GDIPlus.au3>;~~~
#include <GuiToolbar.au3>
#include <StaticConstants.au3>
#include <GuiSlider.au3>


Opt("MustDeclareVars", 1)

Global $sBitmap = FileOpenDialog("Bitte eine Bilddatei laden", "", "Bilder (*.jpg;*.png;*.bmp;*.gif)")
If @error Then Exit
Global Const $dll = DllOpen("user32.dll")
_GDIPlus_Startup()
Global $hBmp = _GDIPlus_BitmapCreateFromFile($sBitmap)
Global $bW = _GDIPlus_ImageGetWidth($hBmp)
Global $bH = _GDIPlus_ImageGetHeight($hBmp)
Global $vBitmap, $IE_tmp, $IE_Pix_Size = 8
Global $hGUI_ImageEditor, $hGUI_ImageEditor_Child, $hGUI_ImageEditor_Blur, $idInput_IE_Blur, $hSlider_IE_Blur, $hGUI_ImageEditor_GS, $hSlider_IE_GS, $idInput_IE_GS, $hGUI_ImageEditor_BW, $hSlider_IE_BW, $idInput_IE_BW
Global $idInput_IE_H, $idInput_IE_HP, $idInput_IE_W, $idInput_IE_WP, $idChkBox_IE_AR, $idLabel_IE_SizeN

Global Enum $idSave_IE = 1500, $idCopy_IE, $idSend_IE, $idUndo_IE, $idPen_IE, $idHighlighter_IE, $idRectangle_IE, $idEllipse_IE, $idArrow_IE, $idColor_IE, $idText_IE, $idText_Conf_IE, $idFX_IE, _
        $idFX_IE_GS, $idFX_IE_BW, $idFX_IE_INV, $idFX_IE_BLUR, $idFX_IE_Pix, $idFX_IE_Rast, $idFX_IE_Resize
Global Const $hCursor_System = _WinAPI_CopyIcon(_WinAPI_LoadCursor(0, 32512))
Global Const $STM_SETIMAGE = 0x0172
Global $hGUI_ImageEditor, $hGUI_ImageEditor_Child, $idPic_ImageEditor, $hToolbar_IE, $IE_iItem, $TB_Button_Chk, $TB_Menu_Chk, $hPen_IE, $hPenArrow_IE, $hCursor_IE, $IE_Bmp_Undo
Global $hGfx_IE, $hGfx_IE_BMP, $hCtx_IE, $hCtx_IE_BMP
Global $IE_Pen_Col = 0xFFFF0000, $IE_PenSize = 4, $IE_HL_Col = 0x30FFFF00, $IE_HL_Col_BGR = 0x00FFFF, $IE_HLSize = 20
Global $IE_Brush_Col = 0x30FFFF00
Global $IE_offset_x = 0, $IE_offset_y = 0, $IE_Tool_Selected = 1
Global $IE_ScrollbarH = False, $IE_ScrollbarV = False, $Undo_IE = False
Global Enum $idIEPen_Size = 1600, $idIEPen_Size_1px, $idIEPen_Size_2px, $idIEPen_Size_4px, $idIEPen_Size_8px, $idIEPen_Size_16px
Global Const $hDll = DllOpen("user32.dll")

Global $IE_Dummy_Ras, $IE_Dummy_Pix, $IE_Dummy_Blur, $IE_Dummy_BW, $IE_Dummy_Res


Global Const $hMenu_IE_PS = _GUICtrlMenu_CreatePopup()
_GUICtrlMenu_AddMenuItem($hMenu_IE_PS, "1 px", $idIEPen_Size_1px)
_GUICtrlMenu_AddMenuItem($hMenu_IE_PS, "2 px", $idIEPen_Size_2px)
_GUICtrlMenu_AddMenuItem($hMenu_IE_PS, "4 px", $idIEPen_Size_4px)
_GUICtrlMenu_AddMenuItem($hMenu_IE_PS, "8 px", $idIEPen_Size_8px)
_GUICtrlMenu_AddMenuItem($hMenu_IE_PS, "16 px", $idIEPen_Size_16px)
_GUICtrlMenu_CheckRadioItem($hMenu_IE_PS, 0, 5, 2)

Global Const $hMenu_IE_FX = _GUICtrlMenu_CreatePopup()
_GUICtrlMenu_InsertMenuItem($hMenu_IE_FX, 0, "Grayscale", $idFX_IE_GS)
_GUICtrlMenu_InsertMenuItem($hMenu_IE_FX, 1, "Black & White", $idFX_IE_BW)
_GUICtrlMenu_InsertMenuItem($hMenu_IE_FX, 2, "Invert", $idFX_IE_INV)
_GUICtrlMenu_InsertMenuItem($hMenu_IE_FX, 3, "Blur", $idFX_IE_BLUR)
_GUICtrlMenu_InsertMenuItem($hMenu_IE_FX, 4, "Pixelize", $idFX_IE_Pix)
_GUICtrlMenu_InsertMenuItem($hMenu_IE_FX, 5, "Rasterize", $idFX_IE_Rast)
_GUICtrlMenu_InsertMenuItem($hMenu_IE_FX, 6, "")
_GUICtrlMenu_InsertMenuItem($hMenu_IE_FX, 7, "Resize Image", $idFX_IE_Resize)


Opt("MouseCoordMode", 2)
Opt("GUICloseOnESC", 1)
ImageEditor()
Opt("MouseCoordMode", 1)
Opt("GUICloseOnESC", 0)
_WinAPI_SetSystemCursor($hCursor_System, 32512)
_WinAPI_DestroyCursor($hCursor_IE)


DllClose($dll)
_GDIPlus_BitmapDispose($hBmp)
_GDIPlus_Shutdown()
_GUICtrlMenu_DestroyMenu($hMenu_IE_PS)
_GUICtrlMenu_DestroyMenu($hMenu_IE_FX)
Exit

#region Image Editor
Func ImageEditor()
    Local $hGUI_ImageEditor_W = Int(@DesktopWidth * 0.875)
    Local $hGUI_ImageEditor_H = Int(@DesktopHeight * 0.875)
    Local $IE_TB_Style = BitOR($TBSTYLE_FLAT, $TBSTYLE_TRANSPARENT, $CCS_NORESIZE, $CCS_NOPARENTALIGN)
    Local $hHBITMAP_IE_Icons = Load_BMP_From_Mem(_ImageEditor_ToolbarIcons(), True)
    $hGUI_ImageEditor = GUICreate("AutoIt Windows Screenshooter Basic Image Editor / Image Info: " & $bW & "x" & $bH & " pixel", $hGUI_ImageEditor_W, $hGUI_ImageEditor_H)
    GUISetBkColor(0xDBE3DE, $hGUI_ImageEditor)
    $hToolbar_IE = _GUICtrlToolbar_Create($hGUI_ImageEditor, $IE_TB_Style)
    Local $idToolbar_IE = _WinAPI_GetDlgCtrlID($hToolbar_IE)
    Local $hReBar = _GUICtrlRebar_Create($hGUI_ImageEditor, BitOR($CCS_TOP, $RBS_VARHEIGHT, $RBS_AUTOSIZE, $RBS_BANDBORDERS))
    Local $aStrings[14]
    Local $aInfo = ControlGetPos($hGUI_ImageEditor, "AutoIt Windows Screenshooter Basic Image Editor", $idToolbar_IE)
    Local $height_delta = 54

    #region Toolbar
    $aStrings[0] = _GUICtrlToolbar_AddString($hToolbar_IE, "  &Save  ")
    $aStrings[1] = _GUICtrlToolbar_AddString($hToolbar_IE, "  &Copy  ")
    $aStrings[2] = _GUICtrlToolbar_AddString($hToolbar_IE, "  S&end  ")
    $aStrings[3] = _GUICtrlToolbar_AddString($hToolbar_IE, "&Undo")
    $aStrings[4] = _GUICtrlToolbar_AddString($hToolbar_IE, "  &Pen  ")
    $aStrings[5] = _GUICtrlToolbar_AddString($hToolbar_IE, "Pen S&ize")
    $aStrings[6] = _GUICtrlToolbar_AddString($hToolbar_IE, "&Highlighter")
    $aStrings[7] = _GUICtrlToolbar_AddString($hToolbar_IE, "&Rectangle")
    $aStrings[8] = _GUICtrlToolbar_AddString($hToolbar_IE, "&Ellipse")
    $aStrings[9] = _GUICtrlToolbar_AddString($hToolbar_IE, "&Arrow")
    $aStrings[10] = _GUICtrlToolbar_AddString($hToolbar_IE, "C&olor")
    $aStrings[11] = _GUICtrlToolbar_AddString($hToolbar_IE, "  &Text  ")
    $aStrings[12] = _GUICtrlToolbar_AddString($hToolbar_IE, "Confi&g")
    $aStrings[13] = _GUICtrlToolbar_AddString($hToolbar_IE, "F&X")


    _GUICtrlToolbar_SetBitmapSize($hToolbar_IE, 24, 24)
    _GUICtrlToolbar_AddBitmap($hToolbar_IE, 1, 0, $hHBITMAP_IE_Icons)

    _GUICtrlToolbar_AddButton($hToolbar_IE, $idSave_IE, 2, $aStrings[0], $BTNS_AUTOSIZE)
    _GUICtrlToolbar_AddButtonSep($hToolbar_IE)

    _GUICtrlToolbar_AddButton($hToolbar_IE, $idCopy_IE, 3, $aStrings[1], $BTNS_AUTOSIZE)

    _GUICtrlToolbar_AddButton($hToolbar_IE, $idSend_IE, 4, $aStrings[2], $BTNS_AUTOSIZE)
    _GUICtrlToolbar_AddButtonSep($hToolbar_IE)

    _GUICtrlToolbar_AddButton($hToolbar_IE, $idUndo_IE, 0, $aStrings[3], $BTNS_AUTOSIZE)
    _GUICtrlToolbar_AddButtonSep($hToolbar_IE)

    _GUICtrlToolbar_AddButton($hToolbar_IE, $idHighlighter_IE, 6, $aStrings[6], $BTNS_AUTOSIZE)
    _GUICtrlToolbar_AddButtonSep($hToolbar_IE)

    _GUICtrlToolbar_AddButton($hToolbar_IE, $idPen_IE, 5, $aStrings[4], $BTNS_AUTOSIZE)
    _GUICtrlToolbar_AddButton($hToolbar_IE, $idIEPen_Size, 8, $aStrings[5], $BTNS_DROPDOWN + $BTNS_WHOLEDROPDOWN + $BTNS_AUTOSIZE)
    _GUICtrlToolbar_AddButton($hToolbar_IE, $idRectangle_IE, 9, $aStrings[7], $BTNS_AUTOSIZE)
    _GUICtrlToolbar_AddButton($hToolbar_IE, $idEllipse_IE, 10, $aStrings[8], $BTNS_AUTOSIZE)
    _GUICtrlToolbar_AddButton($hToolbar_IE, $idArrow_IE, 11, $aStrings[9], $BTNS_AUTOSIZE)
    _GUICtrlToolbar_AddButton($hToolbar_IE, $idColor_IE, 12, $aStrings[10], $BTNS_AUTOSIZE)
    _GUICtrlToolbar_AddButtonSep($hToolbar_IE)

    _GUICtrlToolbar_AddButton($hToolbar_IE, $idText_IE, 13, $aStrings[11], $BTNS_AUTOSIZE)
    _GUICtrlToolbar_AddButton($hToolbar_IE, $idText_Conf_IE, 14, $aStrings[12], $BTNS_AUTOSIZE)
    _GUICtrlToolbar_AddButtonSep($hToolbar_IE)

    _GUICtrlToolbar_AddButton($hToolbar_IE, $idFX_IE, 15, $aStrings[13], $BTNS_DROPDOWN + $BTNS_WHOLEDROPDOWN + $BTNS_AUTOSIZE)
    _GUICtrlToolbar_AddButtonSep($hToolbar_IE)
    #endregion

    Local $hHBitmap_ImageEditor = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)
    $hGUI_ImageEditor_Child = GUICreate("", $hGUI_ImageEditor_W, $hGUI_ImageEditor_H - $height_delta, 0, $height_delta, $WS_POPUP, $WS_EX_MDICHILD, $hGUI_ImageEditor)
    GUISetBkColor(0x808080, $hGUI_ImageEditor_Child)

    If $bW < $hGUI_ImageEditor_W Or $bH < ($hGUI_ImageEditor_H - $height_delta) Then
        $IE_offset_x = -($hGUI_ImageEditor_W - $bW) / 2
        $IE_offset_y = -(($hGUI_ImageEditor_H - $height_delta) - $bH) / 2
        $idPic_ImageEditor = GUICtrlCreatePic("", $IE_offset_x * - 1, ($hGUI_ImageEditor_H - $bH) / 2 - $height_delta / 2, $bW, $bH)
    Else
        $idPic_ImageEditor = GUICtrlCreatePic("", 0, 0, $bW, $bH)
    EndIf

    _WinAPI_DeleteObject(GUICtrlSendMsg($idPic_ImageEditor, $STM_SETIMAGE, $IMAGE_BITMAP, $hHBitmap_ImageEditor))
    _WinAPI_DeleteObject($hHBitmap_ImageEditor)

    _GUICtrlRebar_AddToolBarBand($hReBar, $hToolbar_IE, "", 0)
    _GUICtrlToolbar_CheckButton($hToolbar_IE, $idPen_IE)

    Local $iVSscroll = _WinAPI_GetSystemMetrics(2)
    Local $iHSscroll = _WinAPI_GetSystemMetrics(3)
    Local $iYCaption = _WinAPI_GetSystemMetrics(4)
    Local $iYFixedFrame = _WinAPI_GetSystemMetrics(8)
    Local $iXFixedFrame = _WinAPI_GetSystemMetrics(7)

    Local $iMetricsSumX = ($bH > ($hGUI_ImageEditor_H - $height_delta)) * $iVSscroll + $iXFixedFrame * 2
    Local $iMetricsSumY = ($bW > $hGUI_ImageEditor_W) * $iHSscroll + $iYCaption + $iYFixedFrame

;~  For $a = 0 To 100
;~      ConsoleWrite($a & ": " & _WinAPI_GetSystemMetrics($a) & @LF)
;~  Next

    If @OSBuild < 6000 Then
        DllCall("UxTheme.dll", "int", "SetWindowTheme", "hwnd", $hToolbar_IE, "wstr", "", "wstr", "")
        $IE_TB_Style = BitOR($TBSTYLE_FLAT, $TBSTYLE_TRANSPARENT)
    EndIf

    If $bW > $hGUI_ImageEditor_W Or $bH > ($hGUI_ImageEditor_H - $height_delta) Then
;~      GUISetStyle($WS_POPUP + $WS_HSCROLL + $WS_VSCROLL, $WS_EX_MDICHILD, $hGUI_ImageEditor_Child)
        _GUIScrollBars_Init($hGUI_ImageEditor_Child)
        _GUIScrollBars_SetScrollInfoMin($hGUI_ImageEditor_Child, $SB_HORZ, 0)
        _GUIScrollBars_SetScrollInfoMax($hGUI_ImageEditor_Child, $SB_HORZ, $bW - $hGUI_ImageEditor_W + 61 + $iMetricsSumX)
        _GUIScrollBars_SetScrollInfoMin($hGUI_ImageEditor_Child, $SB_VERT, 0)
        _GUIScrollBars_SetScrollInfoMax($hGUI_ImageEditor_Child, $SB_VERT, $bH - $hGUI_ImageEditor_H + $iMetricsSumY + $height_delta - 1)
        GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL_IE")
        GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL_IE")
        GUIRegisterMsg($WM_MOUSEWHEEL, "WM_MOUSEWHEEL_IE")

        GUISetState(@SW_SHOW, $hGUI_ImageEditor)
        GUISetState(@SW_SHOW, $hGUI_ImageEditor_Child)

        If $bW > $hGUI_ImageEditor_W Then
            WM_HSCROLL_IE($hGUI_ImageEditor_Child, 0, $SB_THUMBTRACK, 0)
            $IE_ScrollbarH = True
        EndIf
        If $bH > ($hGUI_ImageEditor_H - $height_delta) Then
            WM_VSCROLL_IE($hGUI_ImageEditor_Child, 0, $SB_THUMBTRACK, 0)
            $IE_ScrollbarV = True
        EndIf
    Else
        GUISetState(@SW_SHOW, $hGUI_ImageEditor)
        GUISetState(@SW_SHOW, $hGUI_ImageEditor_Child)
    EndIf

    Local $hWnd_Title_Icon = Load_BMP_From_Mem(_WinTitle_Icon())
    Local $hIcon_New = _WinAPI_SetWindowTitleIcon($hWnd_Title_Icon, $hGUI_ImageEditor)

    $TB_Button_Chk = GUICtrlCreateDummy()

    Local $mx, $my, $mxo, $myo, $aCI, $cc, $hIE_Bmp_Txt, $hIE_Bmp_Ctx
    Local $aIETxtFont[8] = [7, 0, "Arial", 24, 400, 0, 0, 0xFF0000]
    Local $hBrush_IE = _GDIPlus_BrushCreateSolid($IE_Brush_Col)
        $hPen_IE = _GDIPlus_PenCreate($IE_Pen_Col, $IE_PenSize)
    $hPenArrow_IE = _GDIPlus_PenCreate($IE_Pen_Col, $IE_PenSize)
    Local $arrow_len = 7 ;Int($bW / 80)
    Local $hEndCap = _GDIPlus_ArrowCapCreate($arrow_len, Int($arrow_len * 0.66))
    _GDIPlus_PenSetCustomEndCap($hPenArrow_IE, $hEndCap)
    Local $hHL_IE = _GDIPlus_PenCreate($IE_HL_Col, $IE_HLSize)


    $hGfx_IE = _GDIPlus_GraphicsCreateFromHWND(GUICtrlGetHandle($idPic_ImageEditor))
    $hGfx_IE_BMP = _GDIPlus_BitmapCreateFromGraphics($bW, $bH, $hGfx_IE)
    $hCtx_IE = _GDIPlus_ImageGetGraphicsContext($hGfx_IE_BMP)
    $hCtx_IE_BMP = _GDIPlus_ImageGetGraphicsContext($hBmp)

    _GDIPlus_GraphicsSetSmoothingMode($hGfx_IE, 2)
    _GDIPlus_GraphicsSetSmoothingMode($hCtx_IE, 2)

    Local $startX, $startY, $area, $hGUI_ImageEditor_EnterTxt, $idEdit_IE, $idButton_IE, $IE_Text, $aTxt_Size, $aResult, $aBuffer, $keyDLL, $hCursor_IE_tmp
    Local $iMax, $hIE_Bmp_Rot, $hIE_Bmp_Ctx_Rot, $hIE_Matrix, $r
    Local $IE_Child_Active = False, $ESC_IE = False

    $IE_Dummy_Blur = GUICtrlCreateDummy()
    $IE_Dummy_BW = GUICtrlCreateDummy()
    $IE_Dummy_Pix = GUICtrlCreateDummy()
    $IE_Dummy_Ras = GUICtrlCreateDummy()
    $IE_Dummy_Res = GUICtrlCreateDummy()

    Local $blur_go, $idLabel_IE_Blur, $idButton_IE_Blur, $blur_val
    Local $bw_go, $BW_val, $idLabel_IE_BW, $idButton_IE_BW
    Local $pix_go, $hGUI_IE_PixelizeConf, $idInput_IE_PC, $idLabel_Pixel, $idButton_IE_OK, $hBild
    Local $rast_go, $iColor_Rasterize, $hGUI_ImageEditor_Raster, $idLabel_IE_Raster, $idLabel_IE_Raster_Color, $idButton_IE_Color, $idButton_IE_Color_Start, $idGraphic_Color
    Local $hGUI_IE_Resize, $idGroup_IE_ISize, $idLabel_IE_Current, $idLabel_IE_New, $idLabel_IE_SizeC, $idGroup_IE_INSize, $idLabel_IE_W1, $idLabel_IE_x, $idLabel_IE_H1, $idLabel_IE_W2, $idLabel_IE_P1, _
            $idLabel_IE_P2, $idLabel_IE_H2, $idButton_IE_IHalf, $idButton_IE_IDouble, $idGroup_IE_IMethod, $idCombo_IE, $idButton_IE_Cancel

    $hCursor_IE = _WinAPI_CreateSolidCursorFromBitmap($IE_PenSize, $IE_PenSize, BitOR(BitShift(BitAND($IE_Pen_Col, 0x000000FF), -16), BitAND($IE_Pen_Col, 0x0000FF00), BitShift(BitAND($IE_Pen_Col, 0x00FF0000), 16)))
    $aCI = GUIGetCursorInfo($hGUI_ImageEditor_Child)
    If (Not @error) And $aCI[4] = $idPic_ImageEditor Then _WinAPI_SetCursor($hCursor_IE)

    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND_IE")
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY_IE")
    GUIRegisterMsg($WM_SETCURSOR, "WM_SETCURSOR")

    Local $m1 = False, $m2 = False
    Local $aCoord[0xFFFFF][2], $z
    Do
        If WinActive($hGUI_ImageEditor) Or WinActive($hGUI_ImageEditor_Child) Then
            $aCI = GUIGetCursorInfo($hGUI_ImageEditor_Child)
            Switch $aCI[4]
                Case 0
                    If Not $m2 Then
                        WinActivate($hGUI_ImageEditor)
                        $m1 = False
                        $m2 = True
                    EndIf
                Case Else
                    If Not $m1 Then
                        ControlClick($hGUI_ImageEditor_Child, "", $idPic_ImageEditor)
                        WinActivate($hGUI_ImageEditor_Child)
                        $m1 = True
                        $m2 = False
                    EndIf
            EndSwitch

;~          ConsoleWrite(ControlGetFocus($hGUI_ImageEditor_Child) & @CRLF)
;~          If $aCI[4] = $idPic_ImageEditor And WinActive($hGUI_ImageEditor) Then
;~              ControlClick($hGUI_ImageEditor_Child, "", $idPic_ImageEditor)
;~              WinActivate($hGUI_ImageEditor_Child)
;~          EndIf
            If $aCI[2] And $aCI[4] = $idPic_ImageEditor And WinActive($hGUI_ImageEditor_Child) Then
                _GDIPlus_BitmapDispose($IE_Bmp_Undo)
                $IE_Bmp_Undo = _GDIPlus_BitmapCloneArea($hBmp, 0, 0, $bW, $bH)
                If Not $IE_Bmp_Undo Or @error Then Return MsgBox(16 + 262144, "ERROR", "Whoops an internal error has occured: unable to clone ie undo bitmap!" & @CRLF & @CRLF & _
                        "Sorry for inconvenience! :-(", 20, WinGetHandle(AutoItWinGetTitle()))
                $Undo_IE = True

                Switch $IE_Tool_Selected
                    Case 1 ;pen
                        _GDIPlus_GraphicsDrawImageRect($hCtx_IE, $hBmp, 0, 0, $bW, $bH)
                        Dim $aCoord[0xFFFFF][2]
                        $z = 0
                        $aCoord[0][0] = $z
                        Do
                            $aCI = GUIGetCursorInfo($hGUI_ImageEditor_Child)
                            $z += 1
                            $aCoord[0][0] = $z
                            $aCoord[$z][0] = ($aCI[0] + $IE_PenSize / 2) + $IE_offset_x
                            $aCoord[$z][1] = ($aCI[1] + $IE_PenSize / 2) + $IE_offset_y
                            _GDIPlus_GraphicsDrawCurve2($hGfx_IE, $aCoord, 0.01, $hPen_IE)
                        Until Not $aCI[2] * Sleep(10)
                        ReDim $aCoord[$z + 1][2]
                        _GDIPlus_GraphicsDrawCurve2($hCtx_IE, $aCoord, 0.01, $hPen_IE)
                        _GDIPlus_GraphicsDrawImageRect($hCtx_IE_BMP, $hGfx_IE_BMP, 0, 0, $bW, $bH)
                        CopyImage2Control($idPic_ImageEditor)

                    Case 2 ;highlighter
                        _GDIPlus_GraphicsDrawImageRect($hCtx_IE, $hBmp, 0, 0, $bW, $bH)
                        Dim $aCoord[0xFFFFF][2]
                        $z = 0
                        $aCoord[0][0] = $z
                        Local $hBrush_IE_HL = _GDIPlus_BrushCreateSolid($IE_HL_Col)
                        _GDIPlus_GraphicsDrawImageRect($hCtx_IE, $hBmp, 0, 0, $bW, $bH)
                        Do
                            $aCI = GUIGetCursorInfo($hGUI_ImageEditor_Child)
                            _GDIPlus_GraphicsFillRect($hGfx_IE, $aCI[0] + $IE_offset_x, $aCI[1] + $IE_offset_y, $IE_HLSize, $IE_HLSize, $hBrush_IE_HL)
                            _GDIPlus_GraphicsFillRect($hCtx_IE, $aCI[0] + $IE_offset_x, $aCI[1] + $IE_offset_y, $IE_HLSize, $IE_HLSize, $hBrush_IE_HL)
                        Until Not $aCI[2] * Sleep(15)
                        _GDIPlus_BrushDispose($hBrush_IE_HL)
                        _GDIPlus_GraphicsDrawImageRect($hCtx_IE_BMP, $hGfx_IE_BMP, 0, 0, $bW, $bH)
                        CopyImage2Control($idPic_ImageEditor)
;~                      _GDIPlus_GraphicsDrawImageRect($hCtx_IE, $hBmp, 0, 0, $bW, $bH)
;~                      $mxo = MouseGetPos(0) + $IE_HLSize / 2
;~                      $myo = MouseGetPos(1) + $IE_HLSize / 2
;~                      Do
;~                          $aCI = GUIGetCursorInfo($hGUI_ImageEditor_Child)
;~                          _GDIPlus_GraphicsDrawLine($hGfx_IE, ($aCI[0] + $IE_HLSize / 2) + $IE_offset_x, ($aCI[1] + $IE_HLSize / 2) + $IE_offset_y, $mxo + $IE_offset_x, $myo + $IE_offset_y, $hHL_IE)
;~                          _GDIPlus_GraphicsDrawLine($hCtx_IE, ($aCI[0] + $IE_HLSize / 2) + $IE_offset_x, ($aCI[1] + $IE_HLSize / 2) + $IE_offset_y, $mxo + $IE_offset_x, $myo + $IE_offset_y, $hHL_IE)
;~                          $mxo = $aCI[0] + $IE_HLSize / 2
;~                          $myo = $aCI[1] + $IE_HLSize / 2
;~                      Until Not $aCI[2] * Sleep(1)
;~                      _GDIPlus_GraphicsDrawImageRect($hCtx_IE_BMP, $hGfx_IE_BMP, 0, 0, $bW, $bH)
                    Case 3 ;rectangle
                        $startX = MouseGetPos(0) - $IE_offset_x * - 1 + $IE_PenSize / 2
                        $mxo = $startX
                        $startY = MouseGetPos(1) - $IE_offset_y * - 1 + $IE_PenSize / 2
                        $myo = $startY
                        Do
                            $aCI = GUIGetCursorInfo($hGUI_ImageEditor_Child)
                            $mx = $aCI[0] - $IE_offset_x * - 1 + $IE_PenSize / 2
                            $my = $aCI[1] - $IE_offset_y * - 1 + $IE_PenSize / 2
                            If $mx <> $mxo Or $my <> $myo Then
                                _GDIPlus_GraphicsDrawImageRect($hCtx_IE, $hBmp, 0, 0, $bW, $bH)
                                If $startX < $mx And $startY < $my Then
                                    _GDIPlus_GraphicsDrawRect($hCtx_IE, $startX, $startY, Abs($startX - $mx), Abs($startY - $my), $hPen_IE)
                                ElseIf $startX > $mx And $startY < $my Then
                                    _GDIPlus_GraphicsDrawRect($hCtx_IE, $mx, $startY, Abs($startX - $mx), Abs($startY - $my), $hPen_IE)
                                ElseIf $startX < $mx And $startY > $my Then
                                    _GDIPlus_GraphicsDrawRect($hCtx_IE, $startX, $my, Abs($startX - $mx), Abs($startY - $my), $hPen_IE)
                                Else
                                    _GDIPlus_GraphicsDrawRect($hCtx_IE, $mx, $my, Abs($startX - $mx), Abs($startY - $my), $hPen_IE)
                                EndIf
                                _GDIPlus_GraphicsDrawImageRect($hGfx_IE, $hGfx_IE_BMP, 0, 0, $bW, $bH)
                                $mxo = $mx
                                $myo = $my
                            EndIf
                        Until Not $aCI[2] * Sleep(10)
                        _GDIPlus_GraphicsDrawImageRect($hCtx_IE_BMP, $hGfx_IE_BMP, 0, 0, $bW, $bH)
                        CopyImage2Control($idPic_ImageEditor)
                    Case 4 ;ellipse
                        $startX = MouseGetPos(0) - $IE_offset_x * - 1 + $IE_PenSize / 2
                        $mxo = $startX
                        $startY = MouseGetPos(1) - $IE_offset_y * - 1 + $IE_PenSize / 2
                        $myo = $startY
                        Do
                            $aCI = GUIGetCursorInfo($hGUI_ImageEditor_Child)
                            $mx = $aCI[0] - $IE_offset_x * - 1 + $IE_PenSize / 2
                            $my = $aCI[1] - $IE_offset_y * - 1 + $IE_PenSize / 2
                            If $mx <> $mxo Or $my <> $myo Then
                                _GDIPlus_GraphicsDrawImageRect($hCtx_IE, $hBmp, 0, 0, $bW, $bH)
                                If $startX < $mx And $startY < $my Then
                                    _GDIPlus_GraphicsDrawEllipse($hCtx_IE, $startX, $startY, Abs($startX - $mx), Abs($startY - $my), $hPen_IE)
                                ElseIf $startX > $mx And $startY < $my Then
                                    _GDIPlus_GraphicsDrawEllipse($hCtx_IE, $mx, $startY, Abs($startX - $mx), Abs($startY - $my), $hPen_IE)
                                ElseIf $startX < $mx And $startY > $my Then
                                    _GDIPlus_GraphicsDrawEllipse($hCtx_IE, $startX, $my, Abs($startX - $mx), Abs($startY - $my), $hPen_IE)
                                Else
                                    _GDIPlus_GraphicsDrawEllipse($hCtx_IE, $mx, $my, Abs($startX - $mx), Abs($startY - $my), $hPen_IE)
                                EndIf
                                _GDIPlus_GraphicsDrawImageRect($hGfx_IE, $hGfx_IE_BMP, 0, 0, $bW, $bH)
                                $mxo = $mx
                                $myo = $my
                            EndIf
                        Until Not $aCI[2] * Sleep(10)
                        _GDIPlus_GraphicsDrawImageRect($hCtx_IE_BMP, $hGfx_IE_BMP, 0, 0, $bW, $bH)
                        CopyImage2Control($idPic_ImageEditor)
                    Case 5 ;arrow
                        $startX = MouseGetPos(0) - $IE_offset_x * - 1 + $IE_PenSize / 2
                        $mxo = $startX
                        $startY = MouseGetPos(1) - $IE_offset_y * - 1 + $IE_PenSize / 2
                        $myo = $startY
                        Do
                            $aCI = GUIGetCursorInfo($hGUI_ImageEditor_Child)
                            $mx = $aCI[0] - $IE_offset_x * - 1 + $IE_PenSize / 2
                            $my = $aCI[1] - $IE_offset_y * - 1 + $IE_PenSize / 2
                            If $mx <> $mxo Or $my <> $myo Then
                                _GDIPlus_GraphicsDrawImageRect($hCtx_IE, $hBmp, 0, 0, $bW, $bH)
                                _GDIPlus_GraphicsDrawLine($hCtx_IE, $startX, $startY, $mx, $my, $hPenArrow_IE)
                                _GDIPlus_GraphicsDrawImageRect($hGfx_IE, $hGfx_IE_BMP, 0, 0, $bW, $bH)
                                $mxo = $mx
                                $myo = $my
                            EndIf
                        Until Not $aCI[2] * Sleep(10)
                        _GDIPlus_GraphicsDrawImageRect($hCtx_IE_BMP, $hGfx_IE_BMP, 0, 0, $bW, $bH)
                        CopyImage2Control($idPic_ImageEditor)
                EndSwitch
            EndIf

            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    If $ESC_IE Then
                        $ESC_IE = False
                    Else
                        ExitLoop
                    EndIf
                Case $TB_Button_Chk
                    Switch GUICtrlRead($TB_Button_Chk)
                        Case $idSave_IE
                            Save_Bitmap()
                        Case $idUndo_IE
                            If $Undo_IE Then
                                $bW = _GDIPlus_ImageGetWidth($IE_Bmp_Undo)
                                $bH = _GDIPlus_ImageGetHeight($IE_Bmp_Undo)
                                _GDIPlus_BitmapDispose($hBmp)
                                $hBmp = $IE_Bmp_Undo
                                WinSetTitle($hGUI_ImageEditor, "", "AutoIt Windows Screenshooter Basic Image Editor / Image Info: " & $bW & "x" & $bH & " pixel")

                                If $bW < $hGUI_ImageEditor_W Or $bH < ($hGUI_ImageEditor_H - $height_delta) Then
                                    $IE_offset_x = -($hGUI_ImageEditor_W - $bW) / 2
                                    $IE_offset_y = -(($hGUI_ImageEditor_H - $height_delta) - $bH) / 2
                                    GUICtrlSetPos($idPic_ImageEditor, $IE_offset_x * - 1, ($hGUI_ImageEditor_H - $bH) / 2 - $height_delta / 2, $bW, $bH)
                                Else
                                    GUICtrlSetPos($idPic_ImageEditor, 0, 0, $bW, $bH)
                                EndIf
                                $iMetricsSumX = ($bH > ($hGUI_ImageEditor_H - $height_delta)) * $iVSscroll + $iXFixedFrame * 2
                                $iMetricsSumY = ($bW > $hGUI_ImageEditor_W) * $iHSscroll + $iYCaption + $iYFixedFrame

                                _WinAPI_DeleteObject(GUICtrlSendMsg($idPic_ImageEditor, $STM_SETIMAGE, $IMAGE_BITMAP, 0))
                                _Functions_RemoveScrollBars($hGUI_ImageEditor_Child)
                                $IE_ScrollbarH = False
                                $IE_ScrollbarV = False
                                If $bW > $hGUI_ImageEditor_W Or $bH > ($hGUI_ImageEditor_H - $height_delta) Then
                                    _GUIScrollBars_Init($hGUI_ImageEditor_Child)
                                    _GUIScrollBars_SetScrollInfoMin($hGUI_ImageEditor_Child, $SB_HORZ, 0)
                                    _GUIScrollBars_SetScrollInfoMax($hGUI_ImageEditor_Child, $SB_HORZ, $bW - $hGUI_ImageEditor_W + 61 + $iMetricsSumX)
                                    _GUIScrollBars_SetScrollInfoMin($hGUI_ImageEditor_Child, $SB_VERT, 0)
                                    _GUIScrollBars_SetScrollInfoMax($hGUI_ImageEditor_Child, $SB_VERT, $bH - $hGUI_ImageEditor_H + $iMetricsSumY + $height_delta - 1)
                                    GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL_IE")
                                    GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL_IE")
                                    GUIRegisterMsg($WM_MOUSEWHEEL, "WM_MOUSEWHEEL_IE")

                                    If $bW > $hGUI_ImageEditor_W Then
                                        WM_HSCROLL_IE($hGUI_ImageEditor_Child, 0, $SB_THUMBTRACK, 0)
                                        $IE_ScrollbarH = True
                                    EndIf
                                    If $bH > ($hGUI_ImageEditor_H - $height_delta) Then
                                        WM_VSCROLL_IE($hGUI_ImageEditor_Child, 0, $SB_THUMBTRACK, 0)
                                        $IE_ScrollbarV = True
                                    EndIf
                                EndIf

                                _GDIPlus_GraphicsDispose($hGfx_IE)
                                _GDIPlus_GraphicsDispose($hCtx_IE)
                                _GDIPlus_ImageDispose($hCtx_IE_BMP)
                                _GDIPlus_BitmapDispose($hGfx_IE_BMP)

                                $hGfx_IE = _GDIPlus_GraphicsCreateFromHWND(GUICtrlGetHandle($idPic_ImageEditor))
                                $hGfx_IE_BMP = _GDIPlus_BitmapCreateFromGraphics($bW, $bH, $hGfx_IE)
                                $hCtx_IE = _GDIPlus_ImageGetGraphicsContext($hGfx_IE_BMP)
                                $hCtx_IE_BMP = _GDIPlus_ImageGetGraphicsContext($hBmp)
                                _GDIPlus_GraphicsSetSmoothingMode($hCtx_IE_BMP, 2)
                                _GDIPlus_GraphicsSetSmoothingMode($hCtx_IE, 2)
                                _GDIPlus_GraphicsSetSmoothingMode($hGfx_IE, 2)
                                CopyImage2Control($idPic_ImageEditor)
;~                              _GDIPlus_GraphicsDrawImage($hCtx_IE, $IE_Bmp_Undo, 0, 0)
;~                              _GDIPlus_GraphicsDrawImageRect($hCtx_IE_BMP, $hGfx_IE_BMP, 0, 0, $bW, $bH)

                                $Undo_IE = False
                            EndIf
                        Case $idPen_IE
                            $IE_Tool_Selected = 1
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idUndo_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idPen_IE)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idIEPen_Size, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idHighlighter_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idRectangle_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idEllipse_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idArrow_IE, False)
                            _WinAPI_DestroyCursor($hCursor_IE)
                            $hCursor_IE = _WinAPI_CreateSolidCursorFromBitmap($IE_PenSize, $IE_PenSize, BitOR(BitShift(BitAND($IE_Pen_Col, 0x000000FF), -16), BitAND($IE_Pen_Col, 0x0000FF00), BitShift(BitAND($IE_Pen_Col, 0x00FF0000), 16)))
                            $aCI = GUIGetCursorInfo($hGUI_ImageEditor_Child)
                            If (Not @error) And $aCI[4] = $idPic_ImageEditor Then _WinAPI_SetCursor($hCursor_IE)
                        Case $idHighlighter_IE
                            $IE_Tool_Selected = 2
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idUndo_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idPen_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idIEPen_Size, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idHighlighter_IE)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idRectangle_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idEllipse_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idArrow_IE, False)
                            _WinAPI_DestroyCursor($hCursor_IE)
                            $hCursor_IE = _WinAPI_CreateSolidCursorFromBitmap(16, $IE_HLSize, $IE_HL_Col_BGR)
                            $aCI = GUIGetCursorInfo($hGUI_ImageEditor_Child)
                            If (Not @error) And $aCI[4] = $idPic_ImageEditor Then _WinAPI_SetCursor($hCursor_IE)
                        Case $idRectangle_IE
                            $IE_Tool_Selected = 3
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idUndo_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idPen_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idIEPen_Size, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idHighlighter_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idRectangle_IE)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idEllipse_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idArrow_IE, False)
                        Case $idEllipse_IE
                            $IE_Tool_Selected = 4
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idUndo_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idPen_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idIEPen_Size, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idHighlighter_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idRectangle_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idEllipse_IE)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idArrow_IE, False)
                        Case $idArrow_IE
                            $IE_Tool_Selected = 5
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idUndo_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idPen_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idIEPen_Size, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idHighlighter_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idRectangle_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idEllipse_IE, False)
                            _GUICtrlToolbar_CheckButton($hToolbar_IE, $idArrow_IE)
                        Case $idColor_IE
                            $cc = _ChooseColor(2, 0xFF0000, 2, $hGUI_ImageEditor)
                            If Not @error Then
                                $IE_Pen_Col = "0xFF" & Hex($cc, 6)
                                _GDIPlus_PenSetColor($hPen_IE, $IE_Pen_Col)
                                _GDIPlus_PenSetColor($hPenArrow_IE, $IE_Pen_Col)
                                $hCursor_IE = _WinAPI_CreateSolidCursorFromBitmap($IE_PenSize, $IE_PenSize, BitOR(BitShift(BitAND($IE_Pen_Col, 0x000000FF), -16), BitAND($IE_Pen_Col, 0x0000FF00), BitShift(BitAND($IE_Pen_Col, 0x00FF0000), 16)))
                                $aCI = GUIGetCursorInfo($hGUI_ImageEditor_Child)
                                If (Not @error) And $aCI[4] = $idPic_ImageEditor Then _WinAPI_SetCursor($hCursor_IE)
                            EndIf
                        Case $idText_IE
                            $hGUI_ImageEditor_EnterTxt = GUICreate("Enter Text", 500, 370, -1, -1, $WS_SYSMENU, Default, $hGUI_ImageEditor)
                            $idEdit_IE = GUICtrlCreateEdit("", 2, 2, 490, 290)
                            GUICtrlSetFont(-1, $aIETxtFont[3], $aIETxtFont[4], $aIETxtFont[1], $aIETxtFont[2], 5)
                            GUICtrlSetColor(-1, $aIETxtFont[7])
                            $idButton_IE = GUICtrlCreateButton("Finish", 0, 295, 494, 48)
                            GUICtrlSetFont(-1, 20)
                            GUISetState(@SW_SHOW, $hGUI_ImageEditor_EnterTxt)
                            Do
                                Switch GUIGetMsg()
                                    Case $GUI_EVENT_CLOSE, $idButton_IE
                                        ExitLoop
                                EndSwitch
                            Until False
                            $IE_Text = GUICtrlRead($idEdit_IE)
                            GUIDelete($hGUI_ImageEditor_EnterTxt)
                            If $IE_Text <> "" Then
                                $aTxt_Size = GetStringSize($IE_Text, $aIETxtFont[2], $aIETxtFont[3], $aIETxtFont[1])
                                $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $aTxt_Size[0], "int", $aTxt_Size[1], "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
                                $hIE_Bmp_Txt = $aResult[6]
                                $hIE_Bmp_Ctx = _GDIPlus_ImageGetGraphicsContext($hIE_Bmp_Txt)
                                _GDIPlus_GraphicsSetSmoothingMode($hIE_Bmp_Ctx, 2)
                                DllCall($ghGDIPDll, "uint", "GdipSetTextRenderingHint", "handle", $hIE_Bmp_Ctx, "int", 4)
                                _GDIPlus_GraphicsDrawString2($hIE_Bmp_Ctx, $IE_Text, $aIETxtFont[2], $aIETxtFont[3], $aIETxtFont[1], 0xFF000000 + $aIETxtFont[7])

                                $hCursor_IE_tmp = _WinAPI_CopyImage($hCursor_IE, $IMAGE_CURSOR)
                                _WinAPI_DestroyCursor($hCursor_IE)

                                $hCursor_IE = _WinAPI_CreateSolidCursorFromBitmap(4, 4, BitOR(0x10000 * BitXOR(BitAND(BitShift($aIETxtFont[7], 16), 0xFF), 0xFF), 0x100 * BitXOR(BitAND(BitShift($aIETxtFont[7], 8), 0xFF), 0xFF), BitXOR(BitAND($aIETxtFont[7], 0xFF), 0xFF)))

                                _GDIPlus_BitmapDispose($IE_Bmp_Undo)
                                $IE_Bmp_Undo = _GDIPlus_BitmapCloneArea($hBmp, 0, 0, $bW, $bH)
                                If Not $IE_Bmp_Undo Or @error Then Return MsgBox(16 + 262144, "ERROR", "Whoops an internal error has occured: unable to clone ie undo bitmap!" & @CRLF & @CRLF & _
                                        "Sorry for inconvenience! :-(", 20, WinGetHandle(AutoItWinGetTitle()))
                                $Undo_IE = True
                                Do
                                    $aCI = GUIGetCursorInfo($hGUI_ImageEditor_Child)
                                    $mx = $aCI[0] - $IE_offset_x * - 1 - $aTxt_Size[0] / 2
                                    $my = $aCI[1] - $IE_offset_y * - 1 - $aTxt_Size[1]
                                    If $mx <> $mxo Or $my <> $myo Then
                                        _GDIPlus_GraphicsDrawImage($hCtx_IE, $hBmp, 0, 0)
                                        _GDIPlus_GraphicsDrawImageRect($hCtx_IE, $hIE_Bmp_Txt, $mx, $my, $aTxt_Size[0], $aTxt_Size[1])
                                        _GDIPlus_GraphicsDrawImageRect($hGfx_IE, $hGfx_IE_BMP, 0, 0, $bW, $bH)
                                        $mxo = $mx
                                        $myo = $my
                                    EndIf
                                    If _IsPressed("1B", $dll) Then $ESC_IE = True
                                Until ($aCI[2] * Sleep(20)) Or $ESC_IE

                                If Not $ESC_IE Then
                                    $iMax = 2 * Max($aTxt_Size[0], $aTxt_Size[1])
                                    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iMax, "int", $iMax, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
                                    $hIE_Bmp_Rot = $aResult[6]
                                    $hIE_Bmp_Ctx_Rot = _GDIPlus_ImageGetGraphicsContext($hIE_Bmp_Rot)
                                    $hIE_Matrix = _GDIPlus_MatrixCreate()
                                    _GDIPlus_MatrixTranslate($hIE_Matrix, $iMax / 2, $iMax / 2)
                                    $mxo = MouseGetPos(0)
                                    $r = 0
                                    Do
                                        $aCI = GUIGetCursorInfo($hGUI_ImageEditor_Child)
                                        _GDIPlus_GraphicsDrawImage($hCtx_IE, $hBmp, 0, 0)
                                        _GDIPlus_GraphicsClear($hIE_Bmp_Ctx_Rot, 0x00000000)
                                        If $mxo < $aCI[0] Then
                                            $r = 2
                                            $mxo = $aCI[0]
                                        ElseIf $mxo > $aCI[0] Then
                                            $r = -2
                                            $mxo = $aCI[0]
                                        Else
                                            $r = 0
                                        EndIf

                                        _GDIPlus_MatrixRotate($hIE_Matrix, $r)
                                        _GDIPlus_GraphicsSetTransform($hIE_Bmp_Ctx_Rot, $hIE_Matrix)
                                        _GDIPlus_GraphicsDrawImage($hIE_Bmp_Ctx_Rot, $hIE_Bmp_Txt, -$aTxt_Size[0] / 2, -$aTxt_Size[1] / 2)
                                        _GDIPlus_GraphicsDrawImage($hCtx_IE, $hIE_Bmp_Rot, $mx - $iMax / 2 + $aTxt_Size[0] / 2, $my - $iMax / 2 + $aTxt_Size[1] / 2)
                                        _GDIPlus_GraphicsDrawImageRect($hGfx_IE, $hGfx_IE_BMP, 0, 0, $bW, $bH)
                                    Until (Not $aCI[2]) * Sleep(20)

                                    _GDIPlus_GraphicsDrawImageRect($hCtx_IE_BMP, $hGfx_IE_BMP, 0, 0, $bW, $bH)
                                    CopyImage2Control($idPic_ImageEditor)
                                    _GDIPlus_MatrixDispose($hIE_Matrix)
                                    _GDIPlus_BitmapDispose($hIE_Bmp_Rot)
                                    _GDIPlus_GraphicsDispose($hIE_Bmp_Ctx_Rot)
                                    _WinAPI_DestroyCursor($hCursor_IE)
                                    $hCursor_IE = $hCursor_IE_tmp
                                Else
                                    _GDIPlus_GraphicsDrawImage($hGfx_IE, $hBmp, 0, 0)
                                EndIf
                                _GDIPlus_BitmapDispose($hIE_Bmp_Txt)
                                _GDIPlus_GraphicsDispose($hIE_Bmp_Ctx)
                            EndIf
                        Case $idText_Conf_IE
                            $aBuffer = $aIETxtFont ;save array because when _ChooseFont() has been cancelled the array will be deleted!
                            $aIETxtFont = _ChooseFont("Arial", 24, 0x0000FF) ;BGR
                            If @error Then $aIETxtFont = $aBuffer
                    EndSwitch
                Case $IE_Dummy_Blur
                    $blur_go = True
                    $hGUI_ImageEditor_Blur = GUICreate("Blur Setting", 332, 118, -1, -1, BitOR($WS_SYSMENU, $WS_GROUP), BitOR($WS_EX_TOOLWINDOW, $WS_EX_WINDOWEDGE, $WS_EX_TOPMOST), $hGUI_ImageEditor)
                    $hSlider_IE_Blur = _GUICtrlSlider_Create($hGUI_ImageEditor_Blur, 10, 40, 310, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE, $WS_TABSTOP))
                    _GUICtrlSlider_SetRangeMin($hSlider_IE_Blur, 1)
                    _GUICtrlSlider_SetRangeMax($hSlider_IE_Blur, 900)
                    _GUICtrlSlider_SetPos($hSlider_IE_Blur, 1000 - 333)
                    $idLabel_IE_Blur = GUICtrlCreateLabel("Blur Strength", 20, 12, 83, 23)
                    GUICtrlSetFont(-1, 12, 400, 0, "Times New Roman")
                    $idInput_IE_Blur = GUICtrlCreateInput(1 - 0.333, 112, 8, 95, 27, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY))
                    GUICtrlSetFont(-1, 12, 400, 0, "Times New Roman")
                    $idButton_IE_Blur = GUICtrlCreateButton("Start", 224, 8, 80, 27)
                    GUICtrlSetFont(-1, 12, 400, 0, "Times New Roman")
                    GUISetState(@SW_SHOW, $hGUI_ImageEditor_Blur)
                    ControlFocus($hGUI_ImageEditor_Blur, "", $idButton_IE_Blur)

                    While 1
                        Switch GUIGetMsg()
                            Case $GUI_EVENT_CLOSE
                                $blur_go = False
                                ExitLoop
                            Case $idButton_IE_Blur
                                $blur_val = (1000 - _GUICtrlSlider_GetPos($hSlider_IE_Blur)) / 1000
                                ExitLoop
                        EndSwitch
                        $aCI = GUIGetCursorInfo($hGUI_ImageEditor_Blur)
                        If $aCI[2] Then GUICtrlSetData($idInput_IE_Blur, Round(($IE_tmp / 1000), 4))
                    WEnd
                    GUIDelete($hGUI_ImageEditor_Blur)

                    If $blur_go Then
                        Local $hBild
                        _GDIPlus_BitmapDispose($IE_Bmp_Undo)
                        $IE_Bmp_Undo = _GDIPlus_BitmapCloneArea($hBmp, 0, 0, $bW, $bH)
                        If Not $IE_Bmp_Undo Or @error Then Return MsgBox(16 + 262144, "ERROR", "Whoops an internal error has occured: unable to clone ie undo bitmap!" & @CRLF & @CRLF & _
                                "Sorry for inconvenience! :-(", 20, WinGetHandle(AutoItWinGetTitle()))
                        $Undo_IE = True
                        $hBild = _Blur($hBmp, $bW, $bH, 0, 0, 0, 0, $blur_val)
                        _GDIPlus_BitmapDispose($hBmp)
                        $hBmp = $hBild
                        CopyImage2Control($idPic_ImageEditor)
                        _GDIPlus_GraphicsDispose($hCtx_IE_BMP)
                        $hCtx_IE_BMP = _GDIPlus_ImageGetGraphicsContext($hBmp)
                        _GDIPlus_GraphicsSetSmoothingMode($hCtx_IE_BMP, 2)
                    EndIf
                    WinActivate($hGUI_ImageEditor_Child)
                Case $IE_Dummy_BW
                    $BW_val = 160
                    $bw_go = True
                    $hGUI_ImageEditor_BW = GUICreate("Black&White Setting", 332, 118, -1, -1, BitOR($WS_SYSMENU, $WS_GROUP), BitOR($WS_EX_TOOLWINDOW, $WS_EX_WINDOWEDGE, $WS_EX_TOPMOST), $hGUI_ImageEditor)
                    $hSlider_IE_BW = _GUICtrlSlider_Create($hGUI_ImageEditor_BW, 10, 40, 310, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE, $WS_TABSTOP))
                    _GUICtrlSlider_SetRangeMin($hSlider_IE_BW, 1)
                    _GUICtrlSlider_SetRangeMax($hSlider_IE_BW, 255)
                    _GUICtrlSlider_SetPos($hSlider_IE_BW, $BW_val)
                    $idLabel_IE_BW = GUICtrlCreateLabel("Black/White Treshold", 20, 2, 83, 33)
                    GUICtrlSetFont(-1, 11, 400, 0, "Times New Roman")
                    $idInput_IE_BW = GUICtrlCreateInput($BW_val, 112, 8, 95, 27, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY))
                    GUICtrlSetFont(-1, 12, 400, 0, "Times New Roman")
                    $idButton_IE_BW = GUICtrlCreateButton("Start", 224, 8, 80, 27)
                    GUICtrlSetFont(-1, 12, 400, 0, "Times New Roman")
                    GUISetState(@SW_SHOW, $hGUI_ImageEditor_BW)
                    ControlFocus($hGUI_ImageEditor_BW, "", $idButton_IE_BW)

                    While 1
                        Switch GUIGetMsg()
                            Case $GUI_EVENT_CLOSE
                                $bw_go = False
                                GUIDelete($hGUI_ImageEditor_BW)
                                ExitLoop
                            Case $idButton_IE_BW
                                $BW_val = _GUICtrlSlider_GetPos($hSlider_IE_BW)
                                GUIDelete($hGUI_ImageEditor_BW)
                                ExitLoop
                        EndSwitch
                        $aCI = GUIGetCursorInfo($hGUI_ImageEditor_BW)
                        If $aCI[2] Then GUICtrlSetData($idInput_IE_BW, $IE_tmp)
                    WEnd

                    If $bw_go Then
                        _GDIPlus_BitmapDispose($IE_Bmp_Undo)
                        $IE_Bmp_Undo = _GDIPlus_BitmapCloneArea($hBmp, 0, 0, $bW, $bH)
                        If Not $IE_Bmp_Undo Or @error Then Return MsgBox(16 + 262144, "ERROR", "Whoops an internal error has occured: unable to clone ie undo bitmap!" & @CRLF & @CRLF & _
                                "Sorry for inconvenience! :-(", 20, WinGetHandle(AutoItWinGetTitle()))
                        $Undo_IE = True
                        ASM_Bitmap_Grey_BnW($hBmp, 1, $BW_val, True)
                        CopyImage2Control($idPic_ImageEditor)
                        _GDIPlus_GraphicsDispose($hCtx_IE_BMP)
                        $hCtx_IE_BMP = _GDIPlus_ImageGetGraphicsContext($hBmp)
                        _GDIPlus_GraphicsSetSmoothingMode($hCtx_IE_BMP, 2)
                    EndIf
                    WinActivate($hGUI_ImageEditor_Child)
                Case $IE_Dummy_Pix
                    $pix_go = True
                    $hGUI_IE_PixelizeConf = GUICreate("Pixelize Settings", 194, 43, -1, -1, -1, BitOR($WS_EX_TOOLWINDOW, $WS_EX_WINDOWEDGE, $WS_EX_TOPMOST), $hGUI_ImageEditor)
                    $idInput_IE_PC = GUICtrlCreateInput($IE_Pix_Size, 78, 10, 41, 21, BitOR($ES_CENTER, $ES_NUMBER))
                    $idLabel_Pixel = GUICtrlCreateLabel("Pixel Size", 16, 10, 62, 23)
                    GUICtrlSetFont(-1, 12, 400, 0, "Times New Roman")
                    $idButton_IE_OK = GUICtrlCreateButton("OK", 144, 8, 43, 25)
                    GUISetState(@SW_SHOW, $hGUI_IE_PixelizeConf)
                    ControlFocus($hGUI_IE_PixelizeConf, "", $idButton_IE_OK)

                    While 1
                        Switch GUIGetMsg()
                            Case $GUI_EVENT_CLOSE
                                Local $pix_go = False
                                ExitLoop
                            Case $idButton_IE_OK
                                ExitLoop
                        EndSwitch
                    WEnd

                    If $pix_go Then
                        _GDIPlus_BitmapDispose($IE_Bmp_Undo)
                        $IE_Bmp_Undo = _GDIPlus_BitmapCloneArea($hBmp, 0, 0, $bW, $bH)
                        If Not $IE_Bmp_Undo Or @error Then Return MsgBox(16 + 262144, "ERROR", "Whoops an internal error has occured: unable to clone ie undo bitmap!" & @CRLF & @CRLF & _
                                "Sorry for inconvenience! :-(", 20, WinGetHandle(AutoItWinGetTitle()))
                        $Undo_IE = True
                        ASM_Bitmap_Pixelize($hBmp, Min(GUICtrlRead($idInput_IE_PC), Min($bW, $bH)))
                        CopyImage2Control($idPic_ImageEditor)
                        GUIDelete($hGUI_IE_PixelizeConf)
                        _GDIPlus_GraphicsDispose($hCtx_IE_BMP)
                        $hCtx_IE_BMP = _GDIPlus_ImageGetGraphicsContext($hBmp)
                        _GDIPlus_GraphicsSetSmoothingMode($hCtx_IE_BMP, 2)
                    Else
                        GUIDelete($hGUI_IE_PixelizeConf)
                    EndIf
                    WinActivate($hGUI_ImageEditor_Child)

                Case $IE_Dummy_Ras
                    $rast_go = True
                    $iColor_Rasterize = 0x000000
                    $hGUI_ImageEditor_Raster = GUICreate("Rasterize Setting", 278, 100, -1, -1, BitOR($WS_SYSMENU, $WS_GROUP), BitOR($WS_EX_TOOLWINDOW, $WS_EX_WINDOWEDGE, $WS_EX_TOPMOST), $hGUI_ImageEditor)
                    $idLabel_IE_Raster = GUICtrlCreateLabel("Current Color", 6, 10, 86, 56, $SS_CENTER)
                    GUICtrlSetFont(-1, 18, 400, 0, "Times New Roman")
                    $idButton_IE_Color = GUICtrlCreateButton("Change", 176, 8, 80, 28)
                    GUICtrlSetFont(-1, 12, 400, 0, "Times New Roman")
                    $idButton_IE_Color_Start = GUICtrlCreateButton("Start", 176, 40, 80, 28)
                    GUICtrlSetFont(-1, 12, 400, 0, "Times New Roman")
                    $idGraphic_Color = GUICtrlCreateGraphic(100, 8, 61, 61, $SS_ETCHEDFRAME)
                    $idLabel_IE_Raster_Color = GUICtrlCreateLabel("", 104, 12, 52, 52)
                    GUICtrlSetBkColor(-1, $iColor_Rasterize)
                    GUISetState(@SW_SHOW, $hGUI_ImageEditor_Raster)
                    ControlFocus($hGUI_ImageEditor_Raster, "", $idButton_IE_Color_Start)

                    While 1
                        Switch GUIGetMsg()
                            Case $GUI_EVENT_CLOSE
                                $rast_go = False
                                ExitLoop
                            Case $idButton_IE_Color, $idLabel_IE_Raster_Color
                                $iColor_Rasterize = _ChooseColor(2, $iColor_Rasterize, 2)
                                If Not @error Then GUICtrlSetBkColor(-1, $iColor_Rasterize)
                            Case $idButton_IE_Color_Start
                                ExitLoop
                        EndSwitch
                    WEnd

                    GUIDelete($hGUI_ImageEditor_Raster)
                    If $rast_go Then
                        _GDIPlus_BitmapDispose($IE_Bmp_Undo)
                        $IE_Bmp_Undo = _GDIPlus_BitmapCloneArea($hBmp, 0, 0, $bW, $bH)
                        If Not $IE_Bmp_Undo Or @error Then Return MsgBox(16 + 262144, "ERROR", "Whoops an internal error has occured: unable to clone ie undo bitmap!" & @CRLF & @CRLF & _
                                "Sorry for inconvenience! :-(", 20, WinGetHandle(AutoItWinGetTitle()))
                        $Undo_IE = True
                        ASM_Bitmap_Rasterize($hBmp, $iColor_Rasterize)
                        CopyImage2Control($idPic_ImageEditor)
                        _GDIPlus_GraphicsDispose($hCtx_IE_BMP)
                        $hCtx_IE_BMP = _GDIPlus_ImageGetGraphicsContext($hBmp)
                        _GDIPlus_GraphicsSetSmoothingMode($hCtx_IE_BMP, 2)
                    EndIf
                    WinActivate($hGUI_ImageEditor_Child)
                Case $IE_Dummy_Res
                    GUIRegisterMsg($WM_COMMAND, "")
                    _GDIPlus_BitmapDispose($IE_Bmp_Undo)
                    $IE_Bmp_Undo = _GDIPlus_BitmapCloneArea($hBmp, 0, 0, $bW, $bH)
                    If Not $IE_Bmp_Undo Or @error Then Return MsgBox(16 + 262144, "ERROR", "Whoops an internal error has occured: unable to clone ie undo bitmap!" & @CRLF & @CRLF & _
                            "Sorry for inconvenience! :-(", 20, WinGetHandle(AutoItWinGetTitle()))
                    $Undo_IE = True
                    $hGUI_IE_Resize = GUICreate("Resize Image", 306, 470, -1, -1, BitOR($WS_SYSMENU, $WS_GROUP), BitOR($WS_EX_TOOLWINDOW, $WS_EX_WINDOWEDGE, $WS_EX_TOPMOST), $hGUI_ImageEditor)
                    GUISetFont(8, 400, 0, "Arial")

                    $idGroup_IE_ISize = GUICtrlCreateGroup(" Image Size ", 16, 8, 273, 97)
                    $idLabel_IE_Current = GUICtrlCreateLabel("Current Size:", 32, 32, 94, 22)
                    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
                    $idLabel_IE_New = GUICtrlCreateLabel("New Size:", 32, 64, 74, 22)
                    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
                    $idLabel_IE_SizeC = GUICtrlCreateLabel($bW & " x " & $bH & " Pixel", 134, 32, 129, 22, $SS_RIGHT)
                    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
                    $idLabel_IE_SizeN = GUICtrlCreateLabel($bW & " x " & $bH & " Pixel", 134, 64, 129, 22, $SS_RIGHT)
                    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
                    GUICtrlCreateGroup("", -99, -99, 1, 1)

                    $idGroup_IE_INSize = GUICtrlCreateGroup(" Set New Size ", 16, 120, 273, 185)
                    $idLabel_IE_W1 = GUICtrlCreateLabel("Width:", 36, 146, 46, 21)
                    GUICtrlSetFont(-1, 11, 400, 0, "Arial")
                    $idInput_IE_W = GUICtrlCreateInput($bW, 80, 144, 49, 23, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER))
                    GUICtrlSetFont(-1, 9, 400, 0, "Arial")
                    $idLabel_IE_x = GUICtrlCreateLabel("x", 144, 146, 11, 20)
                    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
                    $idLabel_IE_H1 = GUICtrlCreateLabel(":Height", 221, 146, 49, 21)
                    GUICtrlSetFont(-1, 11, 400, 0, "Arial")
                    $idInput_IE_H = GUICtrlCreateInput($bH, 166, 144, 49, 23, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER))
                    GUICtrlSetFont(-1, 9, 400, 0, "Arial")
                    $idLabel_IE_W2 = GUICtrlCreateLabel("Width:", 36, 183, 46, 21)
                    GUICtrlSetFont(-1, 11, 400, 0, "Arial")
                    $idInput_IE_WP = GUICtrlCreateInput("100", 80, 181, 35, 23, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER))
                    GUICtrlSetFont(-1, 9, 400, 0, "Arial")
                    $idLabel_IE_P1 = GUICtrlCreateLabel("%", 116, 185, 15, 19)
                    GUICtrlSetFont(-1, 9, 400, 0, "Arial")
                    $idInput_IE_HP = GUICtrlCreateInput("100", 166, 181, 35, 23, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER))
                    GUICtrlSetFont(-1, 9, 400, 0, "Arial")
                    $idLabel_IE_P2 = GUICtrlCreateLabel("%", 202, 185, 15, 19)
                    GUICtrlSetFont(-1, 9, 400, 0, "Arial")
                    $idLabel_IE_H2 = GUICtrlCreateLabel(":Height", 221, 183, 49, 21)
                    GUICtrlSetFont(-1, 11, 400, 0, "Arial")
                    $idChkBox_IE_AR = GUICtrlCreateCheckbox("Preserve Aspect Ration", 80, 220)
                    $idButton_IE_IHalf = GUICtrlCreateButton("Half", 36, 264, 75, 25)
                    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
                    $idButton_IE_IDouble = GUICtrlCreateButton("Double", 193, 264, 75, 25)
                    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
                    GUICtrlCreateGroup("", -99, -99, 1, 1)

                    $idGroup_IE_IMethod = GUICtrlCreateGroup(" Resize Method ", 16, 320, 273, 73)
                    $idCombo_IE = GUICtrlCreateCombo("", 32, 354, 241, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL))
                    GUICtrlSetData(-1, "0 - Default interpolation mode|1 - Low-quality mode|2 - High-quality mode|3 - Bilinear interpolation|4 - Bicubic interpolation|5 - Nearest-neighbor interpolation|6 - High-quality, bilinear interpolation|7 - High-quality, bicubic interpolation", "7 - High-quality, bicubic interpolation")
                    GUICtrlCreateGroup("", -99, -99, 1, 1)

                    $idButton_IE_OK = GUICtrlCreateButton("OK", 72, 408, 75, 25)
                    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
                    $idButton_IE_Cancel = GUICtrlCreateButton("Cancel", 160, 408, 75, 25)
                    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
                    GUISetState(@SW_SHOW, $hGUI_IE_Resize)
                    ControlFocus($hGUI_IE_Resize, "", $idButton_IE_Cancel)
                    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND_IE")

                    Local $w, $h, $maxw, $maxh, $minw, $minh
                    While 1
                        Switch GUIGetMsg()
                            Case $GUI_EVENT_CLOSE, $idButton_IE_Cancel
                                GUIDelete($hGUI_IE_Resize)
                                Return 0
                            Case $idButton_IE_OK
                                ExitLoop
                            Case $idButton_IE_IHalf
                                $maxw = Round(GUICtrlRead($idInput_IE_W) / 2, 0)
                                $maxh = Round(GUICtrlRead($idInput_IE_H) / 2, 0)
                                If $maxw > 1 Or $maxh > 1 Then
                                    GUICtrlSetData($idInput_IE_W, $maxw)
                                    GUICtrlSetData($idInput_IE_H, $maxh)
                                    GUICtrlSetData($idInput_IE_WP, Round(GUICtrlRead($idInput_IE_W) / $bW * 100))
                                    GUICtrlSetData($idInput_IE_HP, Round(GUICtrlRead($idInput_IE_H) / $bH * 100))
                                    GUICtrlSetData($idLabel_IE_SizeN, GUICtrlRead($idInput_IE_W) & " x " & GUICtrlRead($idInput_IE_H) & " Pixel")
                                EndIf
                            Case $idButton_IE_IDouble
                                $minw = Round(GUICtrlRead($idInput_IE_W) * 2, 0)
                                $minh = Round(GUICtrlRead($idInput_IE_H) * 2, 0)
                                If $minw < 16384 Or $minh < 16384 Then
                                    GUICtrlSetData($idInput_IE_W, $minw)
                                    GUICtrlSetData($idInput_IE_H, $minh)
                                    GUICtrlSetData($idInput_IE_WP, Round(GUICtrlRead($idInput_IE_W) / $bW * 100))
                                    GUICtrlSetData($idInput_IE_HP, Round(GUICtrlRead($idInput_IE_H) / $bH * 100))
                                    GUICtrlSetData($idLabel_IE_SizeN, GUICtrlRead($idInput_IE_W) & " x " & GUICtrlRead($idInput_IE_H) & " Pixel")
                                EndIf
                        EndSwitch
                    WEnd

                    $bW = GUICtrlRead($idInput_IE_W)
                    $bH = GUICtrlRead($idInput_IE_H)
                    Local $hBmp_New = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $bW, "int", $bH, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
                    $hBmp_New = $hBmp_New[6]
                    Local $hCtx_IE_New = _GDIPlus_ImageGetGraphicsContext($hBmp_New)
                    DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hCtx_IE_New, "int", _SendMessage(GUICtrlGetHandle($idCombo_IE), $CB_GETCURSEL))
                    _GDIPlus_GraphicsDrawImageRect($hCtx_IE_New, $hBmp, 0, 0, $bW, $bH)
                    _GDIPlus_BitmapDispose($hBmp)
                    _GDIPlus_GraphicsDispose($hCtx_IE_New)

                    GUIDelete($hGUI_IE_Resize)

                    $hBmp = $hBmp_New

                    $bW = _GDIPlus_ImageGetWidth($hBmp)
                    $bH = _GDIPlus_ImageGetHeight($hBmp)

                    If $bW < $hGUI_ImageEditor_W Or $bH < ($hGUI_ImageEditor_H - $height_delta) Then
                        $IE_offset_x = -($hGUI_ImageEditor_W - $bW) / 2
                        $IE_offset_y = -(($hGUI_ImageEditor_H - $height_delta) - $bH) / 2
                        GUICtrlSetPos($idPic_ImageEditor, $IE_offset_x * - 1, ($hGUI_ImageEditor_H - $bH) / 2 - $height_delta / 2, $bW, $bH)
                    Else
                        GUICtrlSetPos($idPic_ImageEditor, 0, 0, $bW, $bH)
                    EndIf
                    $iMetricsSumX = ($bH > ($hGUI_ImageEditor_H - $height_delta)) * $iVSscroll + $iXFixedFrame * 2
                    $iMetricsSumY = ($bW > $hGUI_ImageEditor_W) * $iHSscroll + $iYCaption + $iYFixedFrame

                    _Functions_RemoveScrollBars($hGUI_ImageEditor_Child)
                    $IE_ScrollbarH = False
                    $IE_ScrollbarV = False

                    If $bW > $hGUI_ImageEditor_W Or $bH > ($hGUI_ImageEditor_H - $height_delta) Then
                        _GUIScrollBars_Init($hGUI_ImageEditor_Child)
                        _GUIScrollBars_SetScrollInfoMin($hGUI_ImageEditor_Child, $SB_HORZ, 0)
                        _GUIScrollBars_SetScrollInfoMax($hGUI_ImageEditor_Child, $SB_HORZ, $bW - $hGUI_ImageEditor_W + 61 + $iMetricsSumX)
                        _GUIScrollBars_SetScrollInfoMin($hGUI_ImageEditor_Child, $SB_VERT, 0)
                        _GUIScrollBars_SetScrollInfoMax($hGUI_ImageEditor_Child, $SB_VERT, $bH - $hGUI_ImageEditor_H + $iMetricsSumY + $height_delta - 1)
                        GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL_IE")
                        GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL_IE")
                        GUIRegisterMsg($WM_MOUSEWHEEL, "WM_MOUSEWHEEL_IE")

                        If $bW > $hGUI_ImageEditor_W Then
                            WM_HSCROLL_IE($hGUI_ImageEditor_Child, 0, $SB_THUMBTRACK, 0)
                            $IE_ScrollbarH = True
                        EndIf
                        If $bH > ($hGUI_ImageEditor_H - $height_delta) Then
                            WM_VSCROLL_IE($hGUI_ImageEditor_Child, 0, $SB_THUMBTRACK, 0)
                            $IE_ScrollbarV = True
                        EndIf
                    Else
                        GUIRegisterMsg($WM_HSCROLL, "")
                        GUIRegisterMsg($WM_VSCROLL, "")
                        GUIRegisterMsg($WM_MOUSEWHEEL, "")
                    EndIf

                    _GDIPlus_GraphicsDispose($hGfx_IE)
                    _GDIPlus_GraphicsDispose($hCtx_IE)
                    _GDIPlus_ImageDispose($hCtx_IE_BMP)
                    _GDIPlus_BitmapDispose($hGfx_IE_BMP)

                    _WinAPI_DeleteObject(GUICtrlSendMsg($idPic_ImageEditor, $STM_SETIMAGE, $IMAGE_BITMAP, 0))
                    CopyImage2Control($idPic_ImageEditor)

                    $hGfx_IE = _GDIPlus_GraphicsCreateFromHWND(GUICtrlGetHandle($idPic_ImageEditor))
                    $hGfx_IE_BMP = _GDIPlus_BitmapCreateFromGraphics($bW, $bH, $hGfx_IE)
                    $hCtx_IE = _GDIPlus_ImageGetGraphicsContext($hGfx_IE_BMP)
                    $hCtx_IE_BMP = _GDIPlus_ImageGetGraphicsContext($hBmp)
                    _GDIPlus_GraphicsSetSmoothingMode($hCtx_IE_BMP, 2)
                    _GDIPlus_GraphicsSetSmoothingMode($hCtx_IE, 2)
                    _GDIPlus_GraphicsSetSmoothingMode($hGfx_IE, 2)

                    WinSetTitle($hGUI_ImageEditor, "", "AutoIt Windows Screenshooter Basic Image Editor / Image Info: " & $bW & "x" & $bH & " pixel")

                    WinActivate($hGUI_ImageEditor_Child)
            EndSwitch
        EndIf
    Until False

    If @OSBuild < 6000 Then DllCall("UxTheme.dll", "int", "SetWindowTheme", "hwnd", $hToolbar_IE, "ptr", 0, "ptr", 0)

    _WinAPI_DeleteObject($hHBITMAP_IE_Icons)
    _WinAPI_DestroyIcon($hIcon_New)
    _GDIPlus_BrushDispose($hBrush_IE)
    _GDIPlus_PenDispose($hPen_IE)
    _GDIPlus_PenDispose($hPenArrow_IE)
    _GDIPlus_PenDispose($hHL_IE)
    _GDIPlus_ArrowCapDispose($hEndCap)
    _GDIPlus_BitmapDispose($IE_Bmp_Undo)
    _GDIPlus_BitmapDispose($hWnd_Title_Icon)
    _GDIPlus_BitmapDispose($hGfx_IE_BMP)
    _GDIPlus_GraphicsDispose($hCtx_IE_BMP)
    _GDIPlus_GraphicsDispose($hCtx_IE)
    _GDIPlus_GraphicsDispose($hGfx_IE)

    GUIRegisterMsg($WM_SETCURSOR, "")
    GUIRegisterMsg($WM_MOUSEWHEEL, "")
    GUIRegisterMsg($WM_HSCROLL, "")
    GUIRegisterMsg($WM_VSCROLL, "")
    GUIRegisterMsg($WM_COMMAND, "")
    GUIRegisterMsg($WM_NOTIFY, "")
    GUIDelete($hGUI_ImageEditor_Child)
    GUIDelete($hGUI_ImageEditor)
EndFunc   ;==>ImageEditor

Func Array_Shorten(ByRef $aArray, $iDiv)
    Local $iNew = Round(UBound($aArray) / $iDiv, 0)
    Local $aTmp[$iNew][2], $i, $j = 1
    $aTmp[0][0] = $iNew - 1
    For $i = 1 To $aTmp[0][0]
        $aTmp[$i][0] = $aArray[$j][0]
        $aTmp[$i][1] = $aArray[$j][1]
        $j += $iDiv
    Next
    $aArray = $aTmp
EndFunc

Func _Functions_RemoveScrollBars($hWnd, $horz = True, $vert = True)
    Local $tSCROLLINFO = DllStructCreate($tagSCROLLINFO)
    DllStructSetData($tSCROLLINFO, "fMask", BitOR($SIF_RANGE, $SIF_PAGE))
    DllStructSetData($tSCROLLINFO, "nMin", 0)
    DllStructSetData($tSCROLLINFO, "nMax", 0)
    DllStructSetData($tSCROLLINFO, "nPage", 0)
    If $horz Then _GUIScrollBars_SetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
    If $vert Then _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
EndFunc   ;==>_Functions_RemoveScrollBars

Func CopyImage2Control($idControl)
    Local Const $hHBitmap_ImageEditor = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)
    Local Const $hB = GUICtrlSendMsg($idPic_ImageEditor, $STM_SETIMAGE, $IMAGE_BITMAP, $hHBitmap_ImageEditor)
    If $hB Then _WinAPI_DeleteObject($hB)
    _WinAPI_DeleteObject($hHBitmap_ImageEditor)
EndFunc   ;==>CopyImage2Control

Func _GDIPlus_GraphicsDrawString2($hGraphics, $sString, $sFont = "Arial", $nSize = 24, $iFormat = 0, $iColor = 0xFFFF0000, $nX = 0, $nY = 0)
    Local $hBrush = _GDIPlus_BrushCreateSolid($iColor)
    Local $hFormat = _GDIPlus_StringFormatCreate($iFormat)
    Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
    Local $hFont = _GDIPlus_FontCreate($hFamily, $nSize)
    Local $tLayout = _GDIPlus_RectFCreate($nX, $nY, 0, 0)
    Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphics, $sString, $hFont, $tLayout, $hFormat)
    Local $aResult = _GDIPlus_GraphicsDrawStringEx($hGraphics, $sString, $hFont, $aInfo[0], $hFormat, $hBrush)
    Local $iError = @error
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_BrushDispose($hBrush)
    Return SetError($iError, 0, $aResult)
EndFunc   ;==>_GDIPlus_GraphicsDrawString2

Func GetStringSize($string, $font, $fontsize, $fontstyle)
    Local $iWidth = StringLen($string) * $fontsize
    Local $iHeight = 2 * $fontsize
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
    Local $hBitmap = $aResult[6]
    Local $hGrphContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    Local $hFormat = _GDIPlus_StringFormatCreate()
    Local $hFamily = _GDIPlus_FontFamilyCreate($font)
    Local $hFont = _GDIPlus_FontCreate($hFamily, $fontsize, $fontstyle)
    Local $tLayout = _GDIPlus_RectFCreate(0, 0, 0, 0)
    Local $aInfo = _GDIPlus_GraphicsMeasureString($hGrphContext, $string, $hFont, $tLayout, $hFormat)
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hGrphContext)
    Local $aDim[2] = [Int(DllStructGetData($aInfo[0], "Width")), Int(DllStructGetData($aInfo[0], "Height"))]
    Return $aDim
EndFunc   ;==>GetStringSize
#endregion Image Editor

Func Save_Bitmap()
    Local $m, $save, $hBmp_tmp, $ok = True
    Local $filename = FileSaveDialog("Save Image", @ScriptDir, "Images (*.jpg;*.png;*.bmp;*.gif;*.tif)", 18, "", $hGUI_ImageEditor)
    If Not @error Then
        If StringMid($filename, StringLen($filename) - 3, 1) <> "." Then
            $filename &= ".png"
            If FileExists($filename) Then
                $m = MsgBox(4 + 48, "Confirm save", $filename & " already exists." & @CRLF & "Do you want t replace it?")
                If $m = 7 Then $ok = False
            EndIf
        EndIf
        If $ok Then
            Switch StringRight($filename, 4)
                Case ".jpg"
                    Local $sCLSID = _GDIPlus_EncodersGetCLSID("JPG")
                    Local $tParams = _GDIPlus_ParamInit(1)
                    Local $tData = DllStructCreate("int Quality")
                    DllStructSetData($tData, "Quality", 90)
                    Local $pData = DllStructGetPtr($tData)
                    _GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
                    Local $pParams = DllStructGetPtr($tParams)
                    $save = _GDIPlus_ImageSaveToFileEx($hBmp, $filename, $sCLSID, $pParams)
                    $tData = ""
                    $tParams = ""
                Case Else
                    $save = _GDIPlus_ImageSaveToFile($hBmp, $filename)
            EndSwitch
        EndIf

        If $save Then
            Local $c = MsgBox(4 + 64 + 256, "Information", "Image saved properly to: " & @CRLF & @CRLF & $filename & @CRLF & @CRLF & @CRLF & _
                    "Display saved image with default app?", 20, $hGUI_ImageEditor)
            If $c = 6 Then ShellExecute($filename)
        Else
            MsgBox(16, "ERROR", "Image could not be saved!", 20)
        EndIf
    EndIf
EndFunc   ;==>Save_Bitmap

Func WM_SETCURSOR($hWnd, $iMsg, $wParam, $lParam)
    #forceref $iMsg, $wParam, $lParam
    Switch $hWnd
        Case $hGUI_ImageEditor_Child
            Local $aMPos_IE = GUIGetCursorInfo($hGUI_ImageEditor_Child)
            If (Not @error) And ($aMPos_IE[4] = $idPic_ImageEditor) Then
                _WinAPI_SetCursor($hCursor_IE)
                Return 1
            EndIf
    EndSwitch
    Return "GUI_RUNDEFMSG"
EndFunc   ;==>WM_SETCURSOR

Func WM_NOTIFY_IE($hWnd, $MsgID, $wParam, $lParam)
    #forceref $hWnd, $MsgID, $wParam
    Local $tNMHDR, $event, $hwndFrom, $code, $i_idNew, $dwFlags, $lResult, $idFrom, $i_idOld
    Local $tNMTOOLBAR, $tNMTBHOTITEM, $hSubmenu, $aRet, $iMenuID

    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hwndFrom = DllStructGetData($tNMHDR, "hWndFrom")
    $idFrom = DllStructGetData($tNMHDR, "IDFrom")
    $code = DllStructGetData($tNMHDR, "Code")

    Switch $hwndFrom
        Case $hToolbar_IE
            Switch $code
                Case $NM_LDOWN
                    Switch _GUICtrlToolbar_IsButtonEnabled($hToolbar_IE, $IE_iItem)
                        Case True
                            GUICtrlSendToDummy($TB_Button_Chk, $IE_iItem)
                    EndSwitch
                Case $TBN_HOTITEMCHANGE
                    $tNMTBHOTITEM = DllStructCreate($tagNMTBHOTITEM, $lParam)
                    $i_idOld = DllStructGetData($tNMTBHOTITEM, "idOld")
                    $i_idNew = DllStructGetData($tNMTBHOTITEM, "idNew")
                    $IE_iItem = $i_idNew
                    $dwFlags = DllStructGetData($tNMTBHOTITEM, "dwFlags")
                Case $TBN_DROPDOWN
                    Switch $IE_iItem
                        Case $idIEPen_Size
                            _GUICtrlMenu_TrackPopupMenu($hMenu_IE_PS, $hGUI_ImageEditor)
;~                          _GUICtrlMenu_DestroyMenu($hMenu_IE_PS)
                            Return 0
                        Case $idFX_IE
                            _GUICtrlMenu_TrackPopupMenu($hMenu_IE_FX, $hGUI_ImageEditor)
;~                          _GUICtrlMenu_DestroyMenu($hMenu_IE_FX)
                            Return 0
                    EndSwitch

            EndSwitch
    EndSwitch
    Return "GUI_RUNDEFMSG"
EndFunc   ;==>WM_NOTIFY_IE

Func WM_COMMAND_IE($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $ilParam
    Local $nMsg_IE, $ii
    Switch BitAND($iwParam, 0x0000FFFF)
        Case $idInput_IE_W
            $ii = GUICtrlRead($idInput_IE_W)
            Switch BitAND(GUICtrlRead($idChkBox_IE_AR), $GUI_CHECKED)
                Case 0
                    GUICtrlSetData($idInput_IE_W, Max(1, Min($ii, 16384)))
                Case 1
                    GUICtrlSetData($idInput_IE_W, Max(1, Min($ii, 16384)))
                    $ii = Round(GUICtrlRead($idInput_IE_W) * $bH / $bW, 0)
                    GUICtrlSetData($idInput_IE_H, $ii)
            EndSwitch
            GUICtrlSetData($idInput_IE_WP, Round(GUICtrlRead($idInput_IE_W) / $bW * 100))
            GUICtrlSetData($idInput_IE_HP, Round(GUICtrlRead($idInput_IE_H) / $bH * 100))
            GUICtrlSetData($idLabel_IE_SizeN, GUICtrlRead($idInput_IE_W) & " x " & GUICtrlRead($idInput_IE_H) & " Pixel")
        Case $idInput_IE_H
            $ii = GUICtrlRead($idInput_IE_H)
            Switch BitAND(GUICtrlRead($idChkBox_IE_AR), $GUI_CHECKED)
                Case 0
                    GUICtrlSetData($idInput_IE_H, Max(1, Min($ii, 16384)))
                Case 1
                    GUICtrlSetData($idInput_IE_H, Max(1, Min($ii, 16384)))
                    $ii = Round(GUICtrlRead($idInput_IE_H) * $bW / $bH, 0)
                    GUICtrlSetData($idInput_IE_W, $ii)
            EndSwitch
            GUICtrlSetData($idInput_IE_WP, Round(GUICtrlRead($idInput_IE_W) / $bW * 100))
            GUICtrlSetData($idInput_IE_HP, Round(GUICtrlRead($idInput_IE_H) / $bH * 100))
            GUICtrlSetData($idLabel_IE_SizeN, GUICtrlRead($idInput_IE_W) & " x " & GUICtrlRead($idInput_IE_H) & " Pixel")
        Case $idInput_IE_WP
            $ii = Round(GUICtrlRead($idInput_IE_WP) / 100 * $bW, 0)
            Switch BitAND(GUICtrlRead($idChkBox_IE_AR), $GUI_CHECKED)
                Case 0
                    GUICtrlSetData($idInput_IE_W, Max(1, Min($ii, 16384)))
                Case 1
                    GUICtrlSetData($idInput_IE_W, Max(1, Min($ii, 16384)))
                    $ii = Round(GUICtrlRead($idInput_IE_W) * $bH / $bW, 0)
                    GUICtrlSetData($idInput_IE_H, $ii)
            EndSwitch
            GUICtrlSetData($idInput_IE_HP, Round(GUICtrlRead($idInput_IE_H) / $bH * 100))
            GUICtrlSetData($idLabel_IE_SizeN, GUICtrlRead($idInput_IE_W) & " x " & GUICtrlRead($idInput_IE_H) & " Pixel")
        Case $idInput_IE_HP
            $ii = Round(GUICtrlRead($idInput_IE_HP) / 100 * $bH, 0)
            Switch BitAND(GUICtrlRead($idChkBox_IE_AR), $GUI_CHECKED)
                Case 0
                    GUICtrlSetData($idInput_IE_H, Max(1, Min($ii, 16384)))
                Case 1
                    GUICtrlSetData($idInput_IE_H, Max(1, Min($ii, 16384)))
                    $ii = Round(GUICtrlRead($idInput_IE_H) * $bW / $bH, 0)
                    GUICtrlSetData($idInput_IE_W, $ii)
            EndSwitch
            GUICtrlSetData($idInput_IE_WP, Round(GUICtrlRead($idInput_IE_W) / $bW * 100))
            GUICtrlSetData($idLabel_IE_SizeN, GUICtrlRead($idInput_IE_W) & " x " & GUICtrlRead($idInput_IE_H) & " Pixel")
    EndSwitch
    Switch $iwParam
        Case $idFX_IE_GS
            Local $GS_val = 128, $aCI, $gs_go = True
;~          $hGUI_ImageEditor_GS = GUICreate("Greyscale Setting", 332, 118, -1, -1, BitOR($WS_SYSMENU, $WS_GROUP), BitOR($WS_EX_TOOLWINDOW, $WS_EX_WINDOWEDGE, $WS_EX_TOPMOST), $hGUI_ImageEditor)
;~          $hSlider_IE_GS = _GUICtrlSlider_Create($hGUI_ImageEditor_GS, 10, 40, 310, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE, $WS_TABSTOP))
;~          _GUICtrlSlider_SetRangeMin($hSlider_IE_GS, 1)
;~          _GUICtrlSlider_SetRangeMax($hSlider_IE_GS, 255)
;~          _GUICtrlSlider_SetPos($hSlider_IE_GS, $GS_val)
;~          Local Const $idLabel_IE_GS = GUICtrlCreateLabel("Greyscale Treshold", 20, 2, 83, 33)
;~          GUICtrlSetFont(-1, 11, 400, 0, "Times New Roman")
;~          $idInput_IE_GS = GUICtrlCreateInput($GS_val, 112, 8, 95, 27, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY))
;~          GUICtrlSetFont(-1, 12, 400, 0, "Times New Roman")
;~          Local Const $idButton_IE_GS = GUICtrlCreateButton("Start", 224, 8, 80, 27)
;~          GUICtrlSetFont(-1, 12, 400, 0, "Times New Roman")
;~          GUISetState(@SW_SHOW, $hGUI_ImageEditor_GS)

;~          While 1
;~              $nMsg_IE = GUIGetMsg()
;~              Switch $nMsg_IE
;~                  Case $GUI_EVENT_CLOSE
;~                      GUIDelete($hGUI_ImageEditor_GS)
;~                      $gs_go = False
;~                      ExitLoop
;~                  Case $idButton_IE_GS
;~                      $GS_val = _GUICtrlSlider_GetPos($hSlider_IE_GS)
;~                      GUIDelete($hGUI_ImageEditor_GS)
;~                      ExitLoop
;~              EndSwitch
;~              $aCI = GUIGetCursorInfo($hGUI_ImageEditor_GS)
;~              If $aCI [2] Then GUICtrlSetData($idInput_IE_GS, $IE_tmp)
;~          WEnd

            If $gs_go Then
                _GDIPlus_BitmapDispose($IE_Bmp_Undo)
                $IE_Bmp_Undo = _GDIPlus_BitmapCloneArea($hBmp, 0, 0, $bW, $bH)
                If Not $IE_Bmp_Undo Or @error Then Return MsgBox(16 + 262144, "ERROR", "Whoops an internal error has occured: unable to clone ie undo bitmap!" & @CRLF & @CRLF & _
                        "Sorry for inconvenience! :-(", 20, WinGetHandle(AutoItWinGetTitle()))
                $Undo_IE = True
                ASM_Bitmap_Grey_BnW($hBmp, 0, $GS_val, True)
                CopyImage2Control($idPic_ImageEditor)
                WinActivate($hGUI_ImageEditor_Child)
                _GDIPlus_GraphicsDispose($hCtx_IE_BMP)
                $hCtx_IE_BMP = _GDIPlus_ImageGetGraphicsContext($hBmp)
                _GDIPlus_GraphicsSetSmoothingMode($hCtx_IE_BMP, 2)
            EndIf
            Return 1
        Case $idFX_IE_BW
            GUICtrlSendToDummy($IE_Dummy_BW)
        Case $idFX_IE_INV
            _GDIPlus_BitmapDispose($IE_Bmp_Undo)
            $IE_Bmp_Undo = _GDIPlus_BitmapCloneArea($hBmp, 0, 0, $bW, $bH)
            If Not $IE_Bmp_Undo Or @error Then Return MsgBox(16 + 262144, "ERROR", "Whoops an internal error has occured: unable to clone ie undo bitmap!" & @CRLF & @CRLF & _
                    "Sorry for inconvenience! :-(", 20, WinGetHandle(AutoItWinGetTitle()))
            $Undo_IE = True
            ASM_Bitmap_Invert($hBmp, True)
            CopyImage2Control($idPic_ImageEditor)
            WinActivate($hGUI_ImageEditor_Child)
            _GDIPlus_GraphicsDispose($hCtx_IE_BMP)
            $hCtx_IE_BMP = _GDIPlus_ImageGetGraphicsContext($hBmp)
            _GDIPlus_GraphicsSetSmoothingMode($hCtx_IE_BMP, 2)
            Return 1
        Case $idFX_IE_BLUR
            GUICtrlSendToDummy($IE_Dummy_Blur)
            Return 1
        Case $idFX_IE_Pix
            GUICtrlSendToDummy($IE_Dummy_Pix)
            Return 1
        Case $idFX_IE_Rast
            GUICtrlSendToDummy($IE_Dummy_Ras)
            Return 1
        Case $idFX_IE_Resize
            GUICtrlSendToDummy($IE_Dummy_Res)
            Return 1
        Case $idIEPen_Size_1px
            _GUICtrlMenu_CheckRadioItem($hMenu_IE_PS, 0, 5, 0)
            _GDIPlus_PenSetWidth($hPen_IE, 1)
            _GDIPlus_PenSetWidth($hPenArrow_IE, 1)
            $IE_PenSize = 1
        Case $idIEPen_Size_2px
            _GUICtrlMenu_CheckRadioItem($hMenu_IE_PS, 0, 5, 1)
            _GDIPlus_PenSetWidth($hPen_IE, 2)
            _GDIPlus_PenSetWidth($hPenArrow_IE, 2)
            $IE_PenSize = 2
        Case $idIEPen_Size_4px
            _GUICtrlMenu_CheckRadioItem($hMenu_IE_PS, 0, 5, 2)
            _GDIPlus_PenSetWidth($hPen_IE, 4)
            _GDIPlus_PenSetWidth($hPenArrow_IE, 4)
            $IE_PenSize = 4
        Case $idIEPen_Size_8px
            _GUICtrlMenu_CheckRadioItem($hMenu_IE_PS, 0, 5, 3)
            _GDIPlus_PenSetWidth($hPen_IE, 8)
            _GDIPlus_PenSetWidth($hPenArrow_IE, 8)
            $IE_PenSize = 8
        Case $idIEPen_Size_16px
            _GUICtrlMenu_CheckRadioItem($hMenu_IE_PS, 0, 5, 4)
            _GDIPlus_PenSetWidth($hPen_IE, 16)
            _GDIPlus_PenSetWidth($hPenArrow_IE, 16)
            $IE_PenSize = 16
    EndSwitch

    If _GUICtrlToolbar_IsButtonChecked($hToolbar_IE, $idPen_IE) Or _GUICtrlToolbar_IsButtonChecked($hToolbar_IE, $idRectangle_IE) Or _GUICtrlToolbar_IsButtonChecked($hToolbar_IE, $idEllipse_IE) Or _GUICtrlToolbar_IsButtonChecked($hToolbar_IE, $idArrow_IE) Then
        _WinAPI_DestroyCursor($hCursor_IE)
        $hCursor_IE = _WinAPI_CreateSolidCursorFromBitmap($IE_PenSize, $IE_PenSize, BitOR(BitShift(BitAND($IE_Pen_Col, 0x000000FF), -16), BitAND($IE_Pen_Col, 0x0000FF00), BitShift(BitAND($IE_Pen_Col, 0x00FF0000), 16)))
        Local $aCI = GUIGetCursorInfo($hGUI_ImageEditor_Child)
        If (Not @error) And $aCI[4] = $idPic_ImageEditor Then _WinAPI_SetCursor($hCursor_IE)
    EndIf
    _GUICtrlToolbar_CheckButton($hToolbar_IE, $idIEPen_Size, False)
    Return "GUI_RUNDEFMSG"
EndFunc   ;==>WM_COMMAND_IE

Func WM_HSCROLL_IE($hWnd, $iMsg, $wParam, $lParam)
    #forceref $iMsg, $lParam
    Local $Min, $Max, $Page, $TrackPos

    ; Get all the horizontal scroll bar information
    Local $tSCROLLINFO_X = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_HORZ)
    $Min = DllStructGetData($tSCROLLINFO_X, "nMin")
    $Max = DllStructGetData($tSCROLLINFO_X, "nMax")
    $Page = DllStructGetData($tSCROLLINFO_X, "nPage")

    ; Save the position for comparison later on
    $IE_offset_x = DllStructGetData($tSCROLLINFO_X, "nPos")
    $TrackPos = DllStructGetData($tSCROLLINFO_X, "nTrackPos")
    #forceref $Min, $Max
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
    Switch $nScrollCode

        Case $SB_LINELEFT ; user clicked left arrow
            DllStructSetData($tSCROLLINFO_X, "nPos", $IE_offset_x - 1)

        Case $SB_LINERIGHT ; user clicked right arrow
            DllStructSetData($tSCROLLINFO_X, "nPos", $IE_offset_x + 1)

        Case $SB_PAGELEFT ; user clicked the scroll bar shaft left of the scroll box
            DllStructSetData($tSCROLLINFO_X, "nPos", $IE_offset_x - $Page)

        Case $SB_PAGERIGHT ; user clicked the scroll bar shaft right of the scroll box
            DllStructSetData($tSCROLLINFO_X, "nPos", $IE_offset_x + $Page)

        Case $SB_THUMBTRACK ; user dragged the scroll box
            DllStructSetData($tSCROLLINFO_X, "nPos", $TrackPos)
    EndSwitch

;~    // Set the position and then retrieve it.  Due to adjustments
;~    //   by Windows it may not be the same as the value set.

    DllStructSetData($tSCROLLINFO_X, "fMask", $SIF_POS)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO_X)

    $IE_offset_x = DllStructGetData($tSCROLLINFO_X, "nPos")
    ControlMove("", "", $idPic_ImageEditor, -$IE_offset_x, -$IE_offset_y)

    Return "GUI_RUNDEFMSG"
EndFunc   ;==>WM_HSCROLL_IE

Func WM_VSCROLL_IE($hWnd, $iMsg, $wParam, $lParam)
    #forceref $iMsg, $lParam

    Local $Min, $Max, $Page, $TrackPos

;~  ; Get all the horizontal scroll bar information
    Local $tSCROLLINFO_Y = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
    $Min = DllStructGetData($tSCROLLINFO_Y, "nMin")
    $Max = DllStructGetData($tSCROLLINFO_Y, "nMax")
    $Page = DllStructGetData($tSCROLLINFO_Y, "nPage")
    ; Save the position for comparison later on
    $IE_offset_y = DllStructGetData($tSCROLLINFO_Y, "nPos")
    $TrackPos = DllStructGetData($tSCROLLINFO_Y, "nTrackPos")
    #forceref $Min, $Max
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
    Switch $nScrollCode

        Case $SB_LINELEFT ; user clicked left arrow
            DllStructSetData($tSCROLLINFO_Y, "nPos", $IE_offset_y - 1)

        Case $SB_LINERIGHT ; user clicked right arrow
            DllStructSetData($tSCROLLINFO_Y, "nPos", $IE_offset_y + 1)

        Case $SB_PAGELEFT ; user clicked the scroll bar shaft left of the scroll box
            DllStructSetData($tSCROLLINFO_Y, "nPos", $IE_offset_y - $Page)

        Case $SB_PAGERIGHT ; user clicked the scroll bar shaft right of the scroll box
            DllStructSetData($tSCROLLINFO_Y, "nPos", $IE_offset_y + $Page)

        Case $SB_THUMBTRACK ; user dragged the scroll box
            DllStructSetData($tSCROLLINFO_Y, "nPos", $TrackPos)
    EndSwitch

;~    // Set the position and then retrieve it.  Due to adjustments
;~    //   by Windows it may not be the same as the value set.

    DllStructSetData($tSCROLLINFO_Y, "fMask", $SIF_POS)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO_Y)

    $IE_offset_y = DllStructGetData($tSCROLLINFO_Y, "nPos")

    ControlMove("", "", $idPic_ImageEditor, -$IE_offset_x, -$IE_offset_y)
    Return "GUI_RUNDEFMSG"
EndFunc   ;==>WM_VSCROLL_IE

Func WM_MOUSEWHEEL_IE($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam
    If $hWnd = $hGUI_ImageEditor_Child Then
        Local $wheel_Dir = _WinAPI_HiWord($wParam), $y, $steps_y = 8

        If _IsPressed("10", $hDll) Or _IsPressed("02", $hDll) Then
            If $wheel_Dir > 0 And $IE_ScrollbarH Then
                For $y = 1 To $steps_y
                    _SendMessage($hGUI_ImageEditor_Child, $WM_HSCROLL, $SB_LINEUP)
                Next
            Else
                If $IE_ScrollbarH Then
                    For $y = 1 To $steps_y
                        _SendMessage($hGUI_ImageEditor_Child, $WM_HSCROLL, $SB_LINEDOWN)
                    Next
                EndIf
            EndIf
        Else
            If $wheel_Dir > 0 And $IE_ScrollbarV Then

                For $y = 1 To $steps_y
                    _SendMessage($hGUI_ImageEditor_Child, $WM_VSCROLL, $SB_LINEUP)
                Next
            Else
                If $IE_ScrollbarV Then
                    For $y = 1 To $steps_y
                        _SendMessage($hGUI_ImageEditor_Child, $WM_VSCROLL, $SB_LINEDOWN)
                    Next
                EndIf
            EndIf
        EndIf
    EndIf
    Return "GUI_RUNDEFMSG"
EndFunc   ;==>WM_MOUSEWHEEL_IE

Func Min($a, $b)
    If $a < $b Then Return $a
    Return $b
EndFunc   ;==>Min

Func Max($a, $b)
    If $a > $b Then Return $a
    Return $b
EndFunc   ;==>Max

Func _CreateNewBmp32($iWidth, $iHeight, ByRef $ptr, ByRef $hBild) ;erstellt leere 32-bit-Bitmap; Rückgabe $HDC und $ptr und handle auf die Bitmapdaten
    Local Const $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
    Local Const $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
    DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
    DllStructSetData($tBMI, "Width", $iWidth)
    DllStructSetData($tBMI, "Height", -$iHeight) ;minus =standard = bottomup
    DllStructSetData($tBMI, "Planes", 1)
    DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
    Local Const $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hBild = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
    $ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
    _WinAPI_SelectObject($hcdc, $hBild) ;objekt hbitmap in DC
    Return $hcdc ;DC der Bitmap zurückgeben
EndFunc   ;==>_CreateNewBmp32

Func _GDIPlus_GraphicsDrawCurve2($hGraphics, $aPoints, $nTension, $hPen = 0)
    Local $iI, $iCount, $iTmpErr, $iTmpExt, $pPoints, $tPoints, $aResult
    __GDIPlus_PenDefCreate($hPen)
    $iCount = $aPoints[0][0]
    $tPoints = DllStructCreate("float[" & $iCount * 2 & "]")
    $pPoints = DllStructGetPtr($tPoints)
    For $iI = 1 To $iCount
        DllStructSetData($tPoints, 1, $aPoints[$iI][0], (($iI - 1) * 2) + 1)
        DllStructSetData($tPoints, 1, $aPoints[$iI][1], (($iI - 1) * 2) + 2)
    Next
    $aResult = DllCall($ghGDIPDll, "uint", "GdipDrawCurve2", "handle", $hGraphics, "hwnd", $hPen, "ptr", $pPoints, "int", $iCount, "float", $nTension)
    $iTmpErr = @error
    $iTmpExt = @extended
    __GDIPlus_PenDefDispose()
    If $iTmpErr Then Return SetError($iTmpErr, $iTmpExt, False)
    Return $aResult[0] = 0
EndFunc   ;==>_GDIPlus_GraphicsDrawCurve2

#region functions from WinAPIEx.au3
Func _WinAPI_CreateSolidCursorFromBitmap($iW, $iH, $iColor) ;iColor in BGR format
    Local $hDC = _WinAPI_GetWindowDC(0)
    Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
    Local $hXOR = _WinAPI_CreateCompatibleBitmap($hDC, $iW, $iH)
    Local $hSv = _WinAPI_SelectObject($hMemDC, $hXOR)
    Local $hBrush = _WinAPI_CreateSolidBrush($iColor)
    _WinAPI_SelectObject($hMemDC, $hBrush)
    Local $tRect = DllStructCreate($tagRECT)
    DllStructSetData($tRect, "Left", 0)
    DllStructSetData($tRect, "Top", 0)
    DllStructSetData($tRect, "Right", $iW)
    DllStructSetData($tRect, "Bottom", $iH)
    _WinAPI_FillRect($hMemDC, DllStructGetPtr($tRect), $hBrush)
    _WinAPI_ReleaseDC(0, $hDC)
    _WinAPI_SelectObject($hMemDC, $hSv)
    _WinAPI_DeleteDC($hMemDC)
    _WinAPI_DeleteObject($hBrush)

    $hDC = _WinAPI_GetWindowDC(0)
    $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
    Local Const $hAND = _WinAPI_CreateCompatibleBitmap($hDC, $iW, $iH)
    $hSv = _WinAPI_SelectObject($hMemDC, $hAND)
    $hBrush = _WinAPI_CreateSolidBrush(0x0)
    _WinAPI_SelectObject($hMemDC, $hBrush)

    _WinAPI_FillRect($hMemDC, DllStructGetPtr($tRect), $hBrush)
    _WinAPI_ReleaseDC(0, $hDC)
    _WinAPI_SelectObject($hMemDC, $hSv)
    _WinAPI_DeleteDC($hMemDC)
    _WinAPI_DeleteObject($hBrush)

    Local Const $hCursor = _WinAPI_CreateIconIndirect($hXOR, $hAND, 0, 0, 0)
    _WinAPI_DeleteObject($hXOR)
    _WinAPI_DeleteObject($hAND)
    Return $hCursor
EndFunc   ;==>_WinAPI_CreateSolidCursorFromBitmap

Func _WinAPI_CopyImage($hImage, $iType = 0, $xDesired = 0, $yDesired = 0, $iFlags = 0); from _WinAPIEx by Yashied
    Local $ret = DllCall('user32.dll', 'ptr', 'CopyImage', 'ptr', $hImage, 'int', $iType, 'int', $xDesired, 'int', $yDesired, 'int', $iFlags)
    If (@error) Or (Not $ret[0]) Then Return SetError(1, 0, 0)
    Return $ret[0]
EndFunc   ;==>_WinAPI_CopyImage

Func _WinAPI_LoadCursor($hInstance, $sName)
    Local $TypeOfName = 'int'
    If IsString($sName) Then $TypeOfName = 'wstr'
    Local $ret = DllCall('user32.dll', 'ptr', 'LoadCursorW', 'ptr', $hInstance, $TypeOfName, $sName)
    If (@error) Or (Not $ret[0]) Then Return SetError(1, 0, 0)
    Return $ret[0]
EndFunc   ;==>_WinAPI_LoadCursor

Func _WinAPI_SetSystemCursor($hCursor, $ID, $fCopy = 0)
    If $fCopy Then $hCursor = _WinAPI_CopyIcon($hCursor)
    Local $ret = DllCall('user32.dll', 'int', 'SetSystemCursor', 'ptr', $hCursor, 'dword', $ID)
    If (@error) Or (Not $ret[0]) Then Return SetError(1, 0, 0)
    Return 1
EndFunc   ;==>_WinAPI_SetSystemCursor

Func _WinAPI_CreateIconIndirect($hBitmap, $hMask, $XHotspot = 0, $YHotspot = 0, $fIcon = 1)
    Local $tICONINFO = DllStructCreate($tagICONINFO)
    DllStructSetData($tICONINFO, 1, $fIcon)
    DllStructSetData($tICONINFO, 2, $XHotspot)
    DllStructSetData($tICONINFO, 3, $YHotspot)
    DllStructSetData($tICONINFO, 4, $hMask)
    DllStructSetData($tICONINFO, 5, $hBitmap)
    Local $ret = DllCall('user32.dll', 'ptr', 'CreateIconIndirect', 'ptr', DllStructGetPtr($tICONINFO))
    If (@error) Or (Not $ret[0]) Then Return SetError(1, 0, 0)
    Return $ret[0]
EndFunc   ;==>_WinAPI_CreateIconIndirect

Func _WinAPI_DestroyCursor($hCursor)
    Local $ret = DllCall('user32.dll', 'int', 'DestroyCursor', 'ptr', $hCursor)
    If (@error) Or (Not $ret[0]) Then Return SetError(1, 0, 0)
    Return 1
EndFunc   ;==>_WinAPI_DestroyCursor

Func _WinAPI_SetWindowTitleIcon($sFile, $hWnd, $iW = 32, $iH = 32)
    If $sFile = "" Then Return SetError(1, 0, 0)
    If Not IsHWnd($hWnd) Then Return SetError(2, 0, 0)
    Local Const $GCL_HICON = -14, $GCL_HICONSM = -34
    Local $hImage
    If Not FileExists($sFile) Then
        If _GDIPlus_ImageGetType($sFile) = -1 Then Return SetError(3, @error, 0)
        $hImage = $sFile ;interpret $sFile as a bitmap handle
    Else
        $hImage = _GDIPlus_ImageLoadFromFile($sFile)
        If @error Then Return SetError(4, @error, 0)
    EndIf
    Local $aRes = DllCall($ghGDIPDll, "uint", "GdipGetImageThumbnail", "handle", $hImage, "uint", $iW, "uint", $iH, "int*", 0, "ptr", 0, "ptr", 0)
    If @error Then Return SetError(5, @error, 0)
    Local $hImageScaled = $aRes[4]
    $aRes = DllCall($ghGDIPDll, "uint", "GdipCreateHICONFromBitmap", "handle", $hImageScaled, "int*", 0)
    If @error Then Return SetError(6, @error, 0)
    Local $hIconNew = $aRes[2]
    Local Const $hIcon = _WinAPI_GetClassLongEx($hWnd, $GCL_HICON)
    If @error Then Return SetError(7, @error, 0)
    _WinAPI_DestroyIcon($hIcon)
    _WinAPI_SetClassLongEx($hWnd, $GCL_HICON, $hIconNew)
    If @error Then Return SetError(8, @error, 0)
    _WinAPI_SetClassLongEx($hWnd, $GCL_HICONSM, $hIconNew)
    If @error Then Return SetError(9, @error, 0)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_ImageDispose($hImageScaled)
    Return $hIconNew
EndFunc   ;==>_WinAPI_SetWindowTitleIcon

Func _WinAPI_GetClassLongEx($hWnd, $iIndex)
    Local $ret
    If @AutoItX64 Then
        $ret = DllCall('user32.dll', 'ulong_ptr', 'GetClassLongPtrW', 'hwnd', $hWnd, 'int', $iIndex)
    Else
        $ret = DllCall('user32.dll', 'ulong', 'GetClassLongW', 'hwnd', $hWnd, 'int', $iIndex)
    EndIf
    If (@error) Or (Not $ret[0]) Then Return SetError(1, 0, 0)
    Return $ret[0]
EndFunc   ;==>_WinAPI_GetClassLongEx

Func _WinAPI_SetClassLongEx($hWnd, $iIndex, $iNewLong)
    Local $ret
    If @AutoItX64 Then
        $ret = DllCall('user32.dll', 'ulong_ptr', 'SetClassLongPtrW', 'hwnd', $hWnd, 'int', $iIndex, 'long_ptr', $iNewLong)
    Else
        $ret = DllCall('user32.dll', 'ulong', 'SetClassLongW', 'hwnd', $hWnd, 'int', $iIndex, 'long', $iNewLong)
    EndIf
    If (@error) Or (Not $ret[0]) Then Return SetError(1, 0, 0)
    Return $ret[0]
EndFunc   ;==>_WinAPI_SetClassLongEx
#endregion functions from WinAPIEx.au3

Func _ImageEditor_ToolbarIcons()
    Local $ImageEditor_Icons
    $ImageEditor_Icons &= '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'
    $ImageEditor_Icons &= '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'
    $ImageEditor_Icons &= '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'
    $ImageEditor_Icons &= '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'
    $ImageEditor_Icons &= 'j8YS/IbNOzaYFn3jsssuMotzM7BpdwOenv1CL5Crq63dXVJZbUoCk4qLCgEARVkAzzHIpgNxGdB1HZIoglIXJIcbDslGZigTKVlGSXHhNQPy4HzhxV0QBLFeV+WXWY8TOPNKh4hufy5AkHDmBDtSFl786FtQCvA81128NU0TiixDNOKYMGIIyvr3B8/z3aDdFdWbPeRnxli3dbNHfQCTJk2CbdtIJNLxXSQS6ZUVHC4b6BkYC8mkRRSvzryCBtIlAfEMUkY2o2hD+TDqS7Y7LwfQkwDw93cS29/4U+jcVs77H48SC2pN1S4ps8gJQPTxEEryAhOvPtWW/vWNaVBZpnZ9HeccPBjEdqKxKQKvOwOGYWH0SWNQtX4zTj/zdOzYvh1t4TCy+pXAadrw/utVGF9/acwKh79tt6wWANGe+n83gNsMjDK0trR3a/s9NX7W4z+HSAJ63ZAMDMy2Diq1MGZjUVVdrwygjBzaIcQ6medIDqGuaGD48OFobW3Fxo0b0bdvX7jdbmiaBofDkQa0zrSzC/QdDgcikQiqq6sxfPhwFBYW9vy8x1RMHXLmOdKp514zf3f1Zrz31Wewbdt0MFrVq5B5LOC/FbeTzLF/Zd5fM6jVhKQ2MSgpsFQMRE1SOSaS5xddmPfP057nzn77NAp8eEAfnz3wiseg9sMZ+dm/HzK6wu0J+QCrk9kJAeM6DSSkE/Q5gHAEhONACWCBIpFKYu3mddhTtxeapqezvIOURiyLtn61vP4W06T66eMKLwMMnlkCpO8a4V/agrisISYr4AUOIIBp2QjrKiJ7t9sdhvaJMqj8j4qs1P6fWD7fe+8iCIKJsWPXHF/ZlaO4556nsWLFWDQ05B3UwSKKVr8bbnuOMmDNv16dSUXJRVUZVJbBVAWWaTg3PPvnGQzA4KMkAcYYTMPkTMP4Y0zWytYnCPoHJORle9HudCObqpA4ggy/N2AoTZ/rdY2mKHAZNrUkTdeRl5dbxET3+OEjRjapsbY+Dkns4AjZZFGqd52jpaWlQUwsSsYoDaVrfDZCfh5uB4Os8QgnBCiyDMHvh8MB7NlDkJ9HUJCfj127qlFQkuN+8/1PoJiEijz9p2ka+7qHTXJK+Zc8+rwR6j9JYBaNymFDUVS8o/cBBQcai8ADA9SbBY0JAM9At3+IolAjTjv1VDgcDpimiba2NiSTye5IvyeBddk8u4ikqwbw0Ucf4eOPP+6WiACgoKAAkUgE0WgUPM8jPz8fiUQCra2tvWoJXYqGkExaLMZ2E0+qlgnBLCL4guA9buYMDiQQ8lGSXcdi9eo9Gz4eYo44f/vDPS/eVY917PnqmdBrusqdyXfU+Xh3pheAB4A72++QwmH0pddcU9uyfVcN/+83Bjjuux+S14uyQcUoLMmBZdpYvGQZJk44CYu+XYEhwyrw7crF+DV/MpwLPoD+4X/M90JZ675NJfcCaAEQ37+oyaz0BaUUyMnLOiD6P9ZsgLGtsC0Gy7QPsGJ1ZQBTRxSlSYIyMDCsXFV3SIcQWNradiSHUM/QNzc3FzkOB6qXL0di925kCwIU0wRycyHl5sIqKAAJBuFyubBx40a43W5MmzatV7Zg28de+/VmF8+eMG54psp4tq2mlu354ZWmgaV9Z741f/4x20rpZtxGMk98lvkvYUStBUutZ0yRATlGiJqgapznttb1y92ckW1d/vUl+O79Vw7aj2ma0/sNKbtnwEnDCBM4MCudqhOu01dNO3VYrmvjOsE/ncVFo1GsXLcGNfV7kZ7YyWAzBofD2ev6d90Dpk3bF63ad6tp29q0sUXXZC/bJwTXRhCTNcQVGbwopDMGy0azJqMZBtozXHuyB7jvyBsg1Ouar5ugOUJ+PgKgFKio2IBhw7Yddx9ZWR3QdR+efPIR/PGPLxyKBPrfeNtzjDGsefEfM6lpupiqAKaR1mcNw7mtkwSGHAUJsDTx9pdV7fIIJFKVkYvvZBX73HnITUTwhEcGTxlUOU6YFsv0'
    $ImageEditor_Icons &= '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'
    $ImageEditor_Icons &= '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'
    $ImageEditor_Icons &= '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'
    $ImageEditor_Icons &= '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'
    $ImageEditor_Icons &= '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'
    $ImageEditor_Icons &= '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'
    $ImageEditor_Icons &= 'PCKxXEUzXIpjXx+XAAACIklEQVSq56iutKrl6JaAkTRZJskyZiLDrIiRVq4MDSQvDgZM4QS97FwUeI5HLBtNpNB9vhWmoSMUjaGt6zgC/QIWoyCQqCLLnjy3+wWXpnklSdImDCNjMBYaHYuOBKOx9IRuiHhqAtF4EvFUCha3H8iQZ45PhJSUFL9W5ivbYZrmP8lU8qxLMeOBoejVDLOMuXJp3ZORU0XTqjfskArL1sgFvhpBJFUYCdjxIOOjnXGz79pBwc0fnOokQrKnF4kDKZtD2jEhRGjS/hsaGop27tz5EQD3w5iBF2JjhJDxpqamxmcuAKzc/Km/lxf9WOR/pZRfavm17+SRXZxbw5iBBsJBqXMtecyvEkSWfqL7KXVdApAPwAvAjf+YPCXHGJjjPGOOAS1Y97eiomJNaWnpIb/fv7a5uXnsf77z5EWdlmzbRvcLQTuOHWOHQ6EpcQ4xQ7YvHuLwn5rX3HPoQE4mmfAKm7slShUhiJYZTypWT49EAgHI6TRXBbgmUdOtuUxPbj7z5HmYrCjMtIXFLG5luGWnGeMDsbD93fV2Hjb0qT49DwCzbGtMpNB19jdwMyt52tMXwJ/XbiB/kRe+4sVksbdAohKRAAlC2ETTNFAqwTK5CIYjfDgUFrFYVCSTKYzFxtHZN4j+keBUIchs31+mlHLb5gsdp3ucMpGoXFpZA6q+BJsXTpsTEOmIwROhUxCiez72PT4+jlgsRp/Ety8uLub/AhIKBb23x+IGAAAAAElFTkSuQmCC'
    Return Binary(_Base64Decode($ImageEditor_Icons))
EndFunc   ;==>_ImageEditor_ToolbarIcons

Func _WinTitle_Icon()
    Local $WinTitle_Icon
    $WinTitle_Icon &= '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'
    $WinTitle_Icon &= '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'
    $WinTitle_Icon &= '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'
    $WinTitle_Icon &= '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'
    $WinTitle_Icon &= 'NJay/AqAxetJ77XsD+igONcKoqd/eHa6PrvcvH9xbfDBMxflwO2H23T4gItS0cHDu06DiKFA8xjkhPcVTuPe3otwuMCaKsGwHBwYMsAtpzv+7nbB6ZfVvSKW6hF235RHsVjA5Re+ClJN2KaGTRlM1oaw2soFZyaWXvz+c6e/MXlt5YrSWm6SuGJTyC8DWAXQfrWwfy07RHTKmrNS6Wh8brU5u7z+ysHR3nfPLvYdf+kc792/R9O+XQH6KwoinMD9wzVsyzaTzVPEAbRBzARz93ZLJ2jzcEVCKYHz00AmV0Aum4XfbmBx5hz8Vgb5TFkrlV0fn1k+9cOXTj82WVu9Ijceb3XuGKfGrqbGN9Ka/1P3Gd/IHqFOJNQABF4oGicvzc+dm155au9Q6a2HZ/pu33mxPFIdcJ3h/ptRrbSxRjZcsw2Dh2AUgRGHFq1k/KAlZLAMLUMoKSCFhi+yOD+1A70jvSj3lDF++hnMzfPIC4z5hZXZZ8emFp9fXmsvph7vBI7aZPhaanx9k9f1G7lTtFNLV9L8WvXCeOHlyaWpV6aWT1Ty7ujOanHvnqHSntH+YrW/Mpovl7JmPm+yXJbBdQiZbAbV/fdAiRALMycQhzFETAgCrZfCHHxVomw2C86Y+Pq3vndh/PLUVL3RPttqt68qpTZv7ZKpQ9qppzcbHt+I1/82W2Vl+kVhinpNKj242PBmFxvehefH5vOOxfOlrN3TW3QrvQWnXCk4xZxrZcrFvL3ncMYUUaCnxs77rbbvN/14faUZrY3sv/1tQ7uGdzu2hVfOnl0+c+HSlSAI5vwgmFdKRalhUZqOrdTwjqrz0vcUXsfxerbKblZWXppzBQBlrXXZD0WPH4p8bbXtbpq+MsaIrK+fZlprHcWx1Forzjm/7bYjR+/ac3hwdmYGC7VrauLKxJU4jleiKJoQQtTSEualr80UgI4TxOs1/I3YLN0BQmwCwgGQS89seroAbKW0GYQh37yR8ejRYw9+8IM//7HG2prRbrVxaXzMn5uvjSmlTsZxfEZr3WFyPzU42mS0xhtwvBHb5fWmCUuUeoinp5VGgbnpYQQB0Pl8fmjvnpvum52dNZaXlrC0uIi257WJ6BQRPaG1nkvvJ7duLHxjjzf6FyObwUBairCpMaHORsbB4dG3elapt7G4gLC5Ds9rqyiOnuGcn7dtezqNqr/z4+/6N0P6utdkB3epxI23PPjeuZG7+Jq6gOzqE2q9HZyIhfgmEU0rpUKl1Jth/5v/qzHbtpHNl/LVnfuOSRCWdF5Mqt6ngzD4cwDPKqXmWq2W/Jt+MPH/WwRsOUzTRE9PxcjuOfbhRZnfNzM2dtW4/NjXMsvnvkNKjCmlFur1euh53pu2JnozAahUKmRV990S77j7N7EwNuasXHyCCX9Ca73q+77fbDbV9dvZf6YA6O/vJ8fNFAHkoVVbKdX2fT/2PE8FQYA3K+z/3gAwTRPlcpmIiHzf157n6Vfbwf1mHv8XzrTv/92cfWUAAAAASUVORK5CYII='
    Return Binary(_Base64Decode($WinTitle_Icon))
EndFunc   ;==>_WinTitle_Icon

Func Load_BMP_From_Mem($bImage, $hHBITMAP = False)
    If Not IsBinary($bImage) Then Return SetError(1, 0, 0)
    Local $aResult
    Local Const $memBitmap = Binary($bImage) ;load image  saved in variable (memory) and convert it to binary
    Local Const $len = BinaryLen($memBitmap) ;get length of image
    Local Const $hData = _MemGlobalAlloc($len, $GMEM_MOVEABLE) ;allocates movable memory  ($GMEM_MOVEABLE = 0x0002)
    Local Const $pData = _MemGlobalLock($hData) ;translate the handle into a pointer
    Local $tMem = DllStructCreate("byte[" & $len & "]", $pData) ;create struct
    DllStructSetData($tMem, 1, $memBitmap) ;fill struct with image data
    _MemGlobalUnlock($hData) ;decrements the lock count  associated with a memory object that was allocated with GMEM_MOVEABLE
    $aResult = DllCall("ole32.dll", "int", "CreateStreamOnHGlobal", "handle", $pData, "int", True, "ptr*", 0) ;Creates a stream object that uses an HGLOBAL memory handle to store the stream contents
    If @error Then Return SetError(2, 0, 0)
    Local Const $hStream = $aResult[3]
    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromStream", "ptr", $hStream, "int*", 0) ;Creates a Bitmap object based on an IStream COM interface
    If @error Then Return SetError(3, 0, 0)
    Local Const $hBitmap = $aResult[2]
    Local $tVARIANT = DllStructCreate("word vt;word r1;word r2;word r3;ptr data; ptr")
    DllCall("oleaut32.dll", "long", "DispCallFunc", "ptr", $hStream, "dword", 8 + 8 * @AutoItX64, _
            "dword", 4, "dword", 23, "dword", 0, "ptr", 0, "ptr", 0, "ptr", DllStructGetPtr($tVARIANT)) ;release memory from $hStream to avoid memory leak
    $tMem = 0
    $tVARIANT = 0
    If $hHBITMAP Then
        Local Const $hHBmp = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap)
        _GDIPlus_BitmapDispose($hBitmap)
        Return $hHBmp
    EndIf
    Return $hBitmap
EndFunc   ;==>Load_BMP_From_Mem

Func _Blur($hBitmap, $iW, $iH, $dx1 = -5, $dx2 = -3, $dy1 = 12, $dy2 = 9, $fScale = 0.175, $qual = 6); by eukalyptus
    Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow())
    Local $hBmpSmall = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $hGraphics)
    Local $hGfxSmall = _GDIPlus_ImageGetGraphicsContext($hBmpSmall)
    DllCall($ghGDIPDll, "uint", "GdipSetPixelOffsetMode", "handle", $hGfxSmall, "int", 2)
    Local $hBmpBig = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $hGraphics)
    Local $hGfxBig = _GDIPlus_ImageGetGraphicsContext($hBmpBig)
    DllCall($ghGDIPDll, "uint", "GdipSetPixelOffsetMode", "handle", $hGfxBig, "int", 2)
    _GDIPlus_GraphicsScaleTransform($hGfxSmall, $fScale, $fScale)
    _GDIPlus_GraphicsSetInterpolationMode($hGfxSmall, $qual)

    _GDIPlus_GraphicsScaleTransform($hGfxBig, 1 / $fScale, 1 / $fScale)
    _GDIPlus_GraphicsSetInterpolationMode($hGfxBig, $qual)

    _GDIPlus_GraphicsDrawImageRect($hGfxSmall, $hBitmap, 0, $dx1, $iW, $iH + $dy2)
    _GDIPlus_GraphicsDrawImageRect($hGfxBig, $hBmpSmall, 0, $dx2, $iW, $iH + $dy2)

    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_BitmapDispose($hBmpSmall)
    _GDIPlus_GraphicsDispose($hGfxSmall)
    _GDIPlus_GraphicsDispose($hGfxBig)
    Return $hBmpBig
EndFunc   ;==>_Blur

Func ASM_Bitmap_Pixelize($bmp, $iSize = 8) ;ASM code by TheShadowAE
    Local $w = _GDIPlus_ImageGetWidth($bmp), $h = _GDIPlus_ImageGetHeight($bmp)
    $w -= Mod($w, $iSize)
    $h -= Mod($h, $iSize)
    Local Const $hHBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($bmp)
    Local $yBmp, $ptr
    Local Const $dc = _CreateNewBmp32($w, $h, $ptr, $yBmp)
    Local Const $xdc = _WinAPI_CreateCompatibleDC(0)
    Local Const $dc_obj = _WinAPI_SelectObject($xdc, $hHBmp)
    _WinAPI_BitBlt($dc, 0, 0, $w, $h, $xdc, 0, 0, $SRCCOPY)
    Local Const $bASM_Pix = "0x8B5C240C8B7C24106BFF048B7424046BF6048B5424088B4C24048B035351528B54241C8B4C241C890383C3044975F801F329FB4A75ED5A595B01FB2B4C241075D98B442410480FAFC601C32B54241075C5C3"
    Local $tCodeBuffer = DllStructCreate("byte[" & BinaryLen($bASM_Pix) & "]") ;reserve Memory for opcodes
    DllStructSetData($tCodeBuffer, 1, $bASM_Pix) ;write opcodes into memory
    DllCall("kernel32.dll", "int", "VirtualProtect", "ptr", DllStructGetPtr($tCodeBuffer), "ulong", BinaryLen($bASM_Pix), "dword", $PAGE_EXECUTE_READWRITE, "dword*", 0) ;avoid crash when DEP is activates for all programs and services! Thanks to progandy
    DllCall("user32.dll", "none", "CallWindowProcW", "ptr", DllStructGetPtr($tCodeBuffer), "int", $w, "int", $h, "ptr", $ptr, "int", $iSize)
    _GDIPlus_BitmapDispose($hBmp)
    $hBmp = _GDIPlus_BitmapCreateFromHBITMAP($yBmp)
    _WinAPI_DeleteObject($yBmp)
    _WinAPI_DeleteObject($hHBmp)
    _WinAPI_SelectObject($xdc, $dc_obj)
    _WinAPI_DeleteDC($xdc)
    _WinAPI_ReleaseDC(0, $dc)
    $ptr = 0
    $tCodeBuffer = 0
EndFunc   ;==>ASM_Bitmap_Pixelize

Func ASM_Bitmap_Rasterize($vBmp, $iColor = 0x000000) ;ASM code by AndyG
    $vBitmap = _GDIPlus_BitmapCloneArea($vBmp, 0, 0, $bW, $bH)
    If Not $vBitmap Or @error Then Return MsgBox(16 + 262144, "ERROR", "Whoops an internal error has occured: unable to clone bitmap!" & @CRLF & @CRLF & _
            "Sorry for inconvenience! :-(", 20, WinGetHandle(AutoItWinGetTitle()))
    Local Const $hBitmapData = _GDIPlus_BitmapLockBits($vBitmap, 0, 0, $bW, $bH, BitOR($GDIP_ILMREAD, $GDIP_ILMWRITE), $GDIP_PXF32RGB)
    Local Const $Scan = DllStructGetData($hBitmapData, "Scan0")
    Local Const $Stride = DllStructGetData($hBitmapData, "Stride")
    Local $tPixelData = DllStructCreate("dword[" & (Abs($Stride * $bH)) & "]", $Scan)
    Local Const $bASM_Rasterize = "0x8B7424048B4C24088B7C240C8B4424100FBAE0007238BB0100000039C3730E893E83C60883C30283E90277EFC30FBAE300730EBB0000000083C60483E90177DBC3BB0100000083EE0483C101EBCD893E83C60883E90277F6C3"

    Local Const $iSize = BinaryLen($bASM_Rasterize)
    Local Const $pCodeBuffer = _MemVirtualAlloc(0, $iSize, $MEM_COMMIT, $PAGE_EXECUTE_READWRITE)
    Local $tCodeBuffer = DllStructCreate("byte[" & $iSize & "]", $pCodeBuffer)
    DllStructSetData($tCodeBuffer, 1, $bASM_Rasterize)
    DllCallAddress("int:cdecl", $pCodeBuffer, "ptr", DllStructGetPtr($tPixelData), "int", $bW * $bH, "int", $iColor, "int", $bW)
    _MemVirtualFree($pCodeBuffer, $iSize, $MEM_DECOMMIT)

    _GDIPlus_BitmapUnlockBits($vBitmap, $hBitmapData)
    _GDIPlus_BitmapDispose($vBmp)
    $hBmp = $vBitmap
    $tCodeBuffer = 0
    $tPixelData = 0
EndFunc   ;==>ASM_Bitmap_Rasterize

Func ASM_Bitmap_Grey_BnW($vBmp, $iBlackAndWhite = 0, $iLight = 160, $skip = False) ;ASM code by AndyG
;~  $undo = _GDIPlus_BitmapCloneArea($vBmp, 0, 0, $bW, $bH)
;~  $undo_chk = True
    $vBitmap = _GDIPlus_BitmapCloneArea($vBmp, 0, 0, $bW, $bH)
    If Not $vBitmap Or @error Then Return MsgBox(16 + 262144, "ERROR", "Whoops an internal error has occured: unable to clone bitmap!" & @CRLF & @CRLF & _
            "Sorry for inconvenience! :-(", 20, WinGetHandle(AutoItWinGetTitle()))
    Local Const $hBitmapData = _GDIPlus_BitmapLockBits($vBitmap, 0, 0, $bW, $bH, BitOR($GDIP_ILMREAD, $GDIP_ILMWRITE), $GDIP_PXF32RGB)
    Local Const $Scan = DllStructGetData($hBitmapData, "Scan0")
    Local Const $Stride = DllStructGetData($hBitmapData, "Stride")
    Local $tPixelData = DllStructCreate("dword[" & (Abs($Stride * $bH)) & "]", $Scan)
    Local Const $bASM_GBW = "0x8B7C24048B5424088B5C240CB900000000C1E202575352518B040FBA00000000BB00000000B90000000088C2C1E80888C3C1E80888C18B44240883F800772FB85555000001CB01D3F7E3C1E810BB00000000B3FFC1E30888C3C1E30888C3C1E30888C389D8595A5B5F89040FEB3B89C839C3720289D839C2720289D05089F839C3770289D839C2770289D05B01D8BBDC780000F7E3C1E810595A5B5F3B4424107213C7040FFFFFFF0083C10439D1730EE95FFFFFFFC7040F00000000EBEBC3"

    Local Const $iSize = BinaryLen($bASM_GBW)
    Local Const $pCodeBuffer = _MemVirtualAlloc(0, $iSize, $MEM_COMMIT, $PAGE_EXECUTE_READWRITE)
    Local $tCodeBuffer = DllStructCreate("byte[" & $iSize & "]", $pCodeBuffer)
    DllStructSetData($tCodeBuffer, 1, $bASM_GBW)
    DllCallAddress("int:cdecl", $pCodeBuffer, "ptr", DllStructGetPtr($tPixelData), "int", $bH * $bW, "int", $iBlackAndWhite, "int", $iLight)
    _MemVirtualFree($pCodeBuffer, $iSize, $MEM_DECOMMIT)
    _GDIPlus_BitmapUnlockBits($vBitmap, $hBitmapData)
    _GDIPlus_BitmapDispose($hBmp)
    $hBmp = $vBitmap
;~  If Not $skip Then
;~      $hClipboard_Bitmap = _WinAPI_CopyImage(_GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp), 0, 0, 0, $LR_COPYDELETEORG + $LR_COPYRETURNORG)
;~      Draw2Graphic($hBmp)
;~  EndIf
    $tPixelData = 0
    $tCodeBuffer = 0
EndFunc   ;==>ASM_Bitmap_Grey_BnW

Func ASM_Bitmap_Invert($vvvBmp, $skip = False) ;ASM code by AndyG
;~  $undo = _GDIPlus_BitmapCloneArea($vvvBmp, 0, 0, $bW, $bH)
;~  $undo_chk = True
    $vBitmap = _GDIPlus_BitmapCloneArea($vvvBmp, 0, 0, $bW, $bH)
    If Not $vBitmap Or @error Then Return MsgBox(16 + 262144, "ERROR", "Whoops an internal error has occured: unable to clone bitmap!" & @CRLF & @CRLF & _
            "Sorry for inconvenience! :-(", 20, WinGetHandle(AutoItWinGetTitle()))
    Local Const $hBitmapData = _GDIPlus_BitmapLockBits($vBitmap, 0, 0, $bW, $bH, BitOR($GDIP_ILMREAD, $GDIP_ILMWRITE), $GDIP_PXF32RGB)
    Local Const $Scan = DllStructGetData($hBitmapData, "Scan0")
    Local Const $Stride = DllStructGetData($hBitmapData, "Stride")
    Local $tPixelData = DllStructCreate("dword[" & (Abs($Stride * $bW)) & "]", $Scan)
    Local Const $bASM_Inv = "0x8B7424048B4C24088136FFFFFF0083C60483E90177F2C3"

    Local Const $iSize = BinaryLen($bASM_Inv)
    Local Const $pCodeBuffer = _MemVirtualAlloc(0, $iSize, $MEM_COMMIT, $PAGE_EXECUTE_READWRITE)
    Local $tCodeBuffer = DllStructCreate("byte[" & $iSize & "]", $pCodeBuffer)
    DllStructSetData($tCodeBuffer, 1, $bASM_Inv)
    DllCallAddress("int:cdecl", $pCodeBuffer, "ptr", DllStructGetPtr($tPixelData), "int", $bW * $bH)
    _MemVirtualFree($pCodeBuffer, $iSize, $MEM_DECOMMIT)
    _GDIPlus_BitmapUnlockBits($vBitmap, $hBitmapData)
    _GDIPlus_BitmapDispose($vvvBmp)
    $hBmp = $vBitmap
;~  If Not $skip Then
;~      $hClipboard_Bitmap = _WinAPI_CopyImage(_GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp), 0, 0, 0, $LR_COPYDELETEORG + $LR_COPYRETURNORG)
;~      Draw2Graphic($hBmp)
;~  EndIf
    $tCodeBuffer = 0
EndFunc   ;==>ASM_Bitmap_Invert

Func _GDIPlus_GraphicsScaleTransform($hGraphics, $nScaleX, $nScaleY, $iOrder = 0)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipScaleWorldTransform", "handle", $hGraphics, "float", $nScaleX, "float", $nScaleY, "int", $iOrder)
    If @error Then Return SetError(@error, @extended, False)
    Return $aResult[0] = 0
EndFunc   ;==>_GDIPlus_GraphicsScaleTransform

Func _GDIPlus_GraphicsSetInterpolationMode($hGraphics, $iInterpolationMode)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hGraphics, "int", $iInterpolationMode)
    If @error Then Return SetError(@error, @extended, False)
    Return $aResult[0] = 0
EndFunc   ;==>_GDIPlus_GraphicsSetInterpolationMode

Func _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap)
    Local $tBIHDR, $ret, $tData, $pBits, $hResult = 0
    $ret = DllCall($ghGDIPDll, 'uint', 'GdipGetImageDimension', 'ptr', $hBitmap, 'float*', 0, 'float*', 0)
    If (@error) Or ($ret[0]) Then Return 0
    $tData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $ret[2], $ret[3], $GDIP_ILMREAD, $GDIP_PXF32ARGB)
    $pBits = DllStructGetData($tData, 'Scan0')
    If Not $pBits Then Return 0
    $tBIHDR = DllStructCreate('dword;long;long;ushort;ushort;dword;dword;long;long;dword;dword')
    DllStructSetData($tBIHDR, 1, DllStructGetSize($tBIHDR))
    DllStructSetData($tBIHDR, 2, $ret[2])
    DllStructSetData($tBIHDR, 3, $ret[3])
    DllStructSetData($tBIHDR, 4, 1)
    DllStructSetData($tBIHDR, 5, 32)
    DllStructSetData($tBIHDR, 6, 0)
    $hResult = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBIHDR), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'dword', 0)
    If (Not @error) And ($hResult[0]) Then
        DllCall('gdi32.dll', 'dword', 'SetBitmapBits', 'ptr', $hResult[0], 'dword', $ret[2] * $ret[3] * 4, 'ptr', DllStructGetData($tData, 'Scan0'))
        $hResult = $hResult[0]
    Else
        $hResult = 0
    EndIf
    _GDIPlus_BitmapUnlockBits($hBitmap, $tData)
    Return $hResult
EndFunc   ;==>_GDIPlus_BitmapCreateDIBFromBitmap

Func _Base64Decode($input_string)
    Local $struct = DllStructCreate("int")
    Local $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", "str", $input_string, "int", 0, "int", 1, "ptr", 0, "ptr", DllStructGetPtr($struct, 1), "ptr", 0, "ptr", 0)
    If @error Or Not $a_Call[0] Then Return SetError(1, 0, "")
    Local $a = DllStructCreate("byte[" & DllStructGetData($struct, 1) & "]")
    $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", "str", $input_string, "int", 0, "int", 1, "ptr", DllStructGetPtr($a), "ptr", DllStructGetPtr($struct, 1), "ptr", 0, "ptr", 0)
    If @error Or Not $a_Call[0] Then Return SetError(2, 0, "")
    Return DllStructGetData($a, 1)
EndFunc   ;==>_Base64Decode
This version is buggy and only a proof of concept!!!

If I find time I will write a seperate basic image editor from scratch.

Br,

UEZ

Edited by UEZ
  • Like 1

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
PhoenixXL

Good script UEZ.

GdipDrawCurve2 was what I was missing.

Added that to the script

LeftClick : Draw simple Black Lines.

RightClick : Erase whats drawn.

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

Opt("TrayIconDebug", 1)

$Paint = GUICreate("Paint", 350, 350, -1, -1, -1, -1)
_GDIPlus_Startup()

$hGraphic_GUI = _GDIPlus_GraphicsCreateFromHWND($Paint)

$hBuffer_Bmp = _GDIPlus_BitmapCreateFromGraphics(350, 350, $hGraphic_GUI)
$hGraphic_Buffer_Bmp = _GDIPlus_ImageGetGraphicsContext($hBuffer_Bmp)

Global $af_Points[1][2] = [[0]]

GUIRegisterMsg($WM_PAINT, "WM_PAINT")
GUISetState()

While 1

    Switch GUIGetMsg()

        Case $GUI_EVENT_CLOSE

            ;release the resources
            _GDIPlus_GraphicsDispose($hGraphic_Buffer_Bmp)
            _GDIPlus_ImageDispose($hBuffer_Bmp)

            _GDIPlus_GraphicsDispose($hGraphic_GUI)
            _GDIPlus_Shutdown()

            Exit

        Case $GUI_EVENT_PRIMARYDOWN

            ;paint the Buffer-Img
            Paint_Buffer()

    Case $GUI_EVENT_SECONDARYDOWN

        ;erase the stuff
        _GDIPlus_GraphicsClear($hGraphic_Buffer_Bmp, 0xFFF0F0F0)

        ;don't wait for the processing of the GUI
        _WinAPI_PostMessage($Paint, $WM_PAINT, 0, 0)

    EndSwitch
WEnd

Func Paint_Buffer()

    Do

        $cPos = GUIGetCursorInfo()
        If IsArray($cPos) = 0 Then ExitLoop

        $af_Points[0][0] += 1

        ;search for _ArrayAddEx to speed up at this point, written by Guinness.
        If UBound($af_Points) - 1 < $af_Points[0][0] + 1 Then ReDim $af_Points[$af_Points[0][0] + 1000][2]  ;this takes a lot of time.

        $af_Points[$af_Points[0][0]][0] = $cPos[0] + 1 / 2
        $af_Points[$af_Points[0][0]][1] = $cPos[1] + 1 / 2

        _GDIPlus_GraphicsDrawCurve2($hGraphic_Buffer_Bmp, $af_Points)

        ;don't wait for the processing of the GUI
        _WinAPI_PostMessage($Paint, $WM_PAINT, 0, 0)

        ;pause
        Sleep(18)   ;to reduce the CPU usage by little.

    Until $cPos[2] = 0

    ;reset the variable.
    ReDim $af_Points[1][2]
    $af_Points[0][0] = 0

EndFunc   ;==>Paint_Buffer

Func WM_PAINT($hWnd, $iMsg, $wParam, $lParam)

    ;paint the buffer image on the GUI.
    _GDIPlus_GraphicsDrawImage($hGraphic_GUI, $hBuffer_Bmp, 0, 0)

EndFunc   ;==>WM_PAINT

;borrowed from UEZ's post http://www.autoitscript.com/forum/topic/151664-drawing-on-a-window/#entry1086282
Func _GDIPlus_GraphicsDrawCurve2($hGraphics, $aPoints, $nTension = 0.01, $hPen = 0)

    Local $iI, $iCount, $iTmpErr, $iTmpExt, $pPoints, $tPoints, $aResult
    __GDIPlus_PenDefCreate($hPen)

    $iCount = $aPoints[0][0]
    $tPoints = DllStructCreate("float[" & $iCount * 2 & "]")
    $pPoints = DllStructGetPtr($tPoints)

    For $iI = 1 To $iCount
        DllStructSetData($tPoints, 1, $aPoints[$iI][0], (($iI - 1) * 2) + 1)
        DllStructSetData($tPoints, 1, $aPoints[$iI][1], (($iI - 1) * 2) + 2)
    Next

    $aResult = DllCall($ghGDIPDll, "uint", "GdipDrawCurve2", "handle", $hGraphics, "hwnd", $hPen, "ptr", $pPoints, "int", $iCount, "float", $nTension)
    $iTmpErr = @error
    $iTmpExt = @extended

    __GDIPlus_PenDefDispose()

    If $iTmpErr Then Return SetError($iTmpErr, $iTmpExt, False)

    Return $aResult[0] = 0

EndFunc   ;==>_GDIPlus_GraphicsDrawCurve2 

Still a newbie in GDIPlus. A lot to learn. Thanks for the new learning UEZ  :)

Edited by PhoenixXL

My code:

PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.

Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners.

MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. 

Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression.

Share this post


Link to post
Share on other sites
MachinistProgrammer

This ended up being my solution

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiButton.au3>
#include <ButtonConstants.au3>
#include <GDIPlus.au3>
;#include "ColorPicker.au3"
#include <array.au3>
#include <misc.au3>
#include <WinAPI.au3>
#include <GuiStatusBar.au3>
#region colourpicker.au3
#Region Header
#cs
    Title:          Color Picker Control UDF Library for AutoIt3
    Filename:       ColorPicker.au3
    Description:    Creates and manages a Color Picker control for the GUI
    Author:         Yashied
    Version:        1.5
    Requirements:   AutoIt v3.3 +, Developed/Tested on WindowsXP Pro Service Pack 2
    Uses:           GUIConstantsEx.au3, GUIButton.au3, GUIImageList.au3, SendMessage.au3, StaticConstants.au3, WinAPI.au3, WindowsConstants.au3
    Notes:          The library registers (permanently) the following window message:
                    WM_ACTIVATE
                    WM_COMMAND
                    WM_MOUSEWHEEL
                    WM_SETCURSOR
    Available functions:
    _GUIColorPicker_Create
    _GUIColorPicker_Delete
    _GUIColorPicker_Release
    _GUIColorPicker_GetColor
    _GUIColorPicker_SetColor
    _GUIColorPicker_GetPalette
    _GUIColorPicker_SetPalette
    Example1:
        #Include <ColorPicker.au3>
        #Include <WinAPI.au3>
        Opt('MustDeclareVars', 1)
        Global $hForm, $Msg, $Label, $Picker1, $Picker2, $Picker3, $Data, $hInstance, $hCursor
        $hForm = GUICreate('Color Picker', 300, 200)
        ; Load cursor
        $hInstance = _WinAPI_LoadLibrary(@SystemDir & '\mspaint.exe')
        $hCursor = DllCall('user32.dll', 'ptr', 'LoadCursor', 'ptr', $hInstance, 'dword', 1204)
        $hCursor = $hCursor[0]
        _WinAPI_FreeLibrary($hInstance)
        ; Create Picker1 with custom cursor
        $Picker1 = _GUIColorPicker_Create('', 100, 50, 44, 44, 0xFF6600, BitOR($CP_FLAG_DEFAULT, $CP_FLAG_CHOOSERBUTTON), 0, -1, -1, $hCursor, 'Simple Text')
        ; Free cursor
        DllCall('user32.dll', 'int', 'DestroyCursor', 'ptr', $hCursor)
        ; Create custom (4 x 5) color palette
        Dim $aPalette[20] = _
            [0xFFFFFF, 0x000000, 0xC0C0C0, 0x808080, _
             0xFF0000, 0x800000, 0xFFFF00, 0x808000, _
             0x00FF00, 0x008000, 0x00FFFF, 0x008080, _
             0x0000FF, 0x000080, 0xFF00FF, 0x800080, _
             0xC0DCC0, 0xA6CAF0, 0xFFFBF0, 0xA0A0A4]
        ; Create Picker2 with custom color palette
        $Picker2 = _GUIColorPicker_Create('', 7, 170, 50, 23, 0xFF00FF, BitOR($CP_FLAG_CHOOSERBUTTON, $CP_FLAG_ARROWSTYLE, $CP_FLAG_MOUSEWHEEL), $aPalette, 4, 5, 0, '', 'More...')
        ; Create custom (8 x 8) color palette
        Dim $aPalette[64]
        For $i = 0 To UBound($aPalette) - 1
            $aPalette[$i] = BitOR($i, BitShift($i * 4, -8), BitShift($i, -16))
        Next
        ; Create Picker3 with custom color palette
        $Picker3 = _GUIColorPicker_Create('Color...', 223, 170, 70, 23, 0x2DB42D, BitOR($CP_FLAG_TIP, $CP_FLAG_MAGNIFICATION), $aPalette, 8, 8)
        $Label = GUICtrlCreateLabel('', 194, 171, 22, 22, $SS_SUNKEN)
        GUICtrlSetBkColor(-1, 0x2DB42D)
        GUICtrlSetTip(-1, '2DB42D')
        GUISetState()
        While 1
            $Msg = GUIGetMsg()
            Switch $Msg ; Color Picker sends the message that the color is selected
                Case $GUI_EVENT_CLOSE
                    ExitLoop
                Case $Picker1
                    $Data = _GUIColorPicker_GetColor($Picker1, 1)
                    If $Data[1] = '' Then
                        $Data[1] = 'Custom'
                    EndIf
                    ConsoleWrite('Picker1: 0x' & Hex($Data[0], 6) & ' (' & $Data[1] &')' & @CR)
                Case $Picker2
                    ConsoleWrite('Picker2: 0x' & Hex(_GUIColorPicker_GetColor($Picker2), 6) & @CR)
                Case $Picker3
                    $Data = _GUIColorPicker_GetColor($Picker3)
                    ConsoleWrite('Picker3: 0x' & Hex($Data, 6) & @CR)
                    GUICtrlSetBkColor($Label, $Data)
                    GUICtrlSetTip($Label, Hex($Data, 6))
            EndSwitch
        WEnd
    Example2 (required ColorChooser.au3):
        #Include <ColorChooser.au3>
        #Include <ColorPicker.au3>
        Opt('MustDeclareVars', 1)
        Global $hForm, $Msg, $Label, $Picker
        $hForm = GUICreate('MyGUI', 170, 200)
        $Label = GUICtrlCreateLabel('', 15, 15, 140, 140, $SS_SUNKEN)
        GUICtrlSetBkColor(-1, 0x50CA1B)
        $Picker = _GUIColorPicker_Create('', 55, 166, 60, 23, 0x50CA1B, BitOR($CP_FLAG_CHOOSERBUTTON, $CP_FLAG_MAGNIFICATION, $CP_FLAG_ARROWSTYLE), 0, -1, -1, 0, 'Simple Text', 'Custom...', '_ColorChooserDialog')
        GUISetState()
        While 1
            $Msg = GUIGetMsg()
            Switch $Msg
                Case $GUI_EVENT_CLOSE
                    ExitLoop
                Case $Picker
                    GUICtrlSetBkColor($Label, _GUIColorPicker_GetColor($Picker))
            EndSwitch
        WEnd
#ce
#Include-once
#Include <GUIConstantsEx.au3>
#Include <GUIButton.au3>
#Include <GUIImageList.au3>
#Include <SendMessage.au3>
#Include <StaticConstants.au3>
#Include <WinAPI.au3>
#Include <WindowsConstants.au3>
#EndRegion Header
#Region Global Variables and Constants
Global Const $CP_FLAG_CHOOSERBUTTON = 0x01
Global Const $CP_FLAG_TIP = 0x02
Global Const $CP_FLAG_MAGNIFICATION = 0x04
Global Const $CP_FLAG_ARROWSTYLE = 0x08
;Global Const $CP_FLAG_HANDCURSOR = 0x10
Global Const $CP_FLAG_MOUSEWHEEL = 0x20
Global Const $CP_FLAG_DEFAULT = BitOR($CP_FLAG_MAGNIFICATION, $CP_FLAG_MOUSEWHEEL)
#EndRegion Global Variables and Constants
#Region Local Variables and Constants
Global Const $CP_WM_ACTIVATE = 0x0006
Global Const $CP_WM_COMMAND = 0x0111
Global Const $CP_WM_MOUSEWHEEL = 0x020A
Global Const $CP_WM_SETCURSOR = 0x0020
Global Const $cpWidth = 8
Global Const $cpHeight = 5
Dim $cpPalette[$cpWidth * $cpHeight][2] = _
   [[0x000000, 'Black'   ], [0x993300, 'Brown'       ], [0x333300, 'Olive Green' ], [0x003300, 'Dark Green'  ], [0x003366, 'Dark Teal'      ], [0x000080, 'Dark Blue' ], [0x333399, 'Indigo'   ], [0x333333, 'Gray-80%'], _
 [0x800000, 'Dark Red'], [0xFF6600, 'Orange'      ], [0x808000, 'Dark Yellow' ], [0x008000, 'Green'       ], [0x008080, 'Teal'           ], [0x0000FF, 'Blue'      ], [0x666699, 'Blue-Gray'], [0x808080, 'Gray-50%'], _
 [0xFF0000, 'Red'     ], [0xFF9900, 'Light Orange'], [0x99CC00, 'Lime'        ], [0x339966, 'Sea Green'   ], [0x33CCCC, 'Aqua'           ], [0x3366FF, 'Light Blue'], [0x800080, 'Violet'   ], [0x999999, 'Gray-40%'], _
 [0xFF00FF, 'Pink'    ], [0xFFCC00, 'Gold'        ], [0xFFFF00, 'Yellow'      ], [0x00FF00, 'Bright Green'], [0x00FFFF, 'Turquoise'      ], [0x00CCFF, 'Sky Blue'  ], [0x993366, 'Plum'     ], [0xC0C0C0, 'Gray-25%'], _
 [0xFF99CC, 'Rose'    ], [0xFFCC99, 'Tan'         ], [0xFFFF99, 'Light Yellow'], [0xCCFFCC, 'Light Green' ], [0xCCFFFF, 'Light Turquoise'], [0x99CCFF, 'Pale Blue' ], [0xCC99FF, 'Lavender' ], [0xFFFFFF, 'White'   ]]
Dim $cpId[1][17] = [[0, 0, 0, 0, 0, 0]]
#cs
DO NOT USE THIS ARRAY IN THE SCRIPT, INTERNAL USE ONLY!
$cpId[0][0 ]   - Count item of array
     [0][1 ]   - Reserved
     [0][2 ]   - Handle to the "Color Picker" window
     [0][3 ]   - Dummy control (controlID)
     [0][4 ]   - Handle to the cursor (current)
     [0][5 ]   - WM_ACTIVATE control flag
     [0][6-16] - Don`t used
$cpId[i][0 ]   - The control identifier (controlID) as returned by GUICtrlCreateButton()
     [i][1 ]   - Handle to the control (GUICtrlGetHandle($cpId[i][0]))
     [i][2 ]   - Handle to the ImageList for further release
     [i][3 ]   - Last selected color (in RGB)
     [i][4 ]   - Custom palette
     [i][5 ]   - Text of the button control
     [i][6 ]   - Title of the "Color Picker" window
     [i][7 ]   - Flags
     [i][8 ]   - Text of the button for the "Color Chooser" dialog box
     [i][9 ]   - Width of the palette (in color items)
     [i][10]   - Height of the palette (in color items)
     [i][11]   - Width of the control
     [i][12]   - Height of the control
     [i][13]   - Handle to the parnet window for a control
     [i][14]   - Handle to the cursor (0 if not defined)
     [i][15]   - User "Color Chooser" function
     [i][16]   - Reserved
#ce
Global $__CP_WM0111 = 0
Global $__CP_WM0020 = 0
#EndRegion Local Variables and Constants
#Region Initialization
; IMPORTANT! If you register the following window messages in your code, you should call handlers from this library until
; you return from your handlers, otherwise the Clor Picker controls will not work properly. For example:
;
; Func MY_WM_SETCURSOR($hWnd, $iMsg, $wParam, $lParam)
;     Local $Result = CP_WM_SETCURSOR($hWnd, $iMsg, $wParam, $lParam)
;     If Not $Result Then
;         Return 0
;     EndIf
;     ...
;     Return $GUI_RUNDEFMSG
; EndFunc   ;==>MY_WM_SETCURSOR
GUIRegisterMsg($CP_WM_ACTIVATE, 'CP_WM_ACTIVATE')
GUIRegisterMsg($CP_WM_COMMAND, 'CP_WM_COMMAND')
GUIRegisterMsg($CP_WM_MOUSEWHEEL, 'CP_WM_MOUSEWHEEL')
GUIRegisterMsg($CP_WM_SETCURSOR, 'CP_WM_SETCURSOR')
#EndRegion Initialization
#Region Public Functions
; #FUNCTION# ====================================================================================================================
; Name...........: _GUIColorPicker_Create
; Description....: Creates a Color Picker control for the GUI.
; Syntax.........: _GUIColorPicker_Create ( $sText, $iLeft, $iTop, $iWidth, $iHeight [, $iRGB [, $iFlags [, $aPalette [, $iWidthPalette [, $iHeightPalette [, $hCursor [, $sTitle [, $sButton [, $sColorFunc]]]]]]]]] )
; Parameters.....: $sText          - The text of the button control. If the value of this parameter is "" then the button will
;                                    display the rectangle with filled of current ($iRGB) color.
;                  $iLeft          - The left side of the control.
;                  $iTop           - The top of the control.
;                  $iWidth         - The width of the control.
;                  $iHeight        - The height of the control.
;                  $iRGB           - Default selected color (in RGB). Default is 0 (Black).
;                  $iFlags         - Defines a style of the "Color Picker" window. This parameter can be a combination of the following values.
;
;                                    $CP_FLAG_CHOOSERBUTTON
;                                    $CP_FLAG_TIP
;                                    $CP_FLAG_MAGNIFICATION
;                                    $CP_FLAG_ARROWSTYLE
;                                    $CP_FLAG_HANDCURSOR (don't used)
;                                    $CP_FLAG_MOUSEWHEEL
;
;                                    (See constants section in this library)
;
;                  $aPalette       - Custom color palette. This parameter should be an array of Width x Height (see more) items containing the
;                                    values of colors for each label (in RGB). Default is 0 - uses a default palette.
;                  $iWidthPalette  - Width of the palette (in color items). Minimum value of - 4. Default is (-1) - uses a default width.
;                  $iHeightPalette - Height of the palette (in color items). Minimum value of - 4. Default is (-1) - uses a default height.
;                  $hCursor        - Handle to the user defined cursor. To use one of the predefined cursors set this parameter to
;                                    one of the $IDC_... constants. Default is 0 - does not use cursor.
;                  $sTitle         - Title of the "Color Picker" window. If the value of this parameter is "" then the title
;                                    will not be displayed. Default is "".
;                  $sButton        - The text of the button for the "Color Chooser" dialog box. Default is "Custom...".
;                  $sColorFunc     - User "Color Chooser" dialog box function. To make the user function workable you have to define it
;                                    with 2 function parameters otherwise the function won't be called.
;
;                                    Func _MyColorChooserDialog($iColorRef, $hParent)
;
;                                    A custom function must return a color value, in RGB, or (-1) if the user does not choose a color.
;                                    If this parameter is empty string or not used, will be used Windows default "Color Chooser" function,
;                                    like _ChooseColor() from Misc.au3 UDF library. This parameter is valid only if the
;                                    $CP_FLAG_CHOOSERBUTTON flag is set.
; Return values..: Success         - 1
;                  Failure         - 0
; Author.........: Yashied
; Modified.......:
; Remarks........: The function copies the cursor ($hCursor) for internal use, and if the bitmap is no longer needed, it is necessary to
;                  release the resources associated with the bitmap by using the _WinAPI_DestroyCursor() function. $CP_FLAG_TIP flag is
;                  not valid if $hCursor parameter is used.
; Related........:
; Link...........:
; Example........: Yes
; ===============================================================================================================================
Func _GUIColorPicker_Create($sText, $iLeft, $iTop, $iWidth, $iHeight, $iRGB = 0, $iFlags = -1, $aPalette = 0, $iWidthPalette = -1, $iHeightPalette = -1, $hCursor = 0, $sTitle = '', $sButton = 'Custom...', $sColorFunc = '')
 If $iFlags < 0 Then
  $iFlags = $CP_FLAG_DEFAULT
 EndIf
 $sText = StringStripWS($sText, 3)
 $sTitle = StringStripWS($sTitle, 3)
 $sButton = StringStripWS($sButton, 3)
 $sColorFunc = StringStripWS($sColorFunc, 3)
 $iFlags = BitOR($iFlags, 0x0080 * (StringLen($sText) = 0), 0x0100 * (StringLen($sTitle) > 0))
 Local $ID = GUICtrlCreateButton($sText, $iLeft, $iTop, $iWidth, $iHeight)
 If $ID = 0 Then
  Return 0
 EndIf
 Local $aData, $hPrev, $hImageList, $hID = GUICtrlGetHandle($ID)
 If BitAND($iFlags, 0x0080) Then
  If BitAND($iFlags, $CP_FLAG_ARROWSTYLE) Then
   $aData = CP_CreateArrowBitmap($iRGB, $iWidth - 10, $iHeight - 10)
  Else
   $aData = CP_CreateSolidBitmap($iRGB, $iWidth - 10, $iHeight - 10)
  EndIf
  $hImageList = _GUIImageList_Create($iWidth - 10, $iHeight - 10, 5, 1)
  _GUIImageList_Add($hImageList, $aData[0], $aData[1])
  _GUICtrlButton_SetImageList($hID, $hImageList, 4)
  For $i = 0 To 1
   _WinAPI_DeleteObject($aData[$i])
  Next
 EndIf
 If $iWidthPalette < 4 Then
  $iWidthPalette = $cpWidth
 EndIf
 If $iHeightPalette < 4 Then
  $iHeightPalette = $cpHeight
 EndIf
 If $hCursor Then
  Switch $hCursor
   Case 32512 To 32516, 32640 To 32650
    $hCursor = DllCall('user32.dll', 'ptr', 'LoadCursor', 'ptr', 0, 'dword', $hCursor)
   Case Else
    $hCursor = DllCall('user32.dll', 'ptr', 'CopyIcon', 'ptr', $hCursor)
  EndSwitch
  If (Not @error) And ($hCursor[0]) Then
   $hCursor = $hCursor[0]
  Else
   $hCursor = 0
  EndIf
 EndIf
 ReDim $cpId[$cpId[0][0] + 2][UBound($cpId, 2)]
 $cpId[0][0] += 1
 $cpId[$cpId[0][0]][0 ] = $ID
 $cpId[$cpId[0][0]][1 ] = $hID
 $cpId[$cpId[0][0]][2 ] = $hImageList
 $cpId[$cpId[0][0]][3 ] = $iRGB
 $cpId[$cpId[0][0]][4 ] = CP_ValidatePalette($aPalette, $iWidthPalette * $iHeightPalette, 0xFFFFFF)
 $cpId[$cpId[0][0]][5 ] = $sText
 $cpId[$cpId[0][0]][6 ] = $sTitle
 $cpId[$cpId[0][0]][7 ] = $iFlags
 $cpId[$cpId[0][0]][8 ] = $sButton
 $cpId[$cpId[0][0]][9 ] = $iWidthPalette
 $cpId[$cpId[0][0]][10] = $iHeightPalette
 $cpId[$cpId[0][0]][11] = $iWidth
 $cpId[$cpId[0][0]][12] = $iHeight
 $cpId[$cpId[0][0]][13] = _WinAPI_GetParent($hID)
 $cpId[$cpId[0][0]][14] = $hCursor
 $cpId[$cpId[0][0]][15] = $sColorFunc
 $cpId[$cpId[0][0]][16] = 0
 Return $ID
EndFunc   ;==>_GUIColorPicker_Create
; #FUNCTION# ====================================================================================================================
; Name...........: _GUIColorPicker_Delete
; Description....: Deletes a Color Picker control.
; Syntax.........: _GUIColorPicker_Delete ( $controlID )
; Parameters.....: $controlID - The control identifier (controlID) as returned by a _GUIColorPicker_Create() function.
; Return values..: Success    - 1
;                  Failure    - 0
; Author.........: Yashied
; Modified.......:
; Remarks........:
; Related........:
; Link...........:
; Example........: Yes
; ===============================================================================================================================
Func _GUIColorPicker_Delete($controlID)
 For $i = 1 To $cpId[0][0]
  If $cpId[$i][0] = $controlID Then
   If Not GUICtrlDelete($cpId[$i][0]) Then
    Return 0
   EndIf
   If BitAND($cpId[$i][7], 0x0080) Then
    $cpId[$i][3] = -1
    CP_SetColor($i)
   EndIf
   If $cpId[$i][14] Then
    DllCall('user32.dll', 'int', 'DestroyCursor', 'ptr', $cpId[$i][14])
   EndIf
   For $j = $i To $cpId[0][0] - 1
    For $k = 0 To UBound($cpId, 2) - 1
     $cpId[$j][$k] = $cpId[$j + 1][$k]
    Next
   Next
   $cpId[0][0] -= 1
   ReDim $cpId[$cpId[0][0] + 1][UBound($cpId, 2)]
   Return 1
  EndIf
 Next
 Return 0
EndFunc   ;==>_GUIColorPicker_Delete
; #FUNCTION# ====================================================================================================================
; Name...........: _GUIColorPicker_Release
; Description....: Deletes all Color Picker controls for a window (GUI).
; Syntax.........: _GUIColorPicker_Release ( $hWnd )
; Parameters.....: $hWnd   - Handle to the window to be released.
; Return values..: Success - 1
;                  Failure - 0
; Author.........: Yashied
; Modified.......:
; Remarks........:
; Related........:
; Link...........:
; Example........: Yes
; ===============================================================================================================================
Func _GUIColorPicker_Release($hWnd)
 If Not WinExists($hWnd) Then
  Return SetError(1, 0, 0)
 EndIf
 Local $Count = 1, $Result = 0
 While $Count <= $cpId[0][0]
  If $cpId[$Count][13] = $hWnd Then
   If Not _GUIColorPicker_Delete($cpId[$Count][0]) Then
    Return 0
   EndIf
   $Result = 1
  Else
   $Count += 1
  EndIf
 WEnd
 Return $Result
EndFunc   ;==>_GUIColorPicker_Release
; #FUNCTION# ====================================================================================================================
; Name...........: _GUIColorPicker_GetColor
; Description....: Retrieves the selected color of the Color Picker control.
; Syntax.........: _GUIColorPicker_GetColor ( $controlID )
; Parameters.....: $controlID - The control identifier (controlID) as returned by a _GUIColorPicker_Create() function.
;                  $iFlag     - Determines return type, valid values:
;                  |0 - Returns value (in RGB) of the selected color (Default)
;                  |1 - Returns array of two elements ([0] - RGB color, [1] - name of color)
; Return values..: Success    - Value depending on the $iFlag flag.
;                  Failure    - (-1)
; Author.........: Yashied
; Modified.......:
; Remarks........:
; Related........:
; Link...........:
; Example........: Yes
; ===============================================================================================================================
Func _GUIColorPicker_GetColor($controlID, $iFlag = 0)
 Local $Data, $Palette, $Name = ''
 For $i = 1 To $cpId[0][0]
  If $cpId[$i][0] = $controlID Then
   If $iFlag Then
    $Palette = $cpId[$i][4]
    For $j = 0 To UBound($Palette) - 1
     If $cpId[$i][3] = $Palette[$j][0] Then
      $Name = $Palette[$j][1]
      ExitLoop
     EndIf
    Next
    Dim $Data[2] = [$cpId[$i][3], $Name]
    Return $Data
   Else
    Return $cpId[$i][3]
   EndIf
  EndIf
 Next
 Return -1
EndFunc   ;==>_GUIColorPicker_GetColor
; #FUNCTION# ====================================================================================================================
; Name...........: _GUIColorPicker_SetColor
; Description....: Sets the color for the Color Picker control.
; Syntax.........: _GUIColorPicker_SetColor ( $controlID, $iRGB )
; Parameters.....: $controlID - The control identifier (controlID) as returned by a _GUIColorPicker_Create() function.
;                  $iRGB      - The RGB color to use.
; Return values..: Success    - 1
;                  Failure    - 0
; Author.........: Yashied
; Modified.......:
; Remarks........:
; Related........:
; Link...........:
; Example........: Yes
; ===============================================================================================================================
Func _GUIColorPicker_SetColor($controlID, $iRGB)
 For $i = 1 To $cpId[0][0]
  If $cpId[$i][0] = $controlID Then
   $cpId[$i][3] = $iRGB
   If BitAND($cpId[$i][7], 0x0080) Then
    CP_SetColor($i)
   EndIf
   Return 1
  EndIf
 Next
 Return 0
EndFunc   ;==>_GUIColorPicker_SetColor
; #FUNCTION# ====================================================================================================================
; Name...........: _GUIColorPicker_GetPalette
; Description....: Retrieves the current palette of the Color Picker control.
; Syntax.........: _GUIColorPicker_GetPalette ( $controlID [, $iFlag])
; Parameters.....: $controlID - The control identifier (controlID) as returned by a _GUIColorPicker_Create() function.
;                  $iFlag     - Determines return type, valid values:
;                  |0 - Returns 1D array consisting of the values of color only (Default)
;                  |1 - Returns 2D array consisting of the values of color and its name
; Return values..: Success    - Array of RGB colors for the current palette.
;                  Failure    - 0
; Author.........: Yashied
; Modified.......:
; Remarks........:
; Related........:
; Link...........:
; Example........: Yes
; ===============================================================================================================================
Func _GUIColorPicker_GetPalette($controlID, $iFlag = 0)
 Local $Data, $Palette
 For $i = 1 To $cpId[0][0]
  If $cpId[$i][0] = $controlID Then
   If $iFlag Then
    Return $cpId[$i][4]
   Else
    $Palette = $cpId[$i][4]
    Dim $Data[UBound($Palette)]
    For $i = 0 To UBound($Palette) - 1
     $Data[$i] = $Palette[$i][0]
    Next
    Return $Data
   EndIf
  EndIf
 Next
 Return 0
EndFunc   ;==>_GUIColorPicker_GetPalette
; #FUNCTION# ====================================================================================================================
; Name...........: _GUIColorPicker_SetPalette
; Description....: Sets the palette for the Color Picker control.
; Syntax.........: _GUIColorPicker_SetPalette ( $controlID, $aPalette )
; Parameters.....: $controlID - The control identifier (controlID) as returned by a _GUIColorPicker_Create() function.
;                  $aPalette  - Array of RGB colors for the palette to use. Dimension of the array should be Width x Height (See _GUIColorPicker_Create()).
; Return values..: Success    - 1
;                  Failure    - 0
; Author.........: Yashied
; Modified.......:
; Remarks........:
; Related........:
; Link...........:
; Example........: Yes
; ===============================================================================================================================
Func _GUIColorPicker_SetPalette($controlID, $aPalette)
 For $i = 1 To $cpId[0][0]
  If $cpId[$i][0] = $controlID Then
   $cpId[$i][4] = CP_ValidatePalette($aPalette, $cpId[$i][9] * $cpId[$i][10], 0xFFFFFF)
   Return 1
  EndIf
 Next
 Return 0
EndFunc   ;==>_GUIColorPicker_SetPalette
#EndRegion Public Functions
#Region Internal Functions
Func CP_Assign(ByRef $iVariable, $iValue)
 $iVariable = $iValue
EndFunc   ;==>CP_Assign
Func CP_CreateArrowBitmap($iRGB, $iWidth, $iHeight)
 Local $hDC, $hBackDC, $hFrontDC, $hFront, $hBack, $hPen
 Local $aData[2]
 $hDC = _WinAPI_GetDC(0)
 $hBackDC = _WinAPI_CreateCompatibleDC($hDC)
 $hBack = _WinAPI_CreateSolidBitmap(0, 0, $iWidth, $iHeight)
 _WinAPI_SelectObject($hBackDC, $hBack)
 $hFrontDC = _WinAPI_CreateCompatibleDC($hDC)
 $hFront = _WinAPI_CreateSolidBitmap(0, 0xFFFFFF, $iWidth - 11, $iHeight)
 _WinAPI_SelectObject($hFrontDC, $hFront)
 _WinAPI_BitBlt($hBackDC, 0, 0, $iWidth - 11, $iHeight, $hFrontDC, 0, 0, $SRCCOPY)
 _WinAPI_DeleteObject($hFront)
 $hFront = _WinAPI_CreateSolidBitmap(0, $iRGB, $iWidth - 11 - 2, $iHeight - 2)
 _WinAPI_SelectObject($hFrontDC, $hFront)
 _WinAPI_BitBlt($hBackDC, 1, 1, $iWidth - 11 - 2, $iHeight - 2, $hFrontDC, 0, 0, $SRCCOPY)
 $aData[0] = $hBack
 _WinAPI_DeleteObject($hFront)
 $hBack = _WinAPI_CreateSolidBitmap(0, 0xFFFFFF, $iWidth, $iHeight)
 _WinAPI_SelectObject($hBackDC, $hBack)
 $hFront = _WinAPI_CreateSolidBitmap(0, 0, $iWidth - 11, $iHeight)
 _WinAPI_SelectObject($hFrontDC, $hFront)
 _WinAPI_BitBlt($hBackDC, 0, 0, $iWidth - 11, $iHeight, $hFrontDC, 0, 0, $SRCCOPY)
 _WinAPI_DeleteObject($hFront)
 $hPen = _WinAPI_CreatePen($PS_SOLID, 1, 0)
 _WinAPI_SelectObject($hBackDC, $hPen)
 For $i = 1 To 4
  _WinAPI_DrawLine($hBackDC, $iWidth - $i - 4, Int($iHeight / 2) + Mod($iHeight, 2) - $i + 2, $iWidth + $i - 5, Int($iHeight / 2) + Mod($iHeight, 2) - $i + 2)
 Next
 $aData[1] = $hBack
 _WinAPI_DeleteObject($hPen)
 _WinAPI_ReleaseDC(0, $hDC)
 _WinAPI_DeleteDC($hFrontDC)
 _WinAPI_DeleteDC($hBackDC)
 Return $aData
EndFunc   ;==>CP_CreateArrowBitmap
Func CP_CreateSolidBitmap($iRGB, $iWidth, $iHeight)
 Local $hDC, $hBackDC, $hFrontDC, $hFront, $hBack
 Local $aData[2]
 $hDC = _WinAPI_GetDC(0)
 $hBackDC = _WinAPI_CreateCompatibleDC($hDC)
 $hBack = _WinAPI_CreateSolidBitmap(0, 0xFFFFFF, $iWidth, $iHeight)
 _WinAPI_SelectObject($hBackDC, $hBack)
 $hFrontDC = _WinAPI_CreateCompatibleDC($hDC)
 $hFront = _WinAPI_CreateSolidBitmap(0, $iRGB, $iWidth - 2, $iHeight - 2)
 _WinAPI_SelectObject($hFrontDC, $hFront)
 _WinAPI_BitBlt($hBackDC, 1, 1, $iWidth - 2, $iHeight - 2, $hFrontDC, 0, 0, $SRCCOPY)
 $aData[0] = $hBack
 $aData[1] = 0
 _WinAPI_DeleteObject($hFront)
 _WinAPI_ReleaseDC(0, $hDC)
 _WinAPI_DeleteDC($hFrontDC)
 _WinAPI_DeleteDC($hBackDC)
 Return $aData
EndFunc   ;==>CP_CreateSolidBitmap
Func CP_ColorChooserDlg($iRGB, $hWnd)
 Local $tCHOOSECOLOR = DllStructCreate('dword;hwnd;hwnd;dword;ptr;dword;lparam;ptr;ptr')
 Local $tCC = DllStructCreate('int[16]')
 DllStructSetData($tCHOOSECOLOR, 1, DllStructGetSize($tCHOOSECOLOR))
 DllStructSetData($tCHOOSECOLOR, 2, $hWnd)
 DllStructSetData($tCHOOSECOLOR, 4, CP_SwitchColor($iRGB))
 DllStructSetData($tCHOOSECOLOR, 5, DllStructGetPtr($tCC))
 DllStructSetData($tCHOOSECOLOR, 6, 0x103)
 Local $Ret = DllCall('comdlg32.dll', 'long', 'ChooseColor', 'ptr', DllStructGetPtr($tCHOOSECOLOR))
 If $Ret[0] = 0 Then
  Return -1
 EndIf
 Return CP_SwitchColor(DllStructGetData($tCHOOSECOLOR, 4))
EndFunc   ;==>CP_ColorChooserDlg
Func CP_Index($controlID, ByRef $aData)
 For $i = 0 To UBound($aData) - 1
  If $aData[$i] = $controlID Then
   Return $i
  EndIf
 Next
 Return -1
EndFunc   ;==>CP_Index
Func CP_PickerDlg($ID)
 Local $Msg, $X, $Y, $Cursor, $Index, $Prev, $Rgb, $Size, $Active = 0, $Custom = -1, $Result = 0, $Pressed = False
 Local $Label[$cpId[$ID][9] * $cpId[$ID][10]]
 Local $Accel[2][2] = [['{ENTER}', 0], ['{ESC}', 0]]
 Local $Width = 25 * $cpId[$ID][9] + 3, $Height = 25 * $cpId[$ID][10] + 3
 Local $dH = 28 * (BitAND($cpId[$ID][7], 0x0100) = 0x0100)
 Local $tRECT = _WinAPI_GetWindowRect($cpId[$ID][1])
 Local $GUIOnEventMode = Opt('GUIOnEventMode', 0)
 Local $Taskbar = CP_TaskbarHeight()
 Local $Palette = $cpId[$ID][4]
 $X = DllStructGetData($tRECT, 1)
 $Y = DllStructGetData($tRECT, 4)
 If $X < 0 Then
  $X = 0
 EndIf
 If $X > @DesktopWidth - ($Width + 6) Then
  $X = @DesktopWidth - ($Width + 6)
 EndIf
 If $Y < 0 Then
  $Y = 0
 EndIf
 If $Y > @DesktopHeight - $Taskbar - $dH - 28 * BitAND($cpId[$ID][7], $CP_FLAG_CHOOSERBUTTON) - ($Height + 6) Then
  $Y = @DesktopHeight - $Taskbar - $dH - 28 * BitAND($cpId[$ID][7], $CP_FLAG_CHOOSERBUTTON) - ($Height + 6)
 EndIf
 $cpId[0][2] = GUICreate('', $Width, $Height + $dH + 28 * BitAND($cpId[$ID][7], $CP_FLAG_CHOOSERBUTTON), $X, $Y, $WS_POPUP, $WS_EX_DLGMODALFRAME, $cpId[$ID][13])
; GUISetBkColor(0xFCFCFC, $cpId[0][2])
 If BitAND($cpId[$ID][7], 0x0100) Then
  GUICtrlCreateLabel('', 4, 4, $Width - 8, 23, $SS_GRAYFRAME)
  GUICtrlCreateLabel($cpId[$ID][6], 6, 9, $Width - 12, 14, $SS_CENTER)
  GUICtrlSetFont(-1, 8.5, 400, 0, 'MS Shell Dlg')
 EndIf
 For $i = 1 To $cpId[$ID][10]
  For $j = 1 To $cpId[$ID][9]
   $Index = ($i - 1) * $cpId[$ID][9] + $j - 1
   If ($Active = 0) And ($cpId[$ID][3] = $Palette[$Index][0]) And (BitAND($cpId[$ID][7], $CP_FLAG_MAGNIFICATION)) Then
    $Label[$Index] = GUICtrlCreateLabel('', 2 + 25 * ($j - 1), 2 + $dH + 25 * ($i - 1), 24, 24, $SS_SUNKEN)
    $Active = $Label[$Index]
   Else
    $Label[$Index] = GUICtrlCreateLabel('', 4 + 25 * ($j - 1), 4 + $dH + 25 * ($i - 1), 20, 20, $SS_SUNKEN)
   EndIf
   GUICtrlSetBkColor(-1, $Palette[$Index][0])
   If BitAND($cpId[$ID][7], $CP_FLAG_TIP) Then
    GUICtrlSetTip(-1, $Palette[$Index][1])
   EndIf
   If $cpId[$ID][14] Then
    GUICtrlSetState(-1, $GUI_DISABLE)
   EndIf
  Next
 Next
 $cpId[0][3] = GUICtrlCreateDummy()
 For $i = 0 To 1
  $Accel[$i][1] = $cpId[0][3]
 Next
 If BitAND($cpId[$ID][7], $CP_FLAG_CHOOSERBUTTON) Then
  $Custom = GUICtrlCreateButton('', 0, 0)
  $Size = CP_StringSize($Custom, $cpId[$ID][8]) + 24
  If $Size > $Width - 6 Then
   $Size = $Width - 6
  EndIf
  GUICtrlSetPos(-1, Int(($Width - $Size) / 2), $Height + 2 + $dH, $Size + Mod($Width - $Size, 2), 21)
  GUICtrlSetFont(-1, 8.5, 400, 0, 'MS Shell Dlg')
  GUICtrlSetData(-1, $cpId[$ID][8])
 EndIf
 GUISetAccelerators($Accel, $cpId[0][2])
 GUISetState(@SW_SHOW, $cpId[0][2])
 While 1
  $Cursor = GUIGetCursorInfo($cpId[0][2])
  If Not @error Then
   If CP_PtInRect($Cursor[0], $Cursor[1], 2, 2 + $dH, 25 * $cpId[$ID][9], $dH + 25 * $cpId[$ID][10]) Then
    $cpId[0][4] = $cpId[$ID][14]
   Else
    $cpId[0][4] = 0
   EndIf
   If BitXOR($Active, $Cursor[4]) Then
    If Not $Cursor[2] Then
     For $i = 0 To UBound($Label) - 1
      If $Cursor[4] = $Label[$i] Then
       If BitAND($cpId[$ID][7], $CP_FLAG_MAGNIFICATION) Then
        $Index = CP_Index($Active, $Label)
        GUICtrlSetPos($Active, 4 + 25 * Mod($Index, $cpId[$ID][9]), 4 + $dH + 25 * ($Index - Mod($Index, $cpId[$ID][9])) / $cpId[$ID][9], 20, 20)
        GUICtrlSetPos($Label[$i], 2 + 25 * Mod($i, $cpId[$ID][9]), 2 + $dH + 25 * ($i - Mod($i, $cpId[$ID][9])) / $cpId[$ID][9], 24, 24)
       EndIf
       $Active = $Label[$i]
       ExitLoop
      EndIf
     Next
    EndIf
   Else
    If ($Cursor[2]) And (Not $Pressed) Then
     $Index = CP_Index($Cursor[4], $Label)
     If $Index > -1 Then
      $cpId[$ID][3] = $Palette[$Index][0]
      $Result = 2
      ExitLoop
     EndIf
    EndIf
   EndIf
   $Pressed = $Cursor[2]
  EndIf
  $Msg = GUIGetMsg()
  Switch $Msg
   Case $GUI_EVENT_CLOSE, $cpId[0][3]
    ExitLoop
   Case $Custom
    $Result = 1
    ExitLoop
  EndSwitch
 WEnd
 $cpId[0][5] = 1
 GUIDelete($cpId[0][2])
 $cpId[0][2] = 0
 $cpId[0][3] = 0
 $cpId[0][4] = 0
 $cpId[0][5] = 0
 Opt('GUIOnEventMode', $GUIOnEventMode)
 Switch $Result
  Case 0
   Return 0
  Case 1
   If $cpId[$ID][15] = '' Then
    $Rgb = CP_ColorChooserDlg($cpId[$ID][3], $cpId[$ID][13])
   Else
    If (IsDeclared('ccData')) And ($cpId[$ID][15] = '_ColorChooserDialog') Then
     Execute('CP_Assign($Prev, $ccData[9])')
     Execute('CP_Assign($ccData[9], $cpId[$ID][14])')
     $Cursor = 1
    Else
     $Cursor = 0
    EndIf
    $Rgb = Call($cpId[$ID][15], $cpId[$ID][3], $cpId[$ID][13])
    If (@error = 0xDEAD) And (@extended = 0xBEEF) Then
     $Rgb = -1
    EndIf
    If $Cursor Then
     Execute('CP_Assign($ccData[9], $Prev)')
    EndIf
   EndIf
   If $Rgb < 0 Then
    _WinAPI_SetFocus($cpId[$ID][1])
    Return 0
   EndIf
   $cpId[$ID][3] = $Rgb
   ContinueCase
  Case 2
   If BitAND($cpId[$ID][7], 0x0080) Then
    CP_SetColor($ID)
   EndIf
 EndSwitch
 _WinAPI_SetFocus($cpId[$ID][1])
 Return 1
EndFunc   ;==>CP_PickerDlg
Func CP_PtInRect($iXn, $iYn, $iX1, $iY1, $iX2, $iY2)
 If ($iXn >= $iX1) And ($iXn <= $iX2) And ($iYn >= $iY1) And ($iYn <= $iY2) Then
  Return 1
 Else
  Return 0
 EndIf
EndFunc   ;==>CP_PtInRect
Func CP_SetColor($ID)
 Local $aData
 If $cpId[$ID][3] < 0 Then
  _GUIImageList_Destroy($cpId[$ID][2])
 Else
  If BitAND($cpId[$ID][7], $CP_FLAG_ARROWSTYLE) Then
   $aData = CP_CreateArrowBitmap($cpId[$ID][3], $cpId[$ID][11] - 10, $cpId[$ID][12] - 10)
  Else
   $aData = CP_CreateSolidBitmap($cpId[$ID][3], $cpId[$ID][11] - 10, $cpId[$ID][12] - 10)
  EndIf
  _GUIImageList_Remove($cpId[$ID][2])
  _GUIImageList_Add($cpId[$ID]