haijie1223 发表于 2011-8-22 12:18:39

GDI效果

gdi特效:

#include <GUIConstantsEx.au3>
#include <GDIPlus.au3>
#include <WindowsConstants.au3>
#include <WINAPI.au3>
#include <Color.au3>
commonbck()
HotKeySet("{esc}","quiter")
Func commonbck()
    $mainwidth=560
    $mainheight=250
    $Gui = GUICreate("", $mainwidth,$mainheight,-1,-1, $WS_POPUP, $WS_EX_TOOLWINDOW)
    $Pic = GUICtrlCreatePic("", 0, 0, $mainwidth, $mainheight)
    GUICtrlSetState(-1, $GUI_DISABLE)
    _mainbackground(-1,$mainwidth,$mainheight,"metal_small.jpg")
    $bckpic= GUICtrlCreatePic("",25,12,150, 150)
    GuiCtrlSetState(-1,$GUI_DISABLE)
    background(-1,"0xBB000000","0x880000FF","6","10") ; blue
    $bckpic2= GUICtrlCreatePic("",25,170,280, 70)
    GuiCtrlSetState(-1,$GUI_DISABLE)
    background(-1,"0xFF660000","0x88220000","14","6") ;red
    $bckpic3= GUICtrlCreatePic("",180,15,120, 40)
    GuiCtrlSetState(-1,$GUI_DISABLE)
    background(-1,"0x8800AA00","0x88003300","4","16") ; green
   
    $bckshadow= GUICtrlCreatePic("",320,10,120, 70)
    GuiCtrlSetState(-1,$GUI_DISABLE)
    fadebackground(-1,"0x000033","0x000099","21","17","12")
   
    $bckshadow2= GUICtrlCreatePic("",320,90,120, 60)
    GuiCtrlSetState(-1,$GUI_DISABLE)
    fadebackground(-1,"0xCCCC00","0x555500","33","10","8")
      
    $bckshadow3= GUICtrlCreatePic("",320,160,120, 80)
    GuiCtrlSetState(-1,$GUI_DISABLE)
   fadebackground2(-1,"0xCCCC00","55","30","8")
    $bckshadow3= GUICtrlCreatePic("",440,165,100, 70)
    GuiCtrlSetState(-1,$GUI_DISABLE)
   fadebackground2(-1,"0x550000","66","30","0")
   
    $round= GUICtrlCreatePic("",500,12,50, 50)
    GuiCtrlSetState(-1,$GUI_DISABLE)
    background(-1,"0xDD000000","0x880000FF","10","16") ; blue
    GUISetState()

EndFunc

While 1
sleep(50)
      $msg = GUIGetMsg()
      Select
            Case $msg = $GUI_EVENT_CLOSE
                Exit
      EndSelect
WEnd

func _mainbackground($guicontrol,$reqwidth,$reqheight,$picname="")
    _GDIPlus_Startup()
    Local $hImage1 = _GDIPlus_ImageLoadFromFile($picname)
    Local $iX1 = _GDIPlus_ImageGetWidth($hImage1)+15
    Local $hBitmap = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $reqwidth, "int", $reqheight, "int", 0, "int",0x0026200A, "ptr", 0, "int*", 0)
    $hBitmap = $hBitmap
    Local $hCtx = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    For $i = 0 To $reqwidth Step $iX1
      _GDIPlus_GraphicsDrawImage($hCtx, $hImage1, $i, 0)
    Next
    _GDIPlus_GraphicsDrawborder($hCtx, 0, 0, $reqwidth, $reqheight, 6,"AA",0x000011,10)
    Local $hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _GDIPlus_ImageDispose($hImage1)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hCtx)
    Local Const $STM_SETIMAGE = 0x0172
    _WinAPI_DeleteObject(GUICtrlSendMsg($guicontrol, $STM_SETIMAGE, 0, $hBmp))
    _WinAPI_DeleteObject($hBmp)
    _GDIPlus_Shutdown ()
EndFunc

Func _GDIPlus_GraphicsDrawborder($hGraphics, $iX, $iY, $iWidth, $iHeight, $iRadius, $hPen, $colour, $thick)
    $transpen=_GDIPlus_PenCreate(BitOR("0x"&$hPen&"000000",$colour),1)
    for $r=0 to $thick
      _GDIPlus_GraphicsDrawLine($hGraphics, $iX+$thick+1, $iY+$r, $iX + $iWidth-$thick-1, $iY+$r,$transpen) ; top
      _GDIPlus_GraphicsdrawLine($hGraphics, $iX + $iWidth-$r, $iY, $iX + $iWidth-$r, $iY + $iHeight,$transpen) ;right
      _GDIPlus_GraphicsdrawLine($hGraphics, $iX + $iWidth-$thick-1, $iY + $iHeight-$r, $iX+$thick+1, $iY + $iHeight-$r,$transpen) ;bottom
      _GDIPlus_GraphicsdrawLine($hGraphics, $iX+$r, $iY + $iHeight, $iX+$r, $iY,$transpen) ;left
      _GDIPlus_PenDispose($hPen)
    Next
EndFunc



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
func background($control,$col1,$col2,$deep,$cornered)
    _GDIPlus_Startup ()
    $hwd=GUICtrlGetHandle($control)
    ;$guiname=_WinAPI_GetParent($hwd)
    $width=_WinAPI_GetClientWidth($hwd)
    $height=_WinAPI_GetClientHeight($hwd)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hwd)
    $hBitmap1 = _GDIPlus_BitmapCreateFromGraphics($width,$height, $hGraphic)
    $hBitmap1=_drawborder($hBitmap1,$col1,$col2,$deep,$cornered)
    $hImage1 = _GDIPlus_ImageGetGraphicsContext($hBitmap1)
    _GDIPlus_GraphicsSetSmoothingMode($hImage1, 2)
    $hBMP1 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap1)
   _WinAPI_DeleteObject(GUICtrlSendMsg($control, 0x0172, 0, $hBMP1))
    _GDIPlus_ImageDispose ($hImage1)
    _WinAPI_DeleteObject($hBMP1)
    _WinAPI_DeleteObject($hBitmap1)
    _GDIPlus_GraphicsDispose ($hGraphic)
    _GDIPlus_Shutdown ()
EndFunc

;handler, to draw background and createbutton3
Func _drawborder($hBitmap, $colour1, $colour2, $depth, $corner) ;this is for normal buttons
    $gwt = _GDIPlus_ImageGetWidth($hBitmap) - 1
    $ght = _GDIPlus_ImageGetHeight($hBitmap) - 1
    $hGraphics = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    Local $bGammaCorrection = False
    Global $hBrush1 = _GDIPlus_BrushCreateSolid($colour1)
    Global $hBrush = _GDIPlus_BrushCreateSolid($colour2)
    _GDIPlus_GraphicsSetSmoothingMode($hGraphics, 4)
      _GDIPlus_GraphicsDrawRoundRect($hGraphics, 0, 0, $gwt, $ght, $corner, $hBrush)
      _GDIPlus_GraphicsDrawRoundRect($hGraphics, $depth, $depth, $gwt - ($depth * 2), $ght - ($depth * 2), $corner - 2, $hBrush1)

    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_BrushDispose($hBrush1)

    _GDIPlus_GraphicsDispose($hGraphics)
    Return $hBitmap
EndFunc ;==>_drawborder


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
func fadebackground($control,$col1,$col2,$faded,$deep,$cornered)
    _GDIPlus_Startup ()
    $hwd=GUICtrlGetHandle($control)
    ;$guiname=_WinAPI_GetParent($hwd)
    $width=_WinAPI_GetClientWidth($hwd)
    $height=_WinAPI_GetClientHeight($hwd)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hwd)
    $hBitmap1 = _GDIPlus_BitmapCreateFromGraphics($width,$height, $hGraphic)
    $hBitmap1=_fadeborder($hBitmap1,$col1,$col2, $faded, $deep,$cornered)
    $hImage1 = _GDIPlus_ImageGetGraphicsContext($hBitmap1)
    _GDIPlus_GraphicsSetSmoothingMode($hImage1, 2)
    $hBMP1 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap1)
   _WinAPI_DeleteObject(GUICtrlSendMsg($control, 0x0172, 0, $hBMP1))
    _GDIPlus_ImageDispose ($hImage1)
    _WinAPI_DeleteObject($hBMP1)
    _WinAPI_DeleteObject($hBitmap1)
    _GDIPlus_GraphicsDispose ($hGraphic)
    _GDIPlus_Shutdown ()
EndFunc

Func _fadeborder($hBitmap, $col1,$col2, $faded, $depth, $corner)
    $gwt = _GDIPlus_ImageGetWidth($hBitmap)
    $ght = _GDIPlus_ImageGetHeight($hBitmap)

    $hGraphics = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    Local $bGammaCorrection = False
    _GDIPlus_GraphicsSetSmoothingMode($hGraphics, 4)
    $f = _GUICtrlCreateGradient($col1,$col2,$depth)

For $i=0 To $depth
    $iC1 = StringReplace($f[$i], "0x", "0x"&$faded)
   Global $hBrush = _GDIPlus_BrushCreateSolid($iC1)
   GDIPlus_SetLineGammaCorrection($hBrush, $bGammaCorrection)
      _GDIPlus_GraphicsDrawRoundRect($hGraphics, $i, $i, $gwt-($i*2), $ght-($i*2), $corner, $hBrush)
    _GDIPlus_BrushDispose($hBrush)
Next
    _GDIPlus_GraphicsDispose($hGraphics)
    Return $hBitmap
EndFunc

Func _GUICtrlCreateGradient($col1,$col2,$depth2)
    Local $color1R = _ColorGetRed($col1)
    Local $color1G = _ColorGetGreen($col1)
    Local $color1B = _ColorGetBlue($col1)

    Local $nStepR = (_ColorGetRed($col2) - $color1R) / $depth2
    Local $nStepG = (_ColorGetGreen($col2) - $color1G) / $depth2
    Local $nStepB = (_ColorGetBlue($col2) - $color1B) / $depth2
dim $colours[$depth2+1]

    For $i = 0 To $depth2
      $colours[$i] = "0x" & StringFormat("%02X%02X%02X", $color1R+$nStepR*$i, $color1G+$nStepG*$i, $color1B+$nStepB*$i)
    Next
    Return $colours
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
func fadebackground2($control,$col1,$faded,$deep,$cornered)
    _GDIPlus_Startup ()
    $hwd=GUICtrlGetHandle($control)
    ;$guiname=_WinAPI_GetParent($hwd)
    $width=_WinAPI_GetClientWidth($hwd)
    $height=_WinAPI_GetClientHeight($hwd)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hwd)
    $hBitmap1 = _GDIPlus_BitmapCreateFromGraphics($width,$height, $hGraphic)
    $hBitmap1=_fadeborder2($hBitmap1,$col1, $faded, $deep,$cornered)
    $hImage1 = _GDIPlus_ImageGetGraphicsContext($hBitmap1)
    _GDIPlus_GraphicsSetSmoothingMode($hImage1, 2)
    $hBMP1 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap1)
   _WinAPI_DeleteObject(GUICtrlSendMsg($control, 0x0172, 0, $hBMP1))
    _GDIPlus_ImageDispose ($hImage1)
    _WinAPI_DeleteObject($hBMP1)
    _WinAPI_DeleteObject($hBitmap1)
    _GDIPlus_GraphicsDispose ($hGraphic)
    _GDIPlus_Shutdown ()
EndFunc

Func _fadeborder2($hBitmap, $col1, $faded, $depth, $corner)
    $gwt = _GDIPlus_ImageGetWidth($hBitmap)
    $ght = _GDIPlus_ImageGetHeight($hBitmap)

    $hGraphics = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    Local $bGammaCorrection = False
    _GDIPlus_GraphicsSetSmoothingMode($hGraphics, 4)
$fadechange=int($faded/$depth)
For $i=0 To $depth
    ConsoleWrite($fadechange&@crlf)
    $iC1 = StringReplace($col1, "0x", "0x"&$fadechange*$i)
   Global $hBrush = _GDIPlus_BrushCreateSolid($iC1)
   GDIPlus_SetLineGammaCorrection($hBrush, $bGammaCorrection)
      _GDIPlus_GraphicsDrawRoundRect($hGraphics, $i, $i, $gwt-($i*2), $ght-($i*2), $corner, $hBrush)
    _GDIPlus_BrushDispose($hBrush)
Next
    _GDIPlus_GraphicsDispose($hGraphics)
    Return $hBitmap
EndFunc


While 1
    $MSG = GUIGetMsg()
    Switch $MSG
      Case -3
            Quiter()
    EndSwitch
WEnd

Func Quiter()
    Exit
EndFunc


Func _GDIPlus_GraphicsDrawRoundRect($hGraphics, $iX, $iY, $iWidth, $iHeight, $iRadius, $hBrush = 0, $hPen = 0)
    _GDIPlus_PenCreate($hPen)
    Local $hPath = _GDIPlus_GraphicsPathCreate()
    _GDIPlus_GraphicsPathAddLine($hPath, $iX + $iRadius, $iY, $iX + $iWidth - ($iRadius * 2), $iY)
    _GDIPlus_GraphicsPathAddArc($hPath, $iX + $iWidth - ($iRadius * 2), $iY, $iRadius * 2, $iRadius * 2, 270, 90)
    _GDIPlus_GraphicsPathAddLine($hPath, $iX + $iWidth, $iY + $iRadius, $iX + $iWidth, $iY + $iHeight - ($iRadius * 2))
    _GDIPlus_GraphicsPathAddArc($hPath, $iX + $iWidth - ($iRadius * 2), $iY + $iHeight - ($iRadius * 2), $iRadius * 2, $iRadius * 2, 0, 90)
    _GDIPlus_GraphicsPathAddLine($hPath, $iX + $iWidth - ($iRadius * 2), $iY + $iHeight, $iX + $iRadius, $iY + $iHeight)
    _GDIPlus_GraphicsPathAddArc($hPath, $iX, $iY + $iHeight - ($iRadius * 2), $iRadius * 2, $iRadius * 2, 90, 90)
    _GDIPlus_GraphicsPathAddLine($hPath, $iX, $iY + $iHeight - ($iRadius * 2), $iX, $iY + $iRadius)
    _GDIPlus_GraphicsPathAddArc($hPath, $iX, $iY, $iRadius * 2, $iRadius * 2, 180, 90)

    ;Draw the font onto the new bitmap
    _GDIPlus_GraphicsPathCloseFigure($hPath)
    If $hBrush <> 0 Then _GDIPlus_GraphicsFillPath($hGraphics, $hBrush, $hPath)
    _GDIPlus_GraphicsDrawPath($hGraphics, $hPen, $hPath)
    _GDIPlus_GraphicsPathDispose($hPath)
    _GDIPlus_PenDispose($hPen)
EndFunc ;==>_GDIPlus_GraphicsDrawRoundRect



;==== GDIPlus_CreateLineBrushFromRect === Malkey's function
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)
    $aRet = DllCall($ghGDIPDll, "int", "GdipCreateLineBrushFromRect", "ptr", $pRect, "int", $iArgb1, _
            "int", $iArgb2, "int", $LinearGradientMode, "int", $WrapMode, "int*", 0)

    If IsArray($aFactors) = 0 Then Dim $aFactors =
    If IsArray($aPositions) = 0 Then Dim $aPositions =
    $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, _
            "ptr", $pFactors, "ptr", $pPositions, "int", $iCount)
    Return $aRet ; Handle of Line Brush
EndFunc ;==>_GDIPlus_CreateLineBrushFromRect

Func GDIPlus_SetLineGammaCorrection($hBrush, $useGammaCorrection = True)
    Local $aResult
    $aResult = DllCall($ghGDIPDll, "int", "GdipSetLineGammaCorrection", "hwnd", $hBrush, "int", $useGammaCorrection)
    Return $aResult
EndFunc ;==>GDIPlus_SetLineGammaCorrection

Func _GDIPlus_GraphicsPathCreate($iFillMode = 0)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipCreatePath", "int", $iFillMode, "int*", 0);
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult, 0, $aResult)
EndFunc ;==>_GDIPlus_GraphicsPathCreate
Func _GDIPlus_GraphicsPathAddLine($hGraphicsPath, $iX1, $iY1, $iX2, $iY2)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipAddPathLine", "hwnd", $hGraphicsPath, "float", $iX1, "float", $iY1, _
            "float", $iX2, "float", $iY2)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult, 0, 0)
EndFunc ;==>_GDIPlus_GraphicsPathAddLine
Func _GDIPlus_GraphicsPathAddArc($hGraphicsPath, $iX, $iY, $iWidth, $iHeight, $iStartAngle, $iSweepAngle)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipAddPathArc", "hwnd", $hGraphicsPath, "float", $iX, "float", $iY, _
            "float", $iWidth, "float", $iHeight, "float", $iStartAngle, "float", $iSweepAngle)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult, 0, 0)
EndFunc ;==>_GDIPlus_GraphicsPathAddArc
Func _GDIPlus_GraphicsPathCloseFigure($hGraphicsPath)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipClosePathFigure", "hwnd", $hGraphicsPath)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult, 0, 0)
EndFunc ;==>_GDIPlus_GraphicsPathCloseFigure
Func _GDIPlus_GraphicsPathDispose($hGraphicsPath)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipDeletePath", "hwnd", $hGraphicsPath)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult, 0, 0)
EndFunc ;==>_GDIPlus_GraphicsPathDispose
Func _GDIPlus_GraphicsDrawPath($hGraphics, $hPen, $hGraphicsPath)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipDrawPath", "hwnd", $hGraphics, "hwnd", $hPen, "hwnd", $hGraphicsPath)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult, 0, 0)
EndFunc ;==>_GDIPlus_GraphicsDrawPath
Func _GDIPlus_GraphicsFillPath($hGraphics, $hBrush, $hGraphicsPath)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipFillPath", "hwnd", $hGraphics, "hwnd", $hBrush, "hwnd", $hGraphicsPath)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult, 0, 0)
EndFunc ;==>_GDIPlus_GraphicsFillPath

weeks1 发表于 2011-8-22 12:32:14

学习一下。

xyhqqaa 发表于 2011-8-22 13:05:43

好帅,留个记号,以后用到学习下

powerofos 发表于 2011-8-22 20:58:00

回复 1# haijie1223

漂亮!不错的 GDIP.au3 的应用实例!

wsfda 发表于 2011-8-22 21:32:02

说不定哪日就需要了,支持转帖

mo_shaojie 发表于 2011-8-22 22:50:54

不明白这个东东的作用.

jkq920 发表于 2011-8-23 23:53:54

来学习了。

xfei 发表于 2011-9-9 09:16:08

漂亮!不错的 GDIP.au3 的应用实例!

ayumi502 发表于 2011-11-7 20:00:26

mark一下 以后学习

spanker 发表于 2012-1-6 10:19:55

不错,学习了

spanker 发表于 2012-1-6 10:20:25

哎呀,怎么没有了

spanker 发表于 2012-1-6 10:20:42

这还是刚刚那个吗

syhw2222 发表于 2012-6-6 20:43:44

不错的源码!谢谢楼主分享!

hzxymkb 发表于 2012-8-24 11:34:31

发哥研究GDI了

穿好马甲 发表于 2012-11-26 11:40:34

马克一下 收藏备用
页: [1]
查看完整版本: GDI效果