Здравствуйте! Возникла потребность такого. На память пришел пример Clock.au3 из папки примеров автоита. Давай я оттуда удалять все лишнее, стремясь получить минимальный код, выполняющий это. На текущий момент дошел до следующего кода:
Этот код работает, да. Но создавать аж 2 специальной функции для такой, на мой взгляд, не такой и сложной задачи кажется мне стрельбой из пушки по воробьям. Мне кажется, в Автоите должно найтись более простое средство для получения этого. Вопрос, какое? Вы не подскажете мне что-нибудь?
Код:
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
Global Const $iOpacity = 128
Global Const $iRadius = 200
Global Const $AC_SRC_ALPHA = 1
Global Enum $eScrDC = 0, $eMemDC, $eBitmap, $eWidth, $eHeight, $eGraphic, $eLast
$hDial = GUICreate("Clock", 200 * 2, 200 * 2, -1, -1, 0, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))
$label = GUICtrlCreateLabel ("mama myla ramu", 140, 130)
GUICtrlSetData($Label, 'dfghjk')
GUISetState()
; Initialize GDI+ library
_GDIPlus_Startup()
Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hDial)
; _GDIPlus_GraphicsDrawString($hGraphic, "Hello colored world", 140, 210, Default, Default, Default, 0xFF007F)
; Hook non client hit test message so we can move the clock
$aDial = ResourceInit()
_GDIPlus_GraphicsDrawEllipse($aDial[$eGraphic], 130, 100, 140, 70)
$label_1 = _GDIPlus_GraphicsDrawString($aDial[$eGraphic], "Hello world", 140, 110)
$label_2 = _GDIPlus_GraphicsDrawString($aDial[$eGraphic], "", 140, 130)
ResourceSet($aDial)
;ResourceDone($aDial)
Func ResourceInit()
Local $aInfo[$eLast + 1]
$aInfo[$eScrDC] = _WinAPI_GetDC(0)
$aInfo[$eMemDC] = _WinAPI_CreateCompatibleDC(_WinAPI_GetDC(0))
$aInfo[$eBitmap] = _WinAPI_CreateCompatibleBitmap($aInfo[$eScrDC], $iRadius * 2, $iRadius * 2)
_WinAPI_SelectObject($aInfo[$eMemDC], $aInfo[$eBitmap])
$aInfo[$eWidth] = $iRadius * 2
$aInfo[$eHeight] = $iRadius * 2
$aInfo[$eGraphic] = _GDIPlus_GraphicsCreateFromHDC($aInfo[$eMemDC])
; _GDIPlus_GraphicsFillRect($aInfo[$eGraphic], 0, 0, $iRadius * 2, $iRadius * 2)
Return $aInfo
EndFunc ;==>ResourceInit
Func ResourceSet($aInfo)
Local $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend
;If $iAlpha = -1 Then $iAlpha = $iOpacity
$tSize = DllStructCreate($tagSIZE)
$pSize = DllStructGetPtr($tSize)
DllStructSetData($tSize, "X", $iRadius * 2)
DllStructSetData($tSize, "Y", $iRadius * 2)
$tSource = DllStructCreate($tagPOINT)
$pSource = DllStructGetPtr($tSource)
$tBlend = DllStructCreate($tagBLENDFUNCTION)
$pBlend = DllStructGetPtr($tBlend)
DllStructSetData($tBlend, "Alpha", -1)
DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
_WinAPI_UpdateLayeredWindow($hDial, _WinAPI_GetDC(0), 0, $pSize, $aInfo[$eMemDC], $pSource, 0, $pBlend, $ULW_ALPHA)
EndFunc ;==>ResourceSet
While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend
Этот код работает, да. Но создавать аж 2 специальной функции для такой, на мой взгляд, не такой и сложной задачи кажется мне стрельбой из пушки по воробьям. Мне кажется, в Автоите должно найтись более простое средство для получения этого. Вопрос, какое? Вы не подскажете мне что-нибудь?