Конечно, возможно. И даже штатными средствамивозможно ли рисовать "от руки" в GUI?
#include <GuiConstantsEx.au3>
GUICreate("")
$g = GUICtrlCreateGraphic(0, 0, 400, 400)
GUISetState()
Do
$info = GUIGetCursorInfo()
If Not @error And $info[2] Then
GUICtrlSetGraphic($g, $GUI_GR_PIXEL, $info[0], $info[1])
GUICtrlSetGraphic($g, $GUI_GR_REFRESH)
Sleep(10)
EndIf
Until GUIGetMsg() = -3
#include <GDIPlus.au3>
#include <misc.au3>
Opt("GUIOnEventMode", 1)
Opt("MouseCoordMode", 2)
$hwnd = GUICreate("Sample", 400, 400)
GUISetOnEvent(-3, "close")
GUISetState()
_GDIPlus_Startup()
$graphics = _GDIPlus_GraphicsCreateFromHWND($hwnd)
_GDIPlus_GraphicsClear($graphics, 0xFFFFFFFF)
$pen = _GDIPlus_PenCreate(0xFF000000)
$dll = DllOpen("user32.dll")
Do
If _IsPressed("01", $dll) And WinActive("Sample") Then
$oldpos=MouseGetPos()
_GDIPlus_GraphicsDrawRect($graphics,$oldpos[0],$oldpos[1],1,1,$pen)
Do
$pos = MouseGetPos()
_GDIPlus_GraphicsDrawLine($graphics,$oldpos[0],$oldpos[1],$pos[0],$pos[1],$pen)
$oldpos=$pos
Until Not _IsPressed("01", $dll)
EndIf
Sleep(25)
Until False
Func close()
_GDIPlus_PenDispose($pen)
_GDIPlus_GraphicsDispose($graphics)
_GDIPlus_Shutdown()
Exit
EndFunc ;==>close
#include <GDIPlus.au3>
#include <misc.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
Opt("MouseCoordMode", 2)
$hwnd = GUICreate("Sample", 400, 400, -1, -1, -1, $WS_EX_LAYERED)
$button1 = GUICtrlCreateButton("save",10,5)
GUICtrlSetOnEvent(-1, "save")
GUISetBkColor(0xABCDEF, $hwnd)
GUISetOnEvent(-3, "close")
GUISetState()
_GDIPlus_Startup()
$graphics = _GDIPlus_GraphicsCreateFromHWND($hwnd)
;_GDIPlus_GraphicsClear($graphics, 0xFFFFFFFF)
$pen = _GDIPlus_PenCreate(0xFF000000,3,0)
_WINAPI_SetLayeredWindowAttributes($hwnd, 0xABCDEF,255)
$dll = DllOpen("user32.dll")
Do
If _IsPressed("01", $dll) And WinActive("Sample") Then
$oldpos=MouseGetPos()
_GDIPlus_GraphicsDrawRect($graphics,$oldpos[0],$oldpos[1],1,1,$pen)
Do
$pos = MouseGetPos()
_GDIPlus_GraphicsDrawLine($graphics,$oldpos[0],$oldpos[1],$pos[0],$pos[1],$pen)
$oldpos=$pos
Until Not _IsPressed("01", $dll)
EndIf
Sleep(25)
Until False
Func save()
$bitmap = _GDIPlus_BitmapCreateFromGraphics ( 400, 400, $graphics)
$hCtxt = _GDIPlus_ImageGetGraphicsContext($bitmap)
_GDIPlus_GraphicsSetSmoothingMode($hCtxt, 2)
_GDIPlus_GraphicsDrawImage($graphics, $bitmap, 0, 0)
_GDIPlus_ImageSaveToFile($bitmap, @DesktopDir & "\qqqqqqqqqqqq.png")
EndFunc;==>save
Func close()
_GDIPlus_PenDispose($pen)
_GDIPlus_GraphicsDispose($graphics)
_GDIPlus_Shutdown()
Exit
EndFunc ;==>close
_GDIPlus_GraphicsClear($graphics, 0xFFFFFFFF) ; Alpha = 0xFF (255)
#include <GDIPlus.au3>
#include <misc.au3>
#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)
Opt("MouseCoordMode", 2)
$hwnd = GUICreate("Sample", 400, 400, -1, -1, -1, $WS_EX_LAYERED)
GUISetBkColor(0xABCDEF, $hwnd)
_WINAPI_SetLayeredWindowAttributes($hwnd, 0xABCDEF, 255)
GUISetOnEvent(-3, "close")
$button1 = GUICtrlCreateButton("save",10,5)
GUICtrlSetOnEvent(-1, "save")
GUISetState()
GUIRegisterMsg($WM_ERASEBKGND, "WM_ERASEBKGND")
GUIRegisterMsg($WM_PAINT, "WM_ERASEBKGND")
_GDIPlus_Startup()
$graphics = _GDIPlus_GraphicsCreateFromHWND($hwnd)
$bitmap = _GDIPlus_BitmapCreateFromGraphics(400, 400, $graphics)
$buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)
_GDIPlus_GraphicsSetSmoothingMode($buffer, 2)
$pen = _GDIPlus_PenCreate(0xFFFF0000, 3)
$dll = DllOpen("user32.dll")
Do
If _IsPressed("01", $dll) And WinActive("Sample") Then
$oldpos = MouseGetPos()
Do
$pos = MouseGetPos()
If $pos[0] <> $oldpos[0] Or $pos[1] <> $oldpos[1] Then
_GDIPlus_GraphicsDrawLine($buffer, $oldpos[0], $oldpos[1], $pos[0], $pos[1], $pen)
_GDIPlus_GraphicsDrawImage($graphics, $bitmap, 0, 0)
$oldpos = $pos
EndIf
Sleep(10)
Until Not _IsPressed("01", $dll)
EndIf
Sleep(10)
Until False
Func save()
_GDIPlus_ImageSaveToFile($bitmap, @DesktopDir & "\qqqq.png")
EndFunc
Func close()
_GDIPlus_PenDispose($pen)
_GDIPlus_GraphicsDispose($buffer)
_GDIPlus_GraphicsDispose($graphics)
_GDIPlus_BitmapDispose($bitmap)
_GDIPlus_Shutdown()
DllClose($dll)
Exit
EndFunc
Func WM_ERASEBKGND()
_GDIPlus_GraphicsDrawImage($graphics, $bitmap, 0, 0)
Return $GUI_RUNDEFMSG
EndFunc
DllClose()
Видимо, у вас отключено Aero (установлена упрощённая тема).Курсор всегда проходит насквозь
В моём примере (Ответ #6) вы можете рисовать на фоне любого цвета с любой степенью прозрачности и даже на картинке. Также нет необходимости применять к окну стиль $WS_EX_LAYERED. Сохранение в PNG всё равно будет с прозрачным фоном, т.к. сохраняется bitmap из памяти, у которого фон не закрашен.Решил рисовать на белом фоне а потом делать его прозрачным через ImageMagick