picea892 Posted December 12, 2009 Posted December 12, 2009 (edited) (I took a different approach and was able to create this UDFI'm hoping someone can help me figure out what the My_Paint function should look like. I can't figure out how to reshape the control after minimizing or moving off the screen. Thanks in advance for the helpexpandcollapse popup#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <GDIPlus.au3> #Include <Array.au3> #include <StaticConstants.au3> #Include <Constants.au3> #include <ButtonConstants.au3> Opt("GUIOnEventMode",1) global $guiwidth=420,$guiheight=190, $bckpic,$GUI Global $hFunc, $guicontrols, $Gui, $start, $end, $allday, $timestart, $timeend, $pic, $bX = 43, $picnames[2][4] Global $But[6],$But2[6], $Last,$daystate=1, $timestart, $timeend, $infocal=1 Global $GUI = GUICreate("Outlook", $guiwidth, $guiheight, -1,200, $WS_POPUP) GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "leftmouse") ;GUISetBkColor(0xABCDEF) _GDIPlus_Startup() Global $bckpic= GUICtrlCreatePic("",0,0,0,0) GuiCtrlSetState(-1,$GUI_DISABLE) $guibitmap=startbmp($guiwidth, $guiheight) $guibitmap= _drawborder($guibitmap,$guiwidth,$guiheight,"4","0x444444","0x666666","15") ;sets up the border on background $guibitmap=_addlabel($guibitmap, "Next",$guiwidth-53, $guiheight-28, $guiwidth,"0xAAAAAA", "Verdana",9) $guibitmap=_addlabel($guibitmap, "Shaped Controls Example",40, 6, $guiwidth,"0xAAAAAA", "Arial",20) ; $guibitmap=Seticon($guibitmap,$bckpic, "10","10","32", "32") finalizectrl($bckpic,$guibitmap) Global $a=GUICtrlCreatePic("",35,35,180,40) $guibitmap=startbmp(180, 40) $guibitmap=_createbutton($guibitmap,180, 40,10,"0xAAAAAA","0x000011" ,"0x110000", 1,"Just Some Text","C:\Program Files\Internet Explorer\iexplore.exe", 0 ) finalizectrl($a,$guibitmap) _GDIPlus_Shutdown() GUISetState() ;DllCall("UxTheme.dll", "int", "SetWindowTheme", "hwnd", GUICtrlGetHandle(-1), "wstr", " ", "wstr", " ") _GuiRoundCorners($GUI,0, 0, 30, 30) ; makes the background have round corners _ControlToRoundedRectangle($a,1,1,182,42,24) GUIRegisterMsg(0xF, "MY_PAINT") While 1 sleep(100) $amouse=MouseGetPos() $agui=WinGetPos($GUI) WEnd Func MY_PAINT($hwnd, $Msg, $wParam, $lParam) ; Check, if the GUI with the Graphic should be repainted If $hwnd = WinGetHandle($GUI) Then _ControlToRoundedRectangle($a,1,1,102,42,24) ConsoleWrite("Here"&@crlf) ; _WinAPI_RedrawWindow($GUI,0,0,BitOR($RDW_ERASE,$RDW_INVALIDATE,$RDW_UPDATENOW,$RDW_FRAME,$RDW_ALLCHILDREN)) ; works, but redraws entire screen. ;_WinAPI_RedrawWindow($GUI, "", "", BitOR($WM_ERASEBKGND, $RDW_INVALIDATE, $RDW_UPDATENOW, $RDW_FRAME)) EndIf EndFunc ;==>MY_PAINT Func _ControlToRoundedRectangle($aControl,$X1,$Y1,$X2,$Y2,$X3) Local $l Local $handle = GUICtrlGetHandle($aControl) $l = DllCall("gdi32.dll","int","CreateRoundRectRgn","int",$X1,"int",$Y1,"int",$X2,"int",$Y2,"int",$X3,"int",$X3) DllCall("user32.dll","int","SetWindowRgn","hwnd",$handle,"int",$l[0],"int",True) EndFunc Func startbmp($iWidth, $iHeight) ;Create a new bitmap, this way the original opened png is left unchanged $hBitmap = _GDIPlus_GraphicsCreateFromHWND(WinGetHandle($GUI)) $hImage = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hBitmap) _WinAPI_DeleteObject($hBitmap) Return $hImage EndFunc func _addlabel($hBitmap, $string,$posedw, $posedh, $iWidth,$colour1, $font="Arial", $size="13",$style=0) ;$hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap) $hGraphic = _GDIPlus_ImageGetGraphicsContext($hBitmap) $fcolour=StringReplace($colour1, "0x", "0xFF") $hBrush = _GDIPlus_BrushCreateSolid ($fcolour) $hFormat = _GDIPlus_StringFormatCreate () $hFamily = _GDIPlus_FontFamilyCreate ($font) $hFont = _GDIPlus_FontCreate ($hFamily, $size, $style) $tLayout = _GDIPlus_RectFCreate ($posedw, $posedh, $iWidth, 40) $aInfo = _GDIPlus_GraphicsMeasureString ($hGraphic, $string, $hFont, $tLayout, $hFormat) if not $string="" then _GDIPlus_GraphicsDrawStringEx ($hGraphic, $string, $hFont, $aInfo[0], $hFormat, $hBrush) _GDIPlus_FontDispose ($hFont) _GDIPlus_FontFamilyDispose ($hFamily) _GDIPlus_StringFormatDispose ($hFormat) _GDIPlus_BrushDispose ($hBrush) _GDIPlus_GraphicsDispose($hGraphic) return $hBitmap endfunc; SetIcon Func _createbutton($bitmap,$picwidth,$picheight,$corner,$iClr1, $iClr2, $iClr3, $iDirection,$text="",$sIcon="", $iIndex="") local $aFactors[4] = [0.0, 0.6, 0.8, 1.0], $aPositions[4] = [0.0, 0.6, 0.8, 1.0] $picwidth=$picwidth-2 $picheight=$picheight-2 local $bGammaCorrection = False $iC1 = StringReplace($iClr1, "0x", "0xFF") $iC2 = StringReplace($iClr2, "0x", "0xFF") $iC3 = StringReplace($iClr3, "0x", "0xFF") $hGraphics = _GDIPlus_ImageGetGraphicsContext($bitmap) _GDIPlus_GraphicsSetSmoothingMode($hGraphics, 4) Global $hBrush1 = _GDIPlus_BrushCreateSolid($iC3) $hBrushLin = _GDIPlus_CreateLineBrushFromRect(0, 0, $picwidth, $picheight, $aFactors, $aPositions, $iC1, $iC2, $iDirection) GDIPlus_SetLineGammaCorrection($hBrushLin, $bGammaCorrection) _GDIPlus_GraphicsDrawRoundRect($hGraphics, 0, 0, $picwidth+2, $picheight+2, $corner, $hBrush1) _GDIPlus_GraphicsDrawRoundRect($hGraphics, 2, 2, $picwidth-2, $picheight-2, $corner,$hBrushLin) $lef=5 if not $sIcon="" Then $hbmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($bitmap) $hIcon = _WinAPI_SHExtractIcons($sIcon, $iIndex, 32, 32) $hDC = _WinAPI_GetDC(0) $hBackDC = _WinAPI_CreateCompatibleDC($hDC) ;$hBitmap = _WinAPI_CreateSolidBitmap(0, $iBackground, $iWidth, $iHeight) $hBackSv = _WinAPI_SelectObject($hBackDC, $hbmp) If $hIcon <> 0 Then _WinAPI_DrawIconEx($hBackDC, 10, $picheight/2-15, $hIcon, 0, 0, 0, 0, $DI_NORMAL) $bitmap = _GDIPlus_BitmapCreateFromHBITMAP($hbmp) $hGraphics = _GDIPlus_ImageGetGraphicsContext($bitmap) $lef=40 EndIf _GDIPlus_GraphicsDrawImageRect($hGraphics, $bitmap, 0, 0, $picwidth, $picheight) if not $text="" then _GDIPlus_GraphicsDrawString($hGraphics,$text,$lef, $picheight/2-8,"Arial","11") _GDIPlus_GraphicsDispose($hGraphics) _GDIPlus_BrushDispose($hBrushLin) _GDIPlus_BrushDispose($hBrush1) if $sIcon="" Then Return $bitmap _WinAPI_SelectObject($hBackDC, $hBackSv) _WinAPI_DeleteDC($hBackDC) _WinAPI_ReleaseDC(0, $hDC) return $bitmap EndFunc Func _WinAPI_SHExtractIcons($sIcon, $iIndex, $iWidth, $iHeight) Local $Ret = DllCall('shell32.dll', 'int', 'SHExtractIconsW', 'wstr', $sIcon, 'int', $iIndex, 'int', $iWidth, 'int', $iHeight, 'ptr*', 0, 'ptr*', 0, 'int', 1, 'int', 0) If (@error) Or ($Ret[0] = 0) Or ($Ret[5] = Ptr(0)) Then Return SetError(1, 0, 0) EndIf Return $Ret[5] EndFunc ;==>_WinAPI_SHExtractIcons func _drawborder($hBitmap,$gwt,$ght,$depth,$colour1,$colour2,$corner) $iC1 = StringReplace($colour1, "0x", "0xFF") $iC2 = StringReplace($colour2, "0x", "0xFF") $hGraphics = _GDIPlus_ImageGetGraphicsContext($hBitmap) Global $hBrush = _GDIPlus_BrushCreateSolid($iC1) Global $hBrush2 = _GDIPlus_BrushCreateSolid(0xFF993333) Local $aFactors[4] = [0.0, 0.6, 0.8, 1.0], $aPositions[4] = [0.0, 0.6, 0.8, 1.0] Local $bGammaCorrection = False $hBrush1 = _GDIPlus_CreateLineBrushFromRect(0, 0, $gwt,$ght, $aFactors, $aPositions, "0xFF999999", "0xFF111111", 3) GDIPlus_SetLineGammaCorrection($hBrush1, $bGammaCorrection) Global $hBrush1 = _GDIPlus_BrushCreateSolid($iC2) _GDIPlus_GraphicsSetSmoothingMode($hGraphics, 4) _GDIPlus_GraphicsDrawRoundRect($hGraphics, 0, 0, $gwt,$ght, $corner, $hBrush) _GDIPlus_GraphicsDrawRoundRect($hGraphics, $depth, $depth, $gwt-($depth*2)-2, $ght-($depth*2)-2, $corner,$hBrush1) _GDIPlus_GraphicsDrawRoundRect2($hGraphics, $depth, $depth, $gwt,$ght, $corner,$hBrush2) _GDIPlus_GraphicsDrawRoundRect3($hGraphics, $depth, $depth, $gwt,$ght, $corner,$hBrush) _GDIPlus_BrushDispose($hBrush) _GDIPlus_BrushDispose($hBrush1) _GDIPlus_BrushDispose($hBrush2) _GDIPlus_GraphicsDispose($hGraphics) return $hBitmap EndFunc func _drawborder2($hBitmap,$gwt,$ght,$depth,$colour1,$colour2,$corner) $iC1 = StringReplace($colour1, "0x", "0xFF") $iC2 = StringReplace($colour2, "0x", "0xFF") $hGraphics = _GDIPlus_ImageGetGraphicsContext($hBitmap) Global $hBrush = _GDIPlus_BrushCreateSolid($iC1) Global $hBrush2 = _GDIPlus_BrushCreateSolid(0xFF993333) Local $aFactors[4] = [0.0, 0.6, 0.8, 1.0], $aPositions[4] = [0.0, 0.6, 0.8, 1.0] Local $bGammaCorrection = False $hBrush1 = _GDIPlus_CreateLineBrushFromRect(0, 0, $gwt,$ght, $aFactors, $aPositions, "0xFFFFFFFF", "0xFFBBBBBB", 3) GDIPlus_SetLineGammaCorrection($hBrush1, $bGammaCorrection) Global $hBrush1 = _GDIPlus_BrushCreateSolid($iC2) _GDIPlus_GraphicsSetSmoothingMode($hGraphics, 4) _GDIPlus_GraphicsDrawRoundRect($hGraphics, 0, 0, $gwt,$ght, $corner, $hBrush) _GDIPlus_GraphicsDrawRoundRect($hGraphics, $depth, $depth, $gwt-($depth*2)-2, $ght-($depth*2)-2, $corner,$hBrush1) _GDIPlus_BrushDispose($hBrush) _GDIPlus_BrushDispose($hBrush1) _GDIPlus_BrushDispose($hBrush2) _GDIPlus_GraphicsDispose($hGraphics) return $hBitmap EndFunc Func finalizectrl($controlID,$hImage) $hWnd = GUICtrlGetHandle($controlID) $hbmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage) $aBmp = DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hWnd, "int", 0x0172, "int", 0, "int", $hbmp) If $aBmp[0] <> 0 Then _WinAPI_DeleteObject($aBmp[0]) _WinAPI_DeleteObject($hbmp) EndFunc func leftmouse() ;decide whether button being pressed or gui being dragged if clickexit()=1 then Exit 0 if clicknext()=1 then window2() Return EndIf $hov=GUIGetCursorInfo($GUI) if $hov[4]<>$bckpic then Return If BitAND(WinGetState($GUI), 32) Then Return $GUI_RUNDEFMSG DllCall("user32.dll", "long", "SendMessage", "hwnd", $GUI, "int", $WM_SYSCOMMAND, "int", 0xF009, "int", 0) EndFunc Func clickexit() Local $PosDiff[2] $MousePos = MouseGetPos () $WinPos = WinGetPos ($Gui,"") $PosDiff[0] = $WinPos[0] + $WinPos[2] $PosDiff[1] = $WinPos[1] + $WinPos[3] if $mousePos[0]>$PosDiff[0]-37 and $mousePos[0]<$PosDiff[0]-7 and $mousePos[1]<$WinPos[1]+30 and $mousePos[1]>$WinPos[1]+2 Then return 1 return 0 EndFunc Func clicknext() Local $PosDiff[2] $MousePos = MouseGetPos () $WinPos = WinGetPos ($Gui,"") $PosDiff[0] = $WinPos[0] + $WinPos[2] $PosDiff[1] = $WinPos[1] + $WinPos[3] ; ConsoleWrite($mousePos[0]&" "&$PosDiff[0]&" "&$mousePos[1]&" "&$PosDiff[1]&@CRLF) if $mousePos[0]>$PosDiff[0]-62 and $mousePos[0]<$PosDiff[0]-16 and $mousePos[1]<$PosDiff[1]-12 and $mousePos[1]>$PosDiff[1]-34 Then return 1 return 0 EndFunc ;==== 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[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 Func GDIPlus_SetLineGammaCorrection($hBrush, $useGammaCorrection = True) Local $aResult $aResult = DllCall($ghGDIPDll, "int", "GdipSetLineGammaCorrection", "hwnd", $hBrush, "int", $useGammaCorrection) Return $aResult[0] EndFunc ;==>GDIPlus_SetLineGammaCorrection 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 Func _GDIPlus_GraphicsDrawRoundRect2($hGraphics, $iX, $iY, $iWidth, $iHeight, $iRadius, $hBrush = 0, $hPen = 0) _GDIPlus_PenCreate($hPen) Local $hPath = _GDIPlus_GraphicsPathCreate() $leftit=$iWidth-31 $downit=5 _GDIPlus_GraphicsPathAddArc($hPath, $leftit-3, $downit-3, 22,22,0, 360) ; this is the circle around the X ;;;;;;;;;;;;;;;;;;;;;;;;;;Script for the X _GDIPlus_GraphicsPathAddLine($hPath, $leftit+2, $downit, $leftit+2,$downit) _GDIPlus_GraphicsPathAddLine($hPath, $leftit+8, $downit+6,$leftit+14,$downit) _GDIPlus_GraphicsPathAddLine($hPath,$leftit+16, $downit+2,$leftit+10,$downit+8) _GDIPlus_GraphicsPathAddLine($hPath, $leftit+16,$downit+14,$leftit+14,$downit+16) _GDIPlus_GraphicsPathAddLine($hPath, $leftit+8,$downit+10,$leftit+2,$downit+16) _GDIPlus_GraphicsPathAddLine($hPath, $leftit, $downit+14,$leftit+6 ,$downit+8) _GDIPlus_GraphicsPathAddLine($hPath, $leftit, $downit+2,$leftit, $downit+2) ; _GDIPlus_GraphicsPathAddLine($hPath, $leftit ,$downit,$iWidth - ($iRadius * 2), $iY) ;;;;;;;;;;;;;;;;;;;;;;;;;Script for the X ends ;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 Func _GDIPlus_GraphicsDrawRoundRect3($hGraphics, $iX, $iY, $iWidth, $iHeight, $iRadius, $hBrush = 0, $hPen = 0) _GDIPlus_PenCreate($hPen) Local $hPath = _GDIPlus_GraphicsPathCreate() $leftit=$iWidth-52 $downit=$iHeight-33 ;;;;;;;;;;;;;;;;;;;;;;;;;;Script for the arrow _GDIPlus_GraphicsPathAddLine($hPath, $leftit+42, $downit+12, $leftit+29,$downit+23) _GDIPlus_GraphicsPathAddLine($hPath, $leftit+29, $downit+19,$leftit,$downit+19) _GDIPlus_GraphicsPathAddLine($hPath,$leftit, $downit+6,$leftit+29,$downit+6) _GDIPlus_GraphicsPathAddLine($hPath, $leftit+29,$downit+2,$leftit+29,$downit+2) ; _GDIPlus_GraphicsPathAddLine($hPath, $leftit ,$downit,$iWidth - ($iRadius * 2), $iY) ;;;;;;;;;;;;;;;;;;;;;;;;;Script for the X ends ;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 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], 0, $aResult[2]) EndFunc 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, 0) EndFunc 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, 0) EndFunc 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, 0) EndFunc 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, 0) EndFunc 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, 0) EndFunc 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, 0) EndFunc Func _GuiRoundCorners($h_win, $i_x1, $i_y1, $i_x3, $i_y3) Dim $pos, $ret, $ret2 $pos = WinGetPos($h_win) $ret = DllCall("gdi32.dll", "long", "CreateRoundRectRgn", "long", $i_x1, "long", $i_y1, "long", $pos[2], "long", $pos[3], "long", $i_x3, "long", $i_y3) If $ret[0] Then $ret2 = DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $h_win, "long", $ret[0], "int", 1) If $ret2[0] Then Return 1 Else Return 0 EndIf Else Return 0 EndIf EndFunc ;==>_GuiRoundCorners ;$iColor - Colour to be made transparent. Hex colour format 0xRRGGBB. If Default used then top left pixel colour of image ; is used as the transparent colour. Func ImageColorToTransparent($hImage2, $iStartPosX = 0, $iStartPosY = 0, $GuiSizeX = Default, $GuiSizeY = Default, $iColor = Default) Local $hBitmap1, $Reslt, $width, $height, $stride, $format, $Scan0, $v_Buffer, $v_Value, $iIW, $iIH $iIW = _GDIPlus_ImageGetWidth($hImage2) $iIH = _GDIPlus_ImageGetHeight($hImage2) If $GuiSizeX = Default Or $GuiSizeX > $iIW - $iStartPosX Then $GuiSizeX = $iIW - $iStartPosX If $GuiSizeY = Default Or $GuiSizeY > $iIH - $iStartPosY Then $GuiSizeY = $iIH - $iStartPosY $hBitmap1 = _GDIPlus_BitmapCloneArea($hImage2, $iStartPosX, $iStartPosY, $GuiSizeX, $GuiSizeY, $GDIP_PXF32ARGB) If $iColor = Default Then $iColor = GDIPlus_BitmapGetPixel($hBitmap1, 1, 1); Transparent color $Reslt = _GDIPlus_BitmapLockBits($hBitmap1, 0, 0, $GuiSizeX, $GuiSizeY, BitOR($GDIP_ILMREAD, $GDIP_ILMWRITE), $GDIP_PXF32ARGB) ;Get the returned values of _GDIPlus_BitmapLockBits () $width = DllStructGetData($Reslt, "width") $height = DllStructGetData($Reslt, "height") $stride = DllStructGetData($Reslt, "stride") $format = DllStructGetData($Reslt, "format") $Scan0 = DllStructGetData($Reslt, "Scan0") For $i = 0 To $GuiSizeX - 1 For $j = 0 To $GuiSizeY - 1 $v_Buffer = DllStructCreate("dword", $Scan0 + ($j * $stride) + ($i * 4)) $v_Value = DllStructGetData($v_Buffer, 1) If Hex($v_Value, 6) = Hex($iColor, 6) Then DllStructSetData($v_Buffer, 1, Hex($iColor, 6)); Sets Transparency here. Alpha Channel = 00, not written to. EndIf Next Next _GDIPlus_BitmapUnlockBits($hBitmap1, $Reslt) Return $hBitmap1 EndFunc ;==>ImageColorToTransparent ;The GetPixel method gets the color of a specified pixel in this bitmap. Func GDIPlus_BitmapGetPixel($hBitmap, $iX, $iY) Local $tArgb, $pArgb, $aRet $tArgb = DllStructCreate("dword Argb") $pArgb = DllStructGetPtr($tArgb) $aRet = DllCall($ghGDIPDll, "int", "GdipBitmapGetPixel", "hwnd", $hBitmap, "int", $iX, "int", $iY, "ptr", $pArgb) Return "0x" & Hex(DllStructGetData($tArgb, "Argb")) EndFunc ;==>GDIPlus_BitmapGetPixel func Setbutton($controlID, $iWidth, $iHeight,$string="", $hovered=0,$leavealone=0) Local $aFactors[4] = [0.0, 0.6, 0.8, 1.0], $aPositions[4] = [0.0, 0.6, 0.8, 1.0] Local $bGammaCorrection = False, $iDirection=1, $pressed=1 const $STM_SETIMAGE = 0x0172 $tIcon = DllStructCreate('hwnd') $tID = DllStructCreate('hwnd') if $leavealone=0 then $picnames[0][0]=$picnames[0][0]+1 $picnames[$picnames[0][0]][0]=$controlID $picnames[$picnames[0][0]][1]=$string $picnames[$picnames[0][0]][2]=$iWidth $picnames[$picnames[0][0]][3]=$iHeight redim $picnames[UBound($picnames)+1][4] EndIf if $hovered=0 then Local $fname="Arial", $fsize=14,$fstyle=0, $fcolour=0xFFCECDB4 local $iClr1="0xAA8866", $iClr2="0x441100" local $posedh=0,$posedw=0 Elseif $hovered=1 then Local $fname="Verdana", $fsize=14,$fstyle=0, $fcolour=0xFFCECDB4 local $iClr1="0x331111", $iClr2="0x662200" local $posedh=1,$posedw=1 Elseif $hovered=2 then Local $fname="Arial", $fsize=14,$fstyle=0, $fcolour=0xFFFFFFFF local $posedh=1,$posedw=1 local $iClr1="0xAA8866", $iClr2="0x441100" EndIf _GDIPlus_Startup() Local Const $IMAGE_BITMAP = 0 Local $hWnd, $iC1, $iC2, $hBitmap, $hImage, $hGraphic, $hBrushLin, $hbmp, $aBmp $hWnd = GUICtrlGetHandle($controlID) $iC1 = StringReplace($iClr1, "0x", "0xFF") $iC2 = StringReplace($iClr2, "0x", "0xFF") $hBitmap = _WinAPI_CreateBitmap($iWidth, $iHeight, 1, 32) $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap) $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage) $hBrushLin = _GDIPlus_CreateLineBrushFromRect(0, 0, $iWidth, $iHeight, $aFactors, $aPositions, $iC1, $iC2, $iDirection) GDIPlus_SetLineGammaCorrection($hBrushLin, $bGammaCorrection) _GDIPlus_GraphicsFillRect($hGraphic, 0+$pressed, 0+$pressed, $iWidth-$pressed*2, $iHeight-$pressed*2, $hBrushLin) $hBrush = _GDIPlus_BrushCreateSolid ($fcolour) $hFormat = _GDIPlus_StringFormatCreate () $hFamily = _GDIPlus_FontFamilyCreate ($fname) $hFont = _GDIPlus_FontCreate ($hFamily, $fsize, $fstyle) $tLayout = _GDIPlus_RectFCreate ($posedw, $posedh, $iWidth, $iHeight) $aInfo = _GDIPlus_GraphicsMeasureString ($hGraphic, $string, $hFont, $tLayout, $hFormat) if not $string="" then _GDIPlus_GraphicsDrawStringEx ($hGraphic, $string, $hFont, $aInfo[0], $hFormat, $hBrush) $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_FontDispose ($hFont) _GDIPlus_FontFamilyDispose ($hFamily) _GDIPlus_StringFormatDispose ($hFormat) _GDIPlus_BrushDispose ($hBrush) _GDIPlus_GraphicsDispose($hGraphic) ; _WinAPI_DeleteObject($hbmp) _GDIPlus_Shutdown() _WinAPI_DeleteObject($hBitmap) return SetError(0, 0, 1) endfunc; SetIcon ;--------------------------- ; FUNCTIONS ;--------------------------- Func _SetClipCircle($hGraphics, $x, $y, $width, $height) ;Create struct to hold pointer to Path object $Path = DllStructCreate("dword") ;Create Path object, store pointer to it DllCall($ghGDIPDll, "none", "GdipCreatePath", "int", 0, "int", DllStructGetPtr($Path)) ;Retrieve pointer from struct $pointer = DllStructGetData($Path,1) DllCall($ghGDIPDll, "none", "GdipAddPathEllipseI","int", $pointer,"int",$x,"int",$y,"int",$width,"int",$height) $aResult = DllCall($ghGDIPDll, "int", "GdipSetClipPath", "hwnd", $hGraphics, "ptr", $pointer,"int",0) If @error Then Return SetError(@error, @extended, False) Return SetError($aResult[0], 0, $aResult[0] = 0) EndFunc Func _AntiAlias($hGraphics) Local $aResult $aResult = DllCall($ghGDIPDll, "int", "GdipSetSmoothingMode", "hwnd", $hGraphics, "int", 2) If @error Then Return SetError(@error, @extended, False) Return SetError($aResult[0], 0, $aResult[0] = 0) EndFunc Func _SetRoundedRectClip($g,$x,$y,$w,$h,$r) $Path = DllStructCreate("dword") DllCall($ghGDIPDll, "none", "GdipCreatePath", "int", 0, "int", DllStructGetPtr($Path)) $pointer = DllStructGetData($Path,1) DllCall($ghGDIPDll, "none", "GdipAddPathArc","int", $pointer,"float",$x,"float",$y,"float",$r,"float",$r,"float",180,"float",90) DllCall($ghGDIPDll, "none", "GdipAddPathArc","int", $pointer,"float",$x+($w - $r - 1),"float",$y,"float",$r,"float",$r,"float",270,"float",90) DllCall($ghGDIPDll, "none", "GdipAddPathArc","int", $pointer,"float",$x+($w - $r - 1),"float",$y+($h - $r - 1),"float",$r,"float",$r,"float",0,"float",90) DllCall($ghGDIPDll, "none", "GdipAddPathArc","int", $pointer,"float",$x,"float",$y+($h - $r - 1),"float",$r,"float",$r,"float",90,"float",90) $aResult = DllCall($ghGDIPDll, "int", "GdipSetClipPath", "hwnd", $g, "ptr", $pointer,"int",0) EndFunc Edited December 13, 2009 by picea892
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