- Сообщения
- 5,379
- Репутация
- 2,724
AutoIt: 3.4.0.0
Версия: Prerelease
Категория: WinAPI
Описание: Я искал в MSDN кикие-либо функции для создания радиальных градиентов... и ничего не нашел. Пришлось самому написать. Что из этого получилось, можно увидеть ниже. Эта функция будет включена в библиотеку WinAPIEx.au3 при следующем обновлении (версия 2.3).
Код: Пример + Функция
Скриншот:
Источник: Yashied
Версия: Prerelease
Категория: WinAPI
Описание: Я искал в MSDN кикие-либо функции для создания радиальных градиентов... и ничего не нашел. Пришлось самому написать. Что из этого получилось, можно увидеть ниже. Эта функция будет включена в библиотеку WinAPIEx.au3 при следующем обновлении (версия 2.3).
Код: Пример + Функция
Код:
#Include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>
Opt('MustDeclareVars', 1)
Global Const $STM_SETIMAGE = 0x0172
Global Const $STM_GETIMAGE = 0x0173
Global $hForm, $Msg, $Pic, $hPic, $hObj, $hBitmap, $hDC, $hDestDC, $hDestSv
; Create GUI
$hForm = GUICreate('MyGUI', 400, 400)
$Pic = GUICtrlCreatePic('', 0, 0, 400, 400)
$hPic = GUICtrlGetHandle($Pic)
; Create gradient
$hDC = _WinAPI_GetDC($hPic)
$hDestDC = _WinAPI_CreateCompatibleDC($hDC)
$hBitmap = _WinAPI_CreateCompatibleBitmapEx($hDC, 400, 400, 0xFFFFFF)
$hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap)
For $i = 0 To 315 Step 45
_WinAPI_RadialGradientFill($hDestDC, 200, 200, 180, Random(0, 0xFFFFFF, 1), 0xFFFFFF, $i, $i + 45)
Next
_WinAPI_ReleaseDC($hPic, $hDC)
_WinAPI_SelectObject($hDestDC, $hDestSv)
_WinAPI_DeleteDC($hDestDC)
; Set gradient to control
_SendMessage($hPic, $STM_SETIMAGE, 0, $hBitmap)
$hObj = _SendMessage($hPic, $STM_GETIMAGE)
If $hObj <> $hBitmap Then
_WinAPI_FreeObject($hBitmap)
EndIf
GUISetState()
While 1
$Msg = GUIGetMsg()
Switch $Msg
Case $GUI_EVENT_CLOSE
ExitLoop
Case $GUI_EVENT_PRIMARYDOWN
EndSwitch
WEnd
; #FUNCTION# ====================================================================================================================
; Name...........: _WinAPI_RadialGradientFill
; Description....: Fills radial gradient.
; Syntax.........: _WinAPI_RadialGradientFill($hDC, $iX, $iY, $iRadius, $iRGB1, $iRGB2 [, $iAngleStart [, $iAngleEnd [, $iStep]]] )
; Parameters.....: $hDC - Handle to the destination device context.
; $iX - The x-coordinate of the central point, in logical units.
; $iY - The y-coordinate of the central point, in logical units.
; $iRadius - The circle radius to filling the gradient.
; $iRGB1 - The color information at the central point.
; $iRGB2 - The color information at the edges of circle.
; $iAngleStart - The angle to start filling at, in degree.
; $iAngleEnd - The angle to end filling at, in degree.
; $iStep - The gradient filling step in degree. The larger value of this parameter, the gradient will be
; better, but it's require more time, and vice versa.
; Return values..: Success - 1.
; Failure - 0 and sets the @error flag to non-zero.
; Author.........: Yashied
; Modified.......:
; Remarks........: This function does not fills gradient with transparency, and does not use antialiasing.
; Related........:
; Link...........: None
; Example........: Yes
; ===============================================================================================================================
Func _WinAPI_RadialGradientFill($hDC, $iX, $iY, $iRadius, $iRGB1, $iRGB2, $iAngleStart = 0, $iAngleEnd = 360, $iStep = 5)
Local $Val
If Abs($iAngleStart) > 360 Then
$iAngleStart = Mod($iAngleStart, 360)
EndIf
If Abs($iAngleEnd) > 360 Then
$iAngleEnd = Mod($iAngleEnd, 360)
EndIf
If ($iAngleStart < 0) Or ($iAngleEnd < 0) Then
$iAngleStart += 360
$iAngleEnd += 360
EndIf
If $iAngleStart > $iAngleEnd Then
$Val = $iAngleStart
$iAngleStart = $iAngleEnd
$iAngleEnd = $Val
EndIf
Local $K = 4 * ATan(1) / 180
Local $Xp = Round($iX + $iRadius * Cos($K * $iAngleStart))
Local $Yp = Round($iY - $iRadius * Sin($K * $iAngleStart))
Local $Xn, $Yn, $An = $iAngleStart
Local $Vertex[3][3]
While $An < $iAngleEnd
$An += $iStep
If $An > $iAngleEnd Then
$An = $iAngleEnd
EndIf
$Xn = Round($iX + $iRadius * Cos($K * $An))
$Yn = Round($iY - $iRadius * Sin($K * $An))
$Vertex[0][0] = $iX
$Vertex[0][1] = $iY
$Vertex[0][2] = $iRGB1
$Vertex[1][0] = $Xp
$Vertex[1][1] = $Yp
$Vertex[1][2] = $iRGB2
$Vertex[2][0] = $Xn
$Vertex[2][1] = $Yn
$Vertex[2][2] = $iRGB2
If Not _WinAPI_GradientFill($hDC, $Vertex, 0, 2) Then
Return SetError(1, 0, 0)
EndIf
$Xp = $Xn
$Yp = $Yn
WEnd
Return 1
EndFunc ;==>_WinAPI_RadialGradientFill
Скриншот:
Источник: Yashied