Автор Тема: _WinAPI_RadialGradientFill() - Создание радиальных градиентов  (Прочитано 3285 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
AutoIt: 3.4.0.0
Версия: Prerelease

Категория: WinAPI

Описание: Я искал в MSDN кикие-либо функции для создания радиальных градиентов... и ничего не нашел. Пришлось самому написать. Что из этого получилось, можно увидеть ниже. Эта функция будет включена в библиотеку WinAPIEx.au3 при следующем обновлении (версия 2.3).

Код: Пример + Функция
(нажмите для показа/скрытия)

Скриншот:


Источник: Yashied
« Последнее редактирование: Март 31, 2010, 19:28:59 от Yashied »


Думай, прежде чем говорить.

Русское сообщество AutoIt


Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 4003
  • Репутация: 960
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Yashied
Супер!  :thumbs_up:

Скорблю и помню.




Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Спасибо.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Вот тоже самое, но с использованием GDI+. Здесь градиент уже может быть полупрозрачным. Красота!

Код: AutoIt [Выделить]
#Include <GDIP.au3>
#Include <WinAPI.au3>


_GDIPlus_Startup()

GUICreate('MyGUI', 800, 600)
$Pic = GUICtrlCreatePic('', 0, 0, 800, 600)
$hPic = GUICtrlGetHandle(-1)

$hBitmap = _WinAPI_CreateBitmap(800, 600, 1, 32)
$hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
_WinAPI_DeleteObject($hBitmap)
$hGraphics = _GDIPlus_ImageGetGraphicsContext($hImage)
$hBitmap = _GDIPlus_ImageLoadFromFile(@WindowsDir & '\Web\Wallpaper\Ascent.jpg')
_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, 800, 600)
_GDIPlus_ImageDispose($hBitmap)
_GDIPlus_GraphicsDrawRadialGradient($hGraphics, 800, 0, 600, 0xFFFF0000, 0, 45, 180)
_GDIPlus_GraphicsDrawRadialGradient($hGraphics, 310, 130, 100, 0xFF00FFFF, 0)
_GDIPlus_GraphicsDrawRadialGradient($hGraphics, 414, 314, 100, 0xFFFFFF00, 0)
_GDIPlus_GraphicsDrawRadialGradient($hGraphics, 550, 470, 100, 0xFF00FF00, 0)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_ImageDispose($hImage)

$hObj = _SendMessage($hPic, 0x0172, 0, $hBitmap)
If $hObj Then
    _WinAPI_DeleteObject($hObj)
EndIf

GUISetState()

Do
Until GUIGetMsg() = -3

_GDIPlus_Shutdown()

Func _GDIPlus_GraphicsDrawRadialGradient($hGraphics, $iX, $iY, $iRadius, $iARGB1, $iARGB2, $iStartAngle = 0, $iEndAngle = 360, $iStep = 5)

    If $iStep < 1 Then
        $iStep = 1
    EndIf

    Local $Xi = $iX - $iRadius, $Yi = $iY - $iRadius, $Di = 2 * $iRadius
    Local $hBrush, $hMatrix, $Smooth = _GDIPlus_GraphicsGetSmoothingMode($hGraphics)
    Local $Start = True

    _GDIPlus_GraphicsSetSmoothingMode($hGraphics, 0)
    $hBrush = _GDIPlus_LineBrushCreate(0, 0, $iRadius, 0, $iARGB1, $iARGB2, 3)
    $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixTranslate($hMatrix, $iX, $iY)
    While $iStartAngle < $iEndAngle
        If $iStartAngle + $iStep > $iEndAngle Then
            $iStep = $iEndAngle - $iStartAngle
        EndIf
        If $Start Then
            _GDIPlus_MatrixRotate($hMatrix, $iStartAngle + $iStep / 2)
            $Start = False
        Else
            _GDIPlus_MatrixRotate($hMatrix, $iStep)
        EndIf
        _GDIPlus_LineBrushSetTransform($hBrush, $hMatrix)
        _GDIPlus_GraphicsFillPie($hGraphics, $Xi, $Yi, $Di, $Di, $iStartAngle, $iStep, $hBrush)
        $iStartAngle += $iStep
    WEnd
    _GDIPlus_GraphicsSetSmoothingMode($hGraphics, $Smooth)
    _GDIPlus_MatrixDispose($hMatrix)
    _GDIPlus_BrushDispose($hBrush)
    Return 1
EndFunc   ;==>_GDIPlus_GraphicsDrawRadialGradient


GDIP.au3

Русское сообщество AutoIt

Re: _WinAPI_RadialGradientFill() - Создание радиальных градиентов
« Ответ #3 Отправлен: Март 25, 2010, 03:20:46 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Тема закрыта, поскольку данная функция присутствует в библиотеке WinAPIEx.au3 v2.3 и дальнейшее обсуждение здесь является бессмысленным.

Русское сообщество AutoIt

Re: _WinAPI_RadialGradientFill() - Создание радиальных градиентов
« Ответ #4 Отправлен: Март 29, 2010, 02:10:38 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
0 Ответов
3550 Просмотров
Последний ответ Октябрь 20, 2009, 02:01:08
от Yashied
14 Ответов
8270 Просмотров
Последний ответ Июль 13, 2010, 22:07:56
от Can
1 Ответов
3326 Просмотров
Последний ответ Июль 26, 2010, 17:44:29
от Yashied
3 Ответов
4834 Просмотров
Последний ответ Октябрь 04, 2010, 02:42:50
от Kaster
3 Ответов
2902 Просмотров
Последний ответ Октябрь 10, 2010, 17:46:33
от Belfigor
4 Ответов
3592 Просмотров
Последний ответ Октябрь 13, 2010, 13:12:45
от Redline
5 Ответов
4383 Просмотров
Последний ответ Ноябрь 21, 2010, 03:49:02
от Yashied
1 Ответов
3013 Просмотров
Последний ответ Декабрь 26, 2010, 00:38:07
от Yashied
6 Ответов
4729 Просмотров
Последний ответ Январь 12, 2011, 17:44:16
от serzzz
4 Ответов
3303 Просмотров
Последний ответ Февраль 13, 2011, 12:46:08
от AZJIO