Что нового

Помогите создать градиент

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Хотел создать градиент как в примере Yashied'a к функции _WinAPI_GradientFill,
но видимо я что-то делаю не правильно. Не могу понять что! :smile:

Код:
#include <WinAPI.au3>
#include <WinAPIEx.au3>
#include <SendMessage.au3>

Global Const $STM_SETIMAGE = 0x0172
Global Const $STM_GETIMAGE = 0x0173

$hGUI = GUICreate("Test",400,300)
GUICtrlCreateGradient($hGUI,30,0x000033)
GUISetState()

Do
Until GUIGetMsg() = -3

Func GUICtrlCreateGradient($hGUI,$iHeight,$iColor)

	Local $aVertex[2][3] = [[0, 0, 0xFFFFFF], [0, $iHeight, $iColor]]
	Local $aClientSize, $hPic, $hDC, $hDestDC, $hBitmap, $hDestSv, $hObj

	$aClientSize = WinGetClientSize($hGUI)
	$hPic = GUICtrlCreatePic("",0,0,$aClientSize[0],$iHeight)

	$hDC = _WinAPI_GetDC($hPic)
	$hDestDC = _WinAPI_CreateCompatibleDC($hDC)
	$hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, 400, 400)
	$hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap)
	_WinAPI_GradientFill($hDestDC, $aVertex, 0)

	_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_DeleteObject($hBitmap)
	EndIf

EndFunc


Помогите, кто чем может :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Я просто поправил в твоем коде то, что было неправильно, надеюсь ты разберешься.

Код:
#Include <WinAPIEx.au3>

Global Const $STM_SETIMAGE = 0x0172
Global Const $STM_GETIMAGE = 0x0173

$hGUI = GUICreate("Test", 400, 300)
GUICtrlCreateGradient($hGUI, 30, 0x000033)
GUISetState()

Do
Until GUIGetMsg() = -3

Func GUICtrlCreateGradient($hGUI, $iHeight, $iColor)

	Local $aVertex, $aClientSize, $hPic, $hDC, $hDestDC, $hBitmap, $hDestSv, $hObj

	$aClientSize = WinGetClientSize($hGUI)
	$Pic = GUICtrlCreatePic("", 0, 0, $aClientSize[0], $iHeight)
	$hPic = GUICtrlGetHandle(-1)

	Dim $aVertex[2][3] = [[0, 0, 0xFFFFFF],[ $aClientSize[0], $iHeight, $iColor]]

	$hDC = _WinAPI_GetDC($hPic)
	$hDestDC = _WinAPI_CreateCompatibleDC($hDC)
	$hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $aClientSize[0], $iHeight)
	$hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap)
	_WinAPI_GradientFill($hDestDC, $aVertex)

	_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_DeleteObject($hBitmap)
	EndIf

EndFunc   ;==>GUICtrlCreateGradient


Некоторые пояснения:

1. Все WinAPI функции на входе воспринимают только хендлы объектов, а не ID, которые возвращают GUICtrlCreate... функции.

2. Для того, чтобы создать прямоугольный градиент с размерами {x1; y1} - {x2; y2} (левая верхняя и правая нижняя точки соответственно), нужно в функцию _WinAPI_GradientFill() передать массив с этими точками + цвет для каждой точки (для треугольного градиента нужно уже три точки и три цвета).

$aVertex[0][0] = $x1
$aVertex[0][1] = $y1
$aVertex[0][2] = $color1

$aVertex[1][0] = $x2
$aVertex[1][1] = $y2
$aVertex[1][2] = $color2

В этом случае, градиент нарисуется от точки 1 до точки 2 с переходом цвета от color1 до color2. По умолчанию, градиент рисуется с верху вниз (вертикальный), если параметр $fRotate (пятый в этой функции) выставить в 1, то получится горизонтальный градиент.
 
Автор
SECTOR

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Yashied, спасибо!
Вот уж не думал, что всё так просто :smile:

:IL_AutoIt_1: :IL_AutoIt_1: :IL_AutoIt_1:
 
Верх