taz742 Posted December 4, 2008 Share Posted December 4, 2008 (edited) I've play with GDIPlus User fonction and finally I wrote this one from other.It fill a Pic Control with a gradient color linear or not.Capture:expandcollapse popup#include <GDIPlus.au3> #include <GuiConstants.au3> #include <WindowsConstants.au3> $hGui = GUICreate("Pic Gradients", 670, 450) GUISetState() Global $picW = 100, $picH = 100 Dim $aBlends3[3] = [0xFFFFFFFF, 0xFFAA0000, 0xFF000000];3 colors gradient set Dim $aBlends4[4] = [0xFF00FF00, 0xFFFFFF00, 0xFF00FFFF, 0xFFFF0000];4 colors gradient set Dim $aPositions3[3] = [0, 0.8, 1];custom positions array for 3 colors Dim $aPositions4[4] = [0, 0.2, 0.4, 1]; custom positions array for 4 colors $Pic1 = GUICtrlCreatePic("", 10+($picW+10)*0, 10+($picH+10)*0, $picW, $picH) $Pic2 = GUICtrlCreatePic("", 10+($picW+10)*1, 10+($picH+10)*0, $picW, $picH) $Pic3 = GUICtrlCreatePic("", 10+($picW+10)*0, 10+($picH+10)*1, $picW, $picH) $Pic4 = GUICtrlCreatePic("", 10+($picW+10)*1, 10+($picH+10)*1, $picW, $picH) _GDIPlus_PicSetGradient($Pic1, $aBlends3, 0x00000000);Linear Gradient Horizontal 3 colors _GDIPlus_PicSetGradient($Pic2, $aBlends3, 0x00000001);Linear Gradient Vertical 3 colors _GDIPlus_PicSetGradient($Pic3, $aBlends3, 0x00000002);Linear Gradient ForwardDiagonal 3 colors _GDIPlus_PicSetGradient($Pic4, $aBlends3, 0x00000003);Linear Gradient BackwardDiagonal 3 colors $Pic5 = GUICtrlCreatePic("", 10+($picW+10)*3, 10+($picH+10)*0, $picW, $picH) $Pic6 = GUICtrlCreatePic("", 10+($picW+10)*4, 10+($picH+10)*0, $picW, $picH) $Pic7 = GUICtrlCreatePic("", 10+($picW+10)*3, 10+($picH+10)*1, $picW, $picH) $Pic8 = GUICtrlCreatePic("", 10+($picW+10)*4, 10+($picH+10)*1, $picW, $picH) _GDIPlus_PicSetGradient($Pic5, $aBlends3, 0x00000000, $aPositions3);Custom Gradient Horizontal 3 colors _GDIPlus_PicSetGradient($Pic6, $aBlends3, 0x00000001, $aPositions3);Custom Gradient Vertical 3 colors _GDIPlus_PicSetGradient($Pic7, $aBlends3, 0x00000002, $aPositions3);Custom Gradient ForwardDiagonal 3 colors _GDIPlus_PicSetGradient($Pic8, $aBlends3, 0x00000003, $aPositions3);Custom Gradient BackwardDiagonal 3 colors $Pic9 = GUICtrlCreatePic("", 10+($picW+10)*0, 10+($picH+10)*2, $picW, $picH) $Pic10 = GUICtrlCreatePic("", 10+($picW+10)*1, 10+($picH+10)*2, $picW, $picH) $Pic11 = GUICtrlCreatePic("", 10+($picW+10)*0, 10+($picH+10)*3, $picW, $picH) $Pic12 = GUICtrlCreatePic("", 10+($picW+10)*1, 10+($picH+10)*3, $picW, $picH) _GDIPlus_PicSetGradient($Pic9, $aBlends4, 0x00000000);Linear Gradient Horizontal 4 colors _GDIPlus_PicSetGradient($Pic10, $aBlends4, 0x00000001);Linear Gradient Vertical 4 colors _GDIPlus_PicSetGradient($Pic11, $aBlends4, 0x00000002);Linear Gradient ForwardDiagonal 4 colors _GDIPlus_PicSetGradient($Pic12, $aBlends4, 0x00000003);Linear Gradient BackwardDiagonal 4 colors $Pic13 = GUICtrlCreatePic("", 10+($picW+10)*3, 10+($picH+10)*2, $picW, $picH) $Pic14 = GUICtrlCreatePic("", 10+($picW+10)*4, 10+($picH+10)*2, $picW, $picH) $Pic15 = GUICtrlCreatePic("", 10+($picW+10)*3, 10+($picH+10)*3, $picW, $picH) $Pic16 = GUICtrlCreatePic("", 10+($picW+10)*4, 10+($picH+10)*3, $picW, $picH) _GDIPlus_PicSetGradient($Pic13, $aBlends4, 0x00000000, $aPositions4);Custom Gradient Horizontal 4 colors _GDIPlus_PicSetGradient($Pic14, $aBlends4, 0x00000001, $aPositions4);Custom Gradient Vertical 4 colors _GDIPlus_PicSetGradient($Pic15, $aBlends4, 0x00000002, $aPositions4);Custom Gradient ForwardDiagonal 4 colors _GDIPlus_PicSetGradient($Pic16, $aBlends4, 0x00000003, $aPositions4);Custom Gradient BackwardDiagonal 4 colors Do Sleep(25) Until GUIGetMsg() = $GUI_EVENT_CLOSE ;==== _GDIPlus_PicSetGradient === Taz742 function ; Description - Fill a Pic control with linear or custom gradient from a set of boundary points and boundary colors. ; =========== ; $cID - Pic ControlID ; ; $aBlend - Pointer to an array of ARGB colors that specify the colors to be interpolated ; for this linear gradient brush. A color of a given index in the blend array ; corresponds to the blend position of that same index in the positions array. ; ; $iDirection - {Opt} GradientHorizontal = 0x00000000 <Default> ; GradientVertical = 0x00000001 ; GradientForwardDiagonal = 0x00000002 ; GradientBackwardDiagonal = 0x00000003 ; ; $aPositions - {Opt} If non-array or non specified, a linear array will be internaly created. ; Pointer to an array of real numbers that specify blend factors' positions. Each number in the array ; indicates a percentage of the distance between the starting boundary and the ending boundary ; and is in the range from 0.0 through 1.0, where 0.0 indicates the starting boundary of the ; gradient and 1.0 indicates the ending boundary. There must be at least two positions ; specified: the first position, which is always 0.0, and the last position, which is always ; 1.0. Otherwise, the behavior is undefined. A blend position between 0.0 and 1.0 indicates a ; line, parallel to the boundary lines, that is a certain fraction of the distance from the ; starting boundary to the ending boundary. For example, a blend position of 0.7 indicates ; the line that is 70 percent of the distance from the starting boundary to the ending boundary. ; ; Requirement: #include <GDIPlus.au3> ;============= _GDIPlus_CreateLineBrushFromRect() ; _GDIPlus_SetLinePresetBlend() ;================================================= Func _GDIPlus_PicSetGradient($cID, $aBlends, $iDirection = 0x00000000, $aPositions = "") If Not IsArray($aBlends) Then Dim $aBlends[2] = [0xFFFFFFFF, 0xFF000000] If Not IsArray($aPositions) Then Local $BlendsDim = UBound($aBlends) Dim $aPositions[$BlendsDim] For $i=0 To $BlendsDim -1 $aPositions[$i] = 1/($BlendsDim-1)*$i Next EndIf Local Const $STM_SETIMAGE = 0x0172 Local Const $IMAGE_BITMAP = 0 Local $hWnd, $cID_Pos, $hBitmap, $hImage, $hGraphic, $hBrushLin, $hbmp, $aBmp $hWnd = GUICtrlGetHandle($cID) $cID_Pos = ControlGetPos("", "", $hWnd) $hBitmap = _WinAPI_CreateBitmap($cID_Pos[2], $cID_Pos[3], 1, 32) _GDIPlus_Startup() $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap) $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage) $hBrushLin = _GDIPlus_CreateLineBrushFromRect(0, 0, $cID_Pos[2], $cID_Pos[3], $aPositions, $aPositions, $aBlends[0], $aBlends[UBound($aBlends)-1], $iDirection) _GDIPlus_SetLinePresetBlend($hBrushLin, $aBlends, $aPositions) _GDIPlus_GraphicsFillRect($hGraphic, 0, 0, $cID_Pos[2], $cID_Pos[3], $hBrushLin) $hbmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage) $aBmp = DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hWnd, "int", $STM_SETIMAGE, "int", $IMAGE_BITMAP, "int", $hbmp) If $aBmp[0] <> 0 Then _WinAPI_DeleteObject($aBmp[0]) _GDIPlus_ImageDispose($hImage) _GDIPlus_BrushDispose($hBrushLin) _GDIPlus_GraphicsDispose($hGraphic) _WinAPI_DeleteObject($hbmp) _WinAPI_DeleteObject($hBitmap) _GDIPlus_Shutdown() EndFunc ;==>_GDIPlus_PicSetGradient ;====_GDIPlus_CreateLineBrushFromRect === Malkey's function ;Description - Creates a LinearGradientBrush object from a set of boundary points and boundary colors. ; $aFactors - If non-array, default array will be used. ; Pointer to an array of real numbers that specify blend factors. Each number in the array ; specifies a percentage of the ending color and should be in the range from 0.0 through 1.0. ;$aPositions - If non-array, default array will be used. ; Pointer to an array of real numbers that specify blend factors' positions. Each number in the array ; indicates a percentage of the distance between the starting boundary and the ending boundary ; and is in the range from 0.0 through 1.0, where 0.0 indicates the starting boundary of the ; gradient and 1.0 indicates the ending boundary. There must be at least two positions ; specified: the first position, which is always 0.0, and the last position, which is always ; 1.0. Otherwise, the behavior is undefined. A blend position between 0.0 and 1.0 indicates a ; line, parallel to the boundary lines, that is a certain fraction of the distance from the ; starting boundary to the ending boundary. For example, a blend position of 0.7 indicates ; the line that is 70 percent of the distance from the starting boundary to the ending boundary. ; The color is constant on lines that are parallel to the boundary lines. ; $iArgb1 - First Top color in 0xAARRGGBB format ; $iArgb2 - Second color in 0xAARRGGBB format ; $LinearGradientMode - LinearGradientModeHorizontal = 0x00000000, ; LinearGradientModeVertical = 0x00000001, ; LinearGradientModeForwardDiagonal = 0x00000002, ; LinearGradientModeBackwardDiagonal = 0x00000003 ; $WrapMode - WrapModeTile = 0, ; WrapModeTileFlipX = 1, ; WrapModeTileFlipY = 2, ; WrapModeTileFlipXY = 3, ; WrapModeClamp = 4 ; GdipCreateLineBrushFromRect(GDIPCONST GpRectF* rect, ARGB color1, ARGB color2, ; LinearGradientMode mode, GpWrapMode wrapMode, GpLineGradient **lineGradient) ; Reference: http://msdn.microsoft.com/en-us/library/ms534043(VS.85).aspx Func _GDIPlus_CreateLineBrushFromRect($iX, $iY, $iWidth, $iHeight, $aFactors, $aPositions, _ $iArgb1 = 0xFF0000FF, $iArgb2 = 0xFFFF0000, $LinearGradientMode = 0x00000001, $WrapMode = 0) Local $tRect, $pRect, $aRet, $tFactors, $pFactors, $tPositions, $pPositions, $iCount If $iArgb1 = Default Then $iArgb1 = 0xFF0000FF If $iArgb2 = Default Then $iArgb2 = 0xFFFF0000 If $LinearGradientMode = -1 Or $LinearGradientMode = Default Then $LinearGradientMode = 0x00000001 If $WrapMode = -1 Or $LinearGradientMode = Default Then $WrapMode = 1 $tRect = DllStructCreate("float X;float Y;float Width;float Height") $pRect = DllStructGetPtr($tRect) DllStructSetData($tRect, "X", $iX) DllStructSetData($tRect, "Y", $iY) DllStructSetData($tRect, "Width", $iWidth) DllStructSetData($tRect, "Height", $iHeight) ;Note: Withn _GDIPlus_Startup(), $ghGDIPDll is defined $aRet = DllCall($ghGDIPDll, "int", "GdipCreateLineBrushFromRect", "ptr", $pRect, "int", $iArgb1, _ "int", $iArgb2, "int", $LinearGradientMode, "int", $WrapMode, "int*", 0) If IsArray($aFactors) = 0 Then Dim $aFactors[4] = [0.0, 0.4, 0.6, 1.0] If IsArray($aPositions) = 0 Then Dim $aPositions[4] = [0.0, 0.3, 0.7, 1.0] $iCount = UBound($aPositions) $tFactors = DllStructCreate("float[" & $iCount & "]") $pFactors = DllStructGetPtr($tFactors) For $iI = 0 To $iCount - 1 DllStructSetData($tFactors, 1, $aFactors[$iI], $iI + 1) Next $tPositions = DllStructCreate("float[" & $iCount & "]") $pPositions = DllStructGetPtr($tPositions) For $iI = 0 To $iCount - 1 DllStructSetData($tPositions, 1, $aPositions[$iI], $iI + 1) Next $hStatus = DllCall($ghGDIPDll, "int", "GdipSetLineBlend", "hwnd", $aRet[6], _ "ptr", $pFactors, "ptr", $pPositions, "int", $iCount) Return $aRet[6] ; Handle of Line Brush EndFunc ;==>_GDIPlus_CreateLineBrushFromRect ;=========================================================== ; Description: Sets the colors to be interpolated for this linear gradient brush and their ; corresponding blend positions. ; Parameters ; $hBrush [in] Pointer to the LinearGradientBrush object. ; $aBlend [in] Pointer to an array of ARGB colors that specify the colors to be interpolated ; for this linear gradient brush. A color of a given index in the blend array ; corresponds to the blend position of that same index in the positions array. ; $aPositions [in] Pointer to an array of real numbers that specify the blend positions. ; Each number in the array specifies a percentage of the distance between ; the starting boundary and the ending boundary and is in the range from ; 0.0 through 1.0, where 0.0 indicates the starting boundary of the gradient ; and 1.0 indicates the ending boundary. There must be at least two positions ; specified: the first position, which is always 0.0f, and the last position, ; which is always 1.0f. Otherwise, the behavior is undefined. A blend position ; between 0.0 and 1.0 indicates the line, parallel to the boundary lines, ; that is a certain fraction of the distance from the starting boundary to the ; ending boundary. For example, a blend position of 0.7 indicates the line that ; is 70 percent of the distance from the starting boundary to the ending boundary. ; The color is constant on lines that are parallel to the boundary lines. ; GdipSetLinePresetBlend(GpLineGradient *brush, GDIPCONST ARGB *blend, GDIPCONST REAL* positions, INT count) ; Reference: http://msdn.microsoft.com/en-us/library/ms534043(VS.85).aspx Func _GDIPlus_SetLinePresetBlend($hBrush, $aBlend = 0, $aPositions = 0) Local $iCount, $tBlend, $pBlend, $tPositions, $pPositions, $hStatus, $res ; Red, Yellow, Green, Blue If IsArray($aBlend) = 0 Then Dim $aBlend[4] = [0xFFFF0000, 0xffffff00, 0xFF00FF00, 0xFF0000FF] If IsArray($aPositions) = 0 Then Dim $aPositions[4] = [0.0, 0.3, 0.7, 1.0] $iCount = UBound($aPositions) $tBlend = DllStructCreate("int[" & $iCount & "]") $pBlend = DllStructGetPtr($tBlend) For $iI = 0 To $iCount - 1 DllStructSetData($tBlend, 1, $aBlend[$iI], $iI + 1) Next $tPositions = DllStructCreate("float[" & $iCount & "]") $pPositions = DllStructGetPtr($tPositions) For $iI = 0 To $iCount - 1 DllStructSetData($tPositions, 1, $aPositions[$iI], $iI + 1) Next $hStatus = DllCall($ghGDIPDll, "int", "GdipSetLinePresetBlend", "hwnd", $hBrush, _ "int", $pBlend, "ptr", $pPositions, "int", $iCount) Return EndFunc ;==>_GDIPlus_SetLinePresetBlend Edited December 5, 2008 by taz742 Link to comment Share on other sites More sharing options...
torels Posted December 4, 2008 Share Posted December 4, 2008 very well done! Some Projects:[list][*]ZIP UDF using no external files[*]iPod Music Transfer [*]iTunes UDF - fully integrate iTunes with au3[*]iTunes info (taskbar player hover)[*]Instant Run - run scripts without saving them before :)[*]Get Tube - YouTube Downloader[*]Lyric Finder 2 - Find Lyrics to any of your song[*]DeskBox - A Desktop Extension Tool[/list]indifference will ruin the world, but in the end... WHO CARES :P---------------http://torels.altervista.org Link to comment Share on other sites More sharing options...
sbgwb0769 Posted December 5, 2008 Share Posted December 5, 2008 very well done! Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now