PUBLIC loForm, loGraphics, loPen loGraphics = CREATEOBJECT("gdiplus") loColor = CREATEOBJECT("Color", 64,128,128,64) loPen = CREATEOBJECT("Pen", loColor.Color, 4) loForm = CREATEOBJECT("Form") loForm.Show() loGraphics._graphics(loForm.hWnd) loGraphics.DrawEllipse(loPen.Pen, 1, 1, 50, 50) DEFINE CLASS Color AS Custom color = 0 PROCEDURE INIT LPARAMETERS tnAlpha, tnRed, tnGreen, tnBlue THIS.Color = THIS._color(tnAlpha, tnRed, tnGreen, tnBlue) PROCEDURE _color LPARAMETERS tnAlpha, tnRed, tnGreen, tnBlue RETURN BITLSHIFT(RGB(tnRed, tnGreen, tnBlue), 8) + tnAlpha ENDDEFINE DEFINE CLASS Pen AS Custom pen = 0 errorcode = 0 PROCEDURE INIT LPARAMETERS tnColor, tnWidth THIS.decl() THIS._pen(tnColor, tnWidth) ENDPROC PROCEDURE _pen LPARAMETERS tnColor, tnWidth LOCAL lnPen lnPen = 0 THIS.errorcode = GdipCreatePen1(tnColor, tnWidth, 2, @lnPen) THIS.pen = lnPen RETURN (THIS.errorcode = 0) ENDPROC PROCEDURE decl DECLARE INTEGER GdipCreatePen1 IN gdiplus ; INTEGER color, INTEGER width, INTEGER unit, INTEGER @pen DECLARE INTEGER GdipCreatePen2 IN gdiplus ; INTEGER brush, INTEGER width, INTEGER unit, INTEGER @pen ENDDEFINE DEFINE CLASS gdiplus As Custom hToken=0 graphics=0 initialized=.F. errorcode=0 PROCEDURE Init THIS.decl THIS.initialized = THIS.InitGDIplus() PROCEDURE Destroy THIS.ReleaseGraphics THIS.ReleaseGDIplus PROTECTED FUNCTION InitGDIplus LOCAL hToken, cInput hToken=0 cInput = PADR(CHR(1), 16,CHR(0)) TRY THIS.errorcode = GdiplusStartup(@hToken, @cInput, 0) CATCH THIS.errorcode = -1 ENDTRY THIS.hToken=hToken RETURN (THIS.errorcode=0) PROTECTED PROCEDURE ReleaseGDIplus IF THIS.hToken <> 0 = GdiplusShutdown(THIS.hToken) THIS.hToken=0 ENDIF PROCEDURE ReleaseGraphics IF THIS.graphics <> 0 = GdipDeleteGraphics(THIS.graphics) THIS.graphics=0 ENDIF FUNCTION _graphics(p1, p2) #DEFINE OBJ_DC 3 THIS.ReleaseGraphics LOCAL graphics, nObjType graphics=0 nObjType = GetObjectType(m.p1) DO CASE CASE nObjType=0 AND IsWindow(m.p1)<>0 THIS.errorcode = GdipCreateFromHWND(m.p1, @graphics) CASE nObjType=OBJ_DC AND PCOUNT()=1 THIS.errorcode = GdipCreateFromHDC(m.p1, @graphics) CASE nObjType=OBJ_DC AND PCOUNT()=2 THIS.errorcode = GdipCreateFromHDC2(m.p1, m.p2, @graphics) OTHERWISE THIS.errorcode = -1 RETURN .F. ENDCASE THIS.graphics = m.graphics RETURN (THIS.errorcode=0) FUNCTION StringFromGUID(cGUID) LOCAL cBuffer, nBufsize nBufsize=128 cBuffer = REPLICATE(CHR(0), nBufsize*2) = StringFromGUID2(cGUID, @cBuffer, nBufsize) cBuffer = SUBSTR(cBuffer, 1, AT(CHR(0)+CHR(0), cBuffer)) RETURN STRCONV(cBuffer, 6) FUNCTION CLSIDFromString(cStr) LOCAL cBuffer cBuffer=REPLICATE(CHR(0),16) = CLSIDFromString(THIS.ToWideChar(cStr), @cBuffer) RETURN m.cBuffer FUNCTION ToWideChar(cStr) RETURN STRCONV(m.cStr+CHR(0), 5) PROTECTED PROCEDURE decl DECLARE INTEGER GdiplusStartup IN gdiplus; INTEGER @token, STRING @input, INTEGER output DECLARE INTEGER StringFromGUID2 IN ole32; STRING rguid, STRING @lpsz, INTEGER cchMax DECLARE INTEGER CLSIDFromString IN ole32; STRING lpsz, STRING @pclsid DECLARE INTEGER StringFromCLSID IN ole32; STRING rclsid, STRING @ppsz DECLARE GdiplusShutdown IN gdiplus INTEGER token DECLARE INTEGER GetObjectType IN gdi32 INTEGER hObject DECLARE INTEGER IsWindow IN user32 INTEGER hwnd DECLARE INTEGER GdipDeleteGraphics IN gdiplus INTEGER graphics DECLARE INTEGER GdipCreateFromHDC IN gdiplus; INTEGER hdc, INTEGER @graphics DECLARE INTEGER GdipCreateFromHWND IN gdiplus; INTEGER hWindow, INTEGER @graphics DECLARE INTEGER GdipCreateFromHDC2 IN gdiplus; INTEGER hdc, INTEGER hDevice, INTEGER @graphics DECLARE INTEGER GdipDrawEllipse IN gdiplus ; INTEGER graphics, INTEGER pen, INTEGER x, INTEGER y, ; INTEGER width, INTEGER height PROCEDURE DrawEllipse LPARAMETERS tnPen, tnX, tnY, tnWidth, tnHeight IF THIS.graphics # 0 THIS.ErrorCode = GdipDrawEllipse(THIS.Graphics, tnPen, tnX, tnY, tnWidth, tnHeight) ENDIF RETURN (THIS.ErrorCode = 0) ENDDEFINE