Author: tic Last Modified: 20100828
AutoHotkey does not provide native support for GDI+. With these functions it is possible to work with the GDI+. With that we have the ability to draw shapes or manipulate images.
From Wikipedia, the free encyclopedia:
(http://en.wikipedia.org/wiki/GdiPlus)
"The Graphics Device Interface (GDI) is a Microsoft Windows application programming interface and core operating system component responsible for representing graphical objects and transmitting them to output devices such as monitors and printers."
Gdip_AddPathEllipse(Path, x, y, w, h)
Gdip_AddPathPolygon(Path, Points)
Gdip_BitmapFromBRA(ByRef BRAFromMemIn, File, Alternate=0)
Gdip_BitmapFromHWND(hwnd)
Gdip_BitmapFromScreen(Screen=0, Raster="")
Gdip_BlurBitmap(pBitmap, Blur)
Gdip_BrushCreateHatch(ARGBfront, ARGBback, HatchStyle=0)
Gdip_BrushCreateSolid(ARGB=0xff000000)
Gdip_CloneBitmapArea(pBitmap, x, y, w, h, Format=0x26200A)
Gdip_CloneBrush(pBrush)
Gdip_CreateAffineMatrix(m11, m12, m21, m22, x, y)
Gdip_CreateBitmap(Width, Height, Format=0x26200A)
Gdip_CreateBitmapFromClipboard()
Gdip_CreateBitmapFromFile(sFile, IconNumber=1, IconSize="")
Gdip_CreateBitmapFromHBITMAP(hBitmap, Palette=0)
Gdip_CreateBitmapFromHICON(hIcon)
Gdip_CreateHBITMAPFromBitmap(pBitmap, Background=0xffffffff)
Gdip_CreateHICONFromBitmap(pBitmap)
Gdip_CreateLineBrush(x1, y1, x2, y2, ARGB1, ARGB2, WrapMode=1)
Gdip_CreateLineBrushFromRect(x, y, w, h, ARGB1, ARGB2, LinearGradientMode=1, WrapMode=1)
Gdip_CreateMatrix()
Gdip_CreatePath(BrushMode=0)
Gdip_CreatePen(ARGB, w)
Gdip_CreatePenFromBrush(pBrush, w)
Gdip_CreateRegion()
Gdip_CreateTextureBrush(pBitmap, WrapMode=1, x=0, y=0, w="", h="")
Gdip_DeleteBrush(pBrushClear)
Gdip_DeleteFont(hFont)
Gdip_DeleteFontFamily(hFamily)
Gdip_DeleteGraphics(G)
Gdip_DeleteMatrix(Matrix)
Gdip_DeletePath(Path)
Gdip_DeletePen(pPen)
Gdip_DeleteRegion(Region)
Gdip_DeleteStringFormat(hFormat)
Gdip_DisposeImage(pBitmap1)
Gdip_DisposeImageAttributes(ImageAttr)
Gdip_DrawArc(pGraphics, pPen, x, y, w, h, StartAngle, SweepAngle)
Gdip_DrawBezier(pGraphics, pPen, x1, y1, x2, y2, x3, y3, x4, y4)
Gdip_DrawEllipse(pGraphics, pPen, x, y, 2*r, 2*r)
Gdip_DrawImage(pGraphics, pBitmap, dx="", dy="", dw="", dh="", sx="", sy="", sw="", sh="", Matrix=1)
Gdip_DrawImagePointsRect(pGraphics, pBitmap, Points, sx="", sy="", sw="", sh="", Matrix=1)
Gdip_DrawLine(pGraphics, pPen, x1, y1, x2, y2)
Gdip_DrawLines(pGraphics, pPen, Points)
Gdip_DrawPie(pGraphics, pPen, x, y, w, h, StartAngle, SweepAngle)
Gdip_DrawRectangle(pGraphics, pPen, x, y, w, h)
Gdip_DrawRoundedRectangle(pGraphics, pPen, x, y, w, h, r)
Gdip_DrawString(pGraphics, sString, hFont, hFormat, pBrush, ByRef RectF)
Gdip_FillEllipse(pGraphics, pBrush, x, y, 2*r, 2*r)
Gdip_FillPath(pGraphics, pBrush, Path)
Gdip_FillPie(pGraphics, pBrush, x, y, w, h, StartAngle, SweepAngle)
Gdip_FillPolygon(pGraphics, pBrush, Points, FillMode=0)
Gdip_FillRectangle(G, pBrushClear, 0, 0, w, h)
Gdip_FillRegion(pGraphics, pBrush, Region)
Gdip_FillRoundedRectangle(pGraphics, pBrush, x, y, w, h, r)
Gdip_FontCreate(hFamily, Size, Style=0)
Gdip_FontFamilyCreate(Font)
Gdip_GetClipRegion(pGraphics)
Gdip_GetDC(pGraphics)
Gdip_GetDimensions(pBitmap, ByRef Width, ByRef Height)
Gdip_GetDpiX(pGraphics)
Gdip_GetDpiY(pGraphics)
Gdip_GetImageHeight(pBitmap)
Gdip_GetImageHorizontalResolution(pBitmap)
Gdip_GetImagePixelFormat(pBitmap)
Gdip_GetImageVerticalResolution(pBitmap)
Gdip_GetImageWidth(pBitmap)
Gdip_GetPixel(pBitmap, x, y)
Gdip_GetRotatedDimensions(Width, Height, Angle, ByRef RWidth, ByRef RHeight)
Gdip_GetRotatedTranslation(Width, Height, Angle, ByRef xTranslation, ByRef yTranslation)
Gdip_GraphicsClear(pGraphics, ARGB=0x00ffffff)
Gdip_GraphicsFromHDC(hdc)
Gdip_GraphicsFromImage(pBitmap)
Gdip_LibraryVersion()
Gdip_MeasureString(pGraphics, sString, hFont, hFormat, ByRef RectF)
Gdip_ReleaseDC(pGraphics, hdc)
Gdip_ResetClip(pGraphics)
Gdip_ResetWorldTransform(pGraphics)
Gdip_RotateWorldTransform(pGraphics, Angle, MatrixOrder=0)
Gdip_SaveBitmapToFile(pBitmap, sOutput, Quality=75)
Gdip_ScaleWorldTransform(pGraphics, x, y, MatrixOrder=0)
Gdip_SetBitmapToClipboard(pBitmap)
Gdip_SetClipPath(pGraphics, Path, CombineMode=0)
Gdip_SetClipRect(pGraphics, x-r, y-r, 2*r, 2*r, 4)
Gdip_SetClipRegion(pGraphics, Region, 0)
Gdip_SetCompositingMode(pGraphics, CompositingMode=0)
Gdip_SetImageAttributesColorMatrix(Matrix)
Gdip_SetInterpolationMode(G1, 7)
Gdip_SetPixel(pBitmap, x, y, ARGB)
Gdip_SetSmoothingMode(pGraphics, SmoothingMode)
Gdip_SetStringFormatAlign(hFormat, Align)
Gdip_SetTextRenderingHint(pGraphics, Rendering)
Gdip_Shutdown(pToken)
Gdip_Startup()
Gdip_StringFormatCreate(Format=0, Lang=0)
Gdip_TextToGraphics(pGraphics, Text, Options, Font="Arial", Width="", Height="", Measure=0)
Gdip_TranslateWorldTransform(pGraphics, x, y, MatrixOrder=0)
For the functions's parameters and return value, please see it's source code.
It is not strictly stdlib conform, because some public functions have a name without a prefix.
If your OS is not >= XP then you will need gdiplus.dll.
You will need to place it in the same directory as the script
Minimum OS is Windows 2000
For update's details and remarks related to the functions, please see the AutoHotkey Forum: http://www.autohotkey.com/forum/viewtopic.php?t=32238
The functions is an open source item under the free license.
For details, please see tic_gdip-license.txt
; gdi+ ahk tutorial 1 written by tic (Tariq Porter) ; Requires Gdip.ahk either in your Lib folder as standard library or using #Include ; ; Tutorial to draw a single ellipse and rectangle to the screen #SingleInstance, Force #NoEnv SetBatchLines, -1 ; Uncomment if Gdip.ahk is not in your standard library ;#Include, Gdip.ahk ; Start gdi+ If !pToken := Gdip_Startup() { MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system ExitApp } OnExit, Exit ; Set the width and height we want as our drawing area, to draw everything in. This will be the dimensions of our bitmap Width := 600, Height := 400 ; Create a layered window (+E0x80000 : must be used for UpdateLayeredWindow to work!) that is always on top (+AlwaysOnTop), has no taskbar entry or caption Gui, 1: -Caption +E0x80000 +LastFound +OwnDialogs +Owner +AlwaysOnTop ; Show the window Gui, 1: Show, NA ; Get a handle to this window we have created in order to update it later hwnd1 := WinExist() ; Create a gdi bitmap with width and height of what we are going to draw into it. This is the entire drawing area for everything hbm := CreateDIBSection(Width, Height) ; Get a device context compatible with the screen hdc := CreateCompatibleDC() ; Select the bitmap into the device context obm := SelectObject(hdc, hbm) ; Get a pointer to the graphics of the bitmap, for use with drawing functions G := Gdip_GraphicsFromHDC(hdc) ; Set the smoothing mode to antialias = 4 to make shapes appear smother (only used for vector drawing and filling) Gdip_SetSmoothingMode(G, 4) ; Create a fully opaque red brush (ARGB = Transparency, red, green, blue) to draw a circle pBrush := Gdip_BrushCreateSolid(0xffff0000) ; Fill the graphics of the bitmap with an ellipse using the brush created ; Filling from coordinates (100,50) an ellipse of 200x300 Gdip_FillEllipse(G, pBrush, 100, 50, 200, 300) ; Delete the brush as it is no longer needed and wastes memory Gdip_DeleteBrush(pBrush) ; Create a slightly transparent (66) blue brush (ARGB = Transparency, red, green, blue) to draw a rectangle pBrush := Gdip_BrushCreateSolid(0x660000ff) ; Fill the graphics of the bitmap with a rectangle using the brush created ; Filling from coordinates (250,80) a rectangle of 300x200 Gdip_FillRectangle(G, pBrush, 250, 80, 300, 200) ; Delete the brush as it is no longer needed and wastes memory Gdip_DeleteBrush(pBrush) ; Update the specified window we have created (hwnd1) with a handle to our bitmap (hdc), specifying the x,y,w,h we want it positioned on our screen ; So this will position our gui at (0,0) with the Width and Height specified earlier UpdateLayeredWindow(hwnd1, hdc, 0, 0, Width, Height) ; Select the object back into the hdc SelectObject(hdc, obm) ; Now the bitmap may be deleted DeleteObject(hbm) ; Also the device context related to the bitmap may be deleted DeleteDC(hdc) ; The graphics may now be deleted Gdip_DeleteGraphics(G) Return ;####################################################################### Exit: ; gdi+ may now be shutdown on exiting the program Gdip_Shutdown(pToken) ExitApp Return