Points of interest.
- The GDIPlus graphics are displayed on a GUI picture control.
- The graphics do not appear to erase as GDI+ graphics normally do.
- The gradient background is created using variations in hue.
These above techniques have previously appeared on the AutoIt forums.
The name GDIPlus_SetAngledText(), has the GDIPlus_ prefix as a reminder that _GDIPlus_Startup() has to be called before using this function.
_GDIPlus_Shutdown() is called after.
The button and GUI label control are not part of the graphics. The saved image file saves only the graphics.
The last optional parameter, $iAnchor:-
- If set to 0 (default), the $iCentreX , $iCentreY positioning values refer to the centre of the text string.
- If other than 0 (zero), the $iCentreX , $iCentreY positioning values refer to the top left corner of the text string, or close to it.
For those interested in the mathematics, search on "Parametric equations for a circle" and search on "Rotation of Coordinate Axes formulae". And see comments in script.
AutoIt
#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <GDIPlus.au3> #include <WinAPI.au3> #include<Color.au3> Opt("GUIOnEventMode", 1) ;0=disabled, 1=OnEvent mode enabled Global $ApW = 600, $ApH = 400 Global $Button[1] Global Const $iPI = 3.1415926535897932384626433832795 $hGui = GUICreate("GDIPlus Graphics on Picture Control - OnEvent Mode", $ApW + 40, $ApH + 40) GUISetOnEvent(-3, "_Quit") GUISetBkColor(0xffA0A0, $hGui) $Pic = GUICtrlCreatePic("", 20, 20, $ApW, $ApH) GUICtrlSetState(-1, $GUI_DISABLE) $Button[0] = GUICtrlCreateButton("Exit", 5, 5, 100, 45) GUICtrlSetOnEvent($Button[0], "_Quit") GUICtrlSetBkColor(-1, 0xF000FF) GUICtrlSetColor(-1, 0xBadB0B) GUICtrlCreateLabel("A GUICtrlCreateLabel", 120, 50, 200, 20) GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) PicSetGraphics($Pic, $ApW, $ApH); <-- Draw GDIPlus graphics on Picture control. GUISetState(@SW_SHOW, $hGui) While 1 Sleep(10) WEnd Func PicSetGraphics($cID, $iW, $iH) Local Const $STM_SETIMAGE = 0x0172 Local Const $IMAGE_BITMAP = 0 Local $hWnd, $hBitmap, $hImage, $hGraphic, $hBrush, $hBrush1, $hbmp, $aBmp $hWnd = GUICtrlGetHandle($cID) _GDIPlus_Startup() ;Buffer $hBitmap = _WinAPI_CreateSolidBitmap($hGui, 0xFFFFFF, $iW, $iH) ; or use next command ;$hBitmap = _WinAPI_CreateBitmap($iW, $iH, 1, 32);If this is used change $Pen1 tansparency from "0x80" to "0xFF" $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap) $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage) ;-----> All Graphics Here ;Rainbow background For $x = 0 To $ApW $hue = Color_SetHSL(Int($x / 2)) $hPen1 = _GDIPlus_PenCreate( "0x80" & Hex($hue, 6), 1) ; "0xFF" & Hex($hue, 6), 1) ; _GDIPlus_GraphicsDrawLine($hGraphic, $x, 0, $x, $ApH, $hPen1) _GDIPlus_PenDispose($hPen1) Next ;Ellipse $hBrush = _GDIPlus_BrushCreateSolid(0xFF0080FF) _GDIPlus_GraphicsFillEllipse($hGraphic, 230, 20, 50, 90, $hBrush) ;Diagonal red line $hPen = _GDIPlus_PenCreate(0xFFFF0000, 2) _GDIPlus_GraphicsDrawLine($hGraphic, 0, $ApH, $ApW, 0, $hPen) _GDIPlus_GraphicsDrawString ($hGraphic, "Hello world",$ApW/2, $ApH-15) ; From help file GDIPlus_SetAngledText($hGraphic, "Example text Incline", 415, 110, -ATan($ApH / $ApW) * 180 / $iPI, "", 16, 0xFF0080FF) ; Next command - Sometimes easier to have positioning point (anchor) at top left corner of text string. GDIPlus_SetAngledText($hGraphic, "Example text Decline", 0, 0, ATan($ApH / $ApW) * 180 / $iPI, "", 18, 0xFF8080FF, 1) GDIPlus_SetAngledText($hGraphic, "Example text Incline Inverted", 165, 305, 180 - ATan($ApH / $ApW) * 180 / $iPI) GDIPlus_SetAngledText($hGraphic, "Example text Decline Inverted", 435, 305, 180 + ATan($ApH / $ApW) * 180 / $iPI, "", "", "") GDIPlus_SetAngledText($hGraphic, "Example text zero Angle", $ApW / 2, 8, 0, "Times New Roman", 10, 0xFF801010) GDIPlus_SetAngledText($hGraphic, "Example text Vertical (270Deg Angle)", $ApW - 10, $ApH / 2, 270, "", 8, 0xFF801010) ; -----> End of all Graphics ; Keeps all GDIPlus graphics visible $hbmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage) $aBmp = DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hWnd, "int", $STM_SETIMAGE, "int", $IMAGE_BITMAP, "int", $hbmp) _WinAPI_RedrawWindow($hGui, "", "", BitOR($RDW_INVALIDATE, $RDW_UPDATENOW, $RDW_FRAME)) ; Save Graphics on picture control _GDIPlus_ImageSaveToFile($hImage, @DesktopDir & "\TestWrite1.png") ShellExecute(@DesktopDir & "\TestWrite1.png") If $aBmp[0] <> 0 Then _WinAPI_DeleteObject($aBmp[0]) _GDIPlus_ImageDispose($hImage) _GDIPlus_BrushDispose($hBrush) _GDIPlus_PenDispose($hPen) _GDIPlus_GraphicsDispose($hGraphic) _WinAPI_DeleteObject($hbmp) _WinAPI_DeleteObject($hBitmap) _GDIPlus_Shutdown() EndFunc ;==>PicSetGraphics Func _Quit() Local $iDeletePict = MsgBox(4, "Delete Saved Image File", "Do you wish to delete the saved image file, TestWrite1.png? Y/N") If $iDeletePict = 6 Then FileDelete(@DesktopDir & "\TestWrite1.png") Exit EndFunc ;==>_Quit ; #FUNCTION# ================================================================ ; Name...........: GDIPlus_SetAngledText ; Description ...: Adds text to a graphic object at any angle. ; Syntax.........: GDIPlus_SetAngledText($hGraphic, $nText, [$iCentreX, [$iCentreY, [$iAngle , [$nFontName , _ ; [$nFontSize, [$iARGB, [$iAnchor]]]]]]] ) ; Parameters ....: $hGraphic - The Graphics object to receive the added text. ; $nText - Text string to be displayed ; $iCentreX - Horizontal coordinate of horixontal centre of the text rectangle (default = 0 ) ; $iCentreY - Vertical coordinate of vertical centre of the text rectangle (default = 0 ) ; $iAngle - The angle which the text will be place in degrees. (default = "" or blank = 0 ) ; $nFontName - The name of the font to be used (default = "" or Blank = "Arial" ) ; $nFontSize - The font size to be used (default = "" or Blank = 12 ) ; $iARGB - Alpha(Transparency), Red, Green and Blue color (0xAARRGGBB) (Default= "" = random color ; or Default = Blank = 0xFFFF00FF ) ; $iAnchor - If zero (default) positioning $iCentreX, $iCentreY values refer to centre of text string. ; If not zero positioning $iCentreX, $iCentreY values refer to top left corner of text string. ; Return values .: 1 ; Author ........: Malkey ; Modified.......: ; Remarks .......: Call _GDIPlus_Startup() before starting this function, and call _GDIPlus_Shutdown()after function ends. ; Can enter calculation for Angle Eg. For incline, -ATan($iVDist / $iHDist) * 180 / $iPI , where ; $iVDist is Vertical Distance, $iHDist is Horizontal Distance, and, $iPI is Pi, (an added Global Const). ; When used with other graphics, call this function last. The MatrixRotate() may affect following graphics. ; Related .......: _GDIPlus_Startup(), _GDIPlus_Shutdown(), _GDIPlus_GraphicsDispose($hGraphic) ; Link ..........; ; Example .......; Yes ; ======================================================================================== Func GDIPlus_SetAngledText($hGraphic, $nText, $iCentreX = 0, $iCentreY = 0, $iAngle = 0, $nFontName = "Arial", _ $nFontSize = 12, $iARGB = 0xFFFF00FF, $iAnchor = 0) Local $x, $y, $iX, $iY, $iWidth, $iHeight Local $hMatrix, $iXt, $iYt, $hBrush, $hFormat, $hFamily, $hFont, $tLayout ; Default values If $iAngle = "" Then $iAngle = 0 If $nFontName = "" Or $nFontName = -1 Then $nFontName = "Arial" ; "Microsoft Sans Serif" If $nFontSize = "" Then $nFontSize = 12 If $iARGB = "" Then ; Randomize ARGB color $iARGB = "0xFF" & Hex(Random(0, 255, 1), 2) & Hex(Random(0, 255, 1), 2) & Hex(Random(0, 255, 1), 2) EndIf $hFormat = _GDIPlus_StringFormatCreate(0) $hFamily = _GDIPlus_FontFamilyCreate($nFontName) $hFont = _GDIPlus_FontCreate($hFamily, $nFontSize, 1, 3) $tLayout = _GDIPlus_RectFCreate($iCentreX, $iCentreY, 0, 0) $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $nText, $hFont, $tLayout, $hFormat) $iWidth = Ceiling(DllStructGetData($aInfo[0], "Width")) $iHeight = Ceiling(DllStructGetData($aInfo[0], "Height")) ;Later calculations based on centre of Text rectangle. If $iAnchor = 0 Then ; Reference to middle of Text rectangle $iX = $iCentreX $iY = $iCentreY Else ; Referenced centre point moved to top left corner of text string. $iX = $iCentreX + (($iWidth - Abs($iHeight * Sin($iAngle * $iPI / 180))) / 2) $iY = $iCentreY + (($iHeight + Abs($iWidth * Sin($iAngle * $iPI / 180))) / 2) EndIf ;Rotation Matrix $hMatrix = _GDIPlus_MatrixCreate() _GDIPlus_MatrixRotate($hMatrix, $iAngle, 1) _GDIPlus_GraphicsSetTransform($hGraphic, $hMatrix) ;x, y are display coordinates of center of width and height of the rectanglular text box. ;Top left corner coordinates rotate in a circular path with radius = (width of text box)/2. ;Parametric equations for a circle, and adjustments for centre of text box $x = ($iWidth / 2) * Cos($iAngle * $iPI / 180) - ($iHeight / 2) * Sin($iAngle * $iPI / 180) $y = ($iWidth / 2) * Sin($iAngle * $iPI / 180) + ($iHeight / 2) * Cos($iAngle * $iPI / 180) ;Rotation of Coordinate Axes formulae - To display at x and y after rotation, we need to enter the ;x an y position values of where they rotated from. This is done by rotating the coordinate axes. ;Use $iXt, $iYt in _GDIPlus_RectFCreate. These x, y values is the position of the rectangular ;text box point before rotation. (before translation of the matrix) $iXt = ($iX - $x) * Cos($iAngle * $iPI / 180) + ($iY - $y) * Sin($iAngle * $iPI / 180) $iYt = -($iX - $x) * Sin($iAngle * $iPI / 180) + ($iY - $y) * Cos($iAngle * $iPI / 180) $hBrush = _GDIPlus_BrushCreateSolid($iARGB) $tLayout = _GDIPlus_RectFCreate($iXt, $iYt, $iWidth, $iHeight) _GDIPlus_GraphicsDrawStringEx($hGraphic, $nText, $hFont, $tLayout, $hFormat, $hBrush) ; Clean up resources _GDIPlus_MatrixDispose($hMatrix) _GDIPlus_FontDispose($hFont) _GDIPlus_FontFamilyDispose($hFamily) _GDIPlus_StringFormatDispose($hFormat) _GDIPlus_BrushDispose($hBrush) $tLayout = "" Return 1 EndFunc ;==>GDIPlus_SetAngledText Func Color_SetHSL($iHue, $Saturation = 180, $Brightness = 160) If IsArray($iHue) Then $aInput = $iHue Else Local $aInput[3] = [$iHue, $Saturation, $Brightness] EndIf Local $aiRGB = _ColorConvertHSLtoRGB($aInput) Return "0x" & Hex(Round($aiRGB[0]), 2) & Hex(Round($aiRGB[1]), 2) & Hex(Round($aiRGB[2]), 2) EndFunc ;==>_Color_SetHSL
See next post for placing a string on ellipse boundary.
Edit: 30/11/2008 The GDIPlus_SetAngledText() function was also used on the "CAPTCHA" script at
http://www.autoitscript.com/forum/index.ph...st&p=610926
Edited by Malkey, 30 November 2008 - 12:57 PM.






