Files
comun/utile/foxcharts/gdiplusx.vc2

1104 lines
35 KiB
Plaintext

*--------------------------------------------------------------------------------------------------------------------------------------------------------
* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
*--------------------------------------------------------------------------------------------------------------------------------------------------------
*< FOXBIN2PRG: Version="1.21" SourceFile="gdiplusx.vcx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
*
*
DEFINE CLASS ctlcanvas AS control
*< CLASSDATA: Baseclass="control" Timestamp="" Scale="Pixels" Uniqueid="" />
*-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder
*< OBJECTDATA: ObjPath="Imgcanvas1" UniqueID="" Timestamp="" />
*<DefinedPropArrayMethod>
*m: beforedraw
*m: clear
*m: setup
*p: ogfx
*</DefinedPropArrayMethod>
*<PropValue>
BackStyle = 0
BorderWidth = 0
Height = 252
Name = "ctlcanvas"
ogfx = (NULL)
Width = 348
*</PropValue>
ADD OBJECT 'Imgcanvas1' AS imgcanvas WITH ;
Height = 252, ;
Left = 0, ;
Name = "Imgcanvas1", ;
Top = 0, ;
Width = 348
*< END OBJECT: ClassLib="gdiplusx.vcx" BaseClass="image" />
PROCEDURE beforedraw
ENDPROC
PROCEDURE clear
LPARAMETERS eColor
This.imgcanvas1.Clear(eColor)
ENDPROC
PROCEDURE Init
This.imgcanvas1.Width = This.Width
This.imgCanvas1.Height = This.Height
This.imgCanvas1.Anchor = 15
ENDPROC
PROCEDURE Resize
This.imgcanvas1.Resize()
ENDPROC
PROCEDURE setup
ENDPROC
ENDDEFINE
DEFINE CLASS ctlthemeprogressbar AS control
*< CLASSDATA: Baseclass="control" Timestamp="" Scale="Pixels" Uniqueid="" />
*-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder
*< OBJECTDATA: ObjPath="Imgthemebase1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="Imgthemebase2" UniqueID="" Timestamp="" />
*<DefinedPropArrayMethod>
*m: orientation_assign
*m: updatecontrol
*m: value_assign
*p: max
*p: min
*p: orientation
*p: value && Specifies the current state of a control.
*</DefinedPropArrayMethod>
*<PropValue>
Height = 28
max = 100
min = 0
Name = "ctlthemeprogressbar"
orientation = 0
value = 0
Width = 296
*</PropValue>
ADD OBJECT 'Imgthemebase1' AS imgthemebase WITH ;
Height = 21, ;
Left = 3, ;
Name = "Imgthemebase1", ;
themeclass = (STRCONV("Progress"+0h00,5)), ;
themepart = 1, ;
Top = 3, ;
Width = 57
*< END OBJECT: ClassLib="gdiplusx.vcx" BaseClass="image" />
ADD OBJECT 'Imgthemebase2' AS imgthemebase WITH ;
Height = 21, ;
Left = 62, ;
Name = "Imgthemebase2", ;
themeclass = (STRCONV("Progress"+0h00,5)), ;
themepart = 1, ;
Top = 3, ;
Width = 57
*< END OBJECT: ClassLib="gdiplusx.vcx" BaseClass="image" />
PROCEDURE Init
This.UpdateControl()
ENDPROC
PROCEDURE orientation_assign
LPARAMETERS tnOrientation
IF BETWEEN(m.tnOrientation, 0, 1)
This.Orientation = m.tnOrientation
This.Value = This.Value
ENDIF
ENDPROC
PROCEDURE Resize
This.UpdateControl()
ENDPROC
PROTECTED PROCEDURE updatecontrol
WITH This.imgthemebase1
.Top = 0
.Left = 0
.Width = This.Width
.Height = This.Height
IF This.Orientation = 0 && Horizontal
.ThemePart = 1
ELSE
.ThemePart = 2
ENDIF
.Draw()
ENDWITH
WITH This.imgthemebase2
.Top = 4
.Left = 4
m.lnPct = (This.Value-This.Min)/(This.Max-This.Min)
IF This.Orientation = 0 && Horizontal
.Width = (This.Width-8)*m.lnPct
.Height = MAX(This.Height-8,1)
.ThemePart = 3
ELSE
.Width = This.Width-8
.Height = MAX((This.Height-8)*m.lnPct,1)
.Top = This.Height-4-.Height
.ThemePart = 4
ENDIF
.Draw()
ENDWITH
ENDPROC
PROCEDURE value_assign
LPARAMETERS tnValue
LOCAL lnPct
IF BETWEEN(m.tnValue, This.Min, This.Max)
This.Value = m.tnValue
This.UpdateControl()
ENDIF
ENDPROC
ENDDEFINE
DEFINE CLASS imgcanvas AS image
*< CLASSDATA: Baseclass="image" Timestamp="" Scale="Pixels" Uniqueid="" />
*<DefinedPropArrayMethod>
*m: activate && Occurs when a FormSet, Form, or Page object becomes active or when a ToolBar object is shown.
*m: afterdraw
*m: backstyle_access
*m: beforedraw
*m: clear && Clears the contents of a ComboBox or ListBox control.
*m: createosb
*m: declaredll
*m: deleteosb
*m: draw && Repaints a Form object.
*m: drawreport
*m: getextent
*m: height_access
*m: interpolationmode_assign
*m: lredrawnow_assign
*m: rectangle_access
*m: refresh && Repaints a Form or control and refreshes any values.
*m: rendermode_assign
*m: renderosb
*m: resize && Occurs when an object is resized.
*m: save
*m: setup
*m: smoothingmode_assign
*m: textrenderinghint_assign
*m: width_access
*p: controls && An array for accessing the controls in a container object.
*p: drawwheninvisible
*p: hdc
*p: interpolationmode
*p: lignorepaint
*p: lredrawnow
*p: obmp
*p: ogfx
*p: rectangle
*p: rendermode && 0 = Memory BMP ; 1 = File BMP ; 4 = Memory PNG
*p: smoothingmode
*p: textrenderinghint
*p: _bmpheight
*p: _bmpwidth
*p: _csize
*p: _hbitmapold
*p: _heightoverride
*p: _hwnd
*p: _inform
*p: _isinitialized
*p: _memberdata && XML Metadata for customizable properties
*p: _tempemffile
*p: _tempfile
*p: _usesmooth
*p: _widthoverride
*</DefinedPropArrayMethod>
PROTECTED lignorepaint,_bmpheight,_bmpwidth,_hbitmapold,_heightoverride,_hwnd,_inform,_isinitialized,_tempemffile,_tempfile,_widthoverride
*<PropValue>
BackStyle = 0
controls = (NULL)
drawwheninvisible = .F.
hdc = 0
Height = 162
interpolationmode = 0
lignorepaint = .F.
lredrawnow = .F.
Name = "imgcanvas"
obmp = (NULL)
ogfx = (NULL)
rectangle = (NULL)
rendermode = 0
smoothingmode = 4
textrenderinghint = 3
Width = 182
_bmpheight = 0
_bmpwidth = 0
_csize =
_hbitmapold = 0
_heightoverride = -1
_hwnd = 0
_inform = .F.
_isinitialized = .F.
_memberdata = <VFPData>
<memberdata name="beforedraw" type="method" display="BeforeDraw"/>
<memberdata name="hdc" type="property" display="HDC"/>
<memberdata name="ogfx" type="property" display="oGfx"/>
<memberdata name="refresh" type="method" display="Refresh"/>
<memberdata name="clear" type="method" display="Clear"/>
<memberdata name="draw" type="method" display="Draw"/>
<memberdata name="controls" type="property" display="Controls"/>
<memberdata name="setup" type="method" display="SetUp"/>
<memberdata name="save" type="method" display="Save"/>
<memberdata name="afterdraw" type="method" display="AfterDraw"/>
<memberdata name="interpolationmode" type="property" display="InterpolationMode"/>
<memberdata name="rectangle" type="property" display="Rectangle"/>
<memberdata name="rendermode" type="property" display="RenderMode"/>
<memberdata name="smoothingmode" type="property" display="SmoothingMode"/>
<memberdata name="textrenderinghint" type="property" display="TextRenderingHint"/>
<memberdata name="obmp" type="property" display="oBmp"/>
<memberdata name="drawwheninvisible" type="property" display="DrawWhenInvisible"/>
<memberdata name="lredrawnow" type="property" display="lRedrawNow"/>
<memberdata name="drawreport" type="method" display="DrawReport"/>
<memberdata name="resize" type="method" display="Resize"/>
<memberdata name="activate" type="method" display="Activate"/>
<memberdata name="_usesmooth" type="property" display="_UseSmooth"/>
</VFPData>
_tempemffile =
_tempfile =
_usesmooth = .F.
_widthoverride = -1
*</PropValue>
PROCEDURE activate && Occurs when a FormSet, Form, or Page object becomes active or when a ToolBar object is shown.
*********************************************************************
** Method: ImgCanvas.Activate
**
** Occurs when the Image Canvas is activated for the 1st time
**
** History:
** 2007/12/23: CWollenhaupt - Coded - observations below
**
*********************************************************************
*********************************************************************
* We cannot display a control properly during the initialization of a form. Because the
* form is invisible while it's loaded, it doesn't trigger any Resize event when the size
* changes or controls are moved around. Nor are several properties updated correctly at
* this point. The form becomes visible when the Activate event is triggered.
*
* The control might have been drawn already, for instance, by calling the Draw method
* directly. If the control's size hasn't changed, there's no need to repeat drawing the
* control. However, if the size differs we now have to redraw the control with the
* actual size.
*
* Activate can fire repeatedly. There's little advantage of frequently drawing the same
* image. Hence, we unbind the control once it was triggered.
*
*********************************************************************
LOCAL lcNewSize
m.lcNewSize = BINTOC(This.Width, "4rs") + BINTOC(This.Height, "4rs")
IF NOT This._cSize == m.lcNewSize
This.Draw()
ENDIF
IF This._InForm
UNBINDEVENTS(Thisform,"Activate",This,"Activate")
ENDIF
ENDPROC
PROCEDURE afterdraw
ENDPROC
PROTECTED PROCEDURE backstyle_access
** For use in Grids, if the control is hosted in a grid
** it needs to update for each visible row. This event
** will fire as each visible row in the Grid
This.Draw()
RETURN THIS.BackStyle
ENDPROC
PROCEDURE beforedraw
ENDPROC
PROCEDURE clear && Clears the contents of a ComboBox or ListBox control.
LPARAMETERS teColor
** eColor can be RGB, ARGB or Color object
DO CASE
** Color object
CASE VARTYPE(m.teColor) = "O"
This.oGfx.Clear(m.teColor)
** RGB color
CASE VARTYPE(m.teColor) = "N" AND BITAND(m.teColor,0xFF000000) = 0
This.oGfx.Clear(_SCREEN.System.Drawing.Color.FromRGB(m.teColor))
** ARGB color
CASE VARTYPE(m.teColor) = "N"
This.oGfx.Clear(_SCREEN.System.Drawing.Color.FromARGB(m.teColor))
OTHERWISE
IF This._InForm
*! ToDo: Need to add support for XP theme background
This.oGfx.Clear(_SCREEN.System.Drawing.Color.FromRGB(This.Parent.BackColor))
ELSE
This.oGfx.Clear(_SCREEN.System.Drawing.Color.White)
ENDIF
ENDCASE
ENDPROC
PROTECTED PROCEDURE createosb
LPARAMETERS tnWidth, tnHeight
This.DeleteOSB()
LOCAL loRect
IF EMPTY(m.tnWidth)
m.tnWidth = This.Width
m.tnHeight = This.Height
ENDIF
This._BMPWidth = m.tnWidth
This._BMPHeight = m.tnHeight
m.tnWidth = MAX(m.tnWidth,1)
m.tnHeight = MAX(m.tnHeight,1)
WITH _Screen.System.Drawing
DO CASE
CASE This.RenderMode = 1 && Render to File
This.oBmp = .Bitmap.New(m.tnWidth, m.tnHeight, .Imaging.PixelFormat.Format24bppRGB)
CASE This.RenderMode = 7 && Render to EMF
IF EMPTY(This._tempfile)
This._tempfile = ADDBS(SYS(2023))+SYS(2015)+".emf"
ELSE
DELETE FILE (This._tempfile)
CLEAR RESOURCES (This._tempfile)
This._tempfile = ADDBS(SYS(2023))+SYS(2015)+".emf"
ENDIF
loRect = .Rectangle.New(0, 0, m.tnWidth, m.tnHeight)
This.oBmp = .Imaging.Metafile.New(This._tempfile,0, m.loRect, ;
.Imaging.MetafileFrameUnit.Pixel, ;
.Imaging.MetaFileType.EmfPlusOnly)
OTHERWISE
This.oBmp = .Bitmap.New(m.tnWidth, m.tnHeight)
ENDCASE
This.oGfx = .Graphics.FromImage(This.oBmp)
This.oGfx.SmoothingMode = This.SmoothingMode
This.oGfx.TextRenderingHint = This.TextRenderingHint
This.oGfx.InterpolationMode = This.InterpolationMode
ENDWITH
ENDPROC
PROCEDURE declaredll
ENDPROC
PROTECTED PROCEDURE deleteosb
This.oGfx = NULL
This.oBMP = NULL
ENDPROC
PROCEDURE Destroy
LOCAL m.lcFile
IF VARTYPE(This.Controls) = "O"
This.Controls.Remove(-1)
ENDIF
This.Controls = NULL
This.DeleteOSB()
IF VARTYPE(This._TempEMFFile)="O"
This.Picture = ""
FOR EACH m.lcFile IN This._TempEMFFile
IF FILE(m.lcFile)
DELETE FILE (m.lcFile)
ENDIF
ENDFOR
ENDIF
IF FILE(This._tempfile)
This.Picture = ""
DELETE FILE (This._tempFile)
ENDIF
ENDPROC
PROCEDURE draw && Repaints a Form object.
*********************************************************************
** Method: ImgCanvas.Draw
**
** History:
** 2006/../..: BDurban - Coded
** 2007/12/23: CWollenhaupt - Fixed observations below
**
*********************************************************************
LPARAMETERS tnWidth, tnHeight, toGfx
LOCAL loGfxOld
*********************************************************************
* When we have many GDI+ objects on a form we have to make sure that we don't redraw
* them too many times as this reduces performance quite a bit. While the form is not
* visible we cannot rely on the current dimension. It might change without us being
* notified. Therefore we filter calls only redrawing when there's actually something to
* do.
*********************************************************************
IF This._InForm
IF NOT This.lRedrawNow AND NOT Thisform.Visible AND NOT This.DrawWhenInvisible
RETURN
ENDIF
ENDIF
IF NOT This._IsInitialized
RETURN
ENDIF
IF EMPTY(m.tnWidth)
This._WidthOverride = -1
This._HeightOverride = -1
m.tnWidth = This.Width
m.tnHeight = This.Height
ELSE
This._WidthOverride = m.tnWidth
This._HeightOverride = m.tnHeight
ENDIF
IF VARTYPE(m.toGfx) = "O"
m.loGFXOld = This.oGfx
This.oGfx = m.toGFX
This.BeforeDraw()
* This.RenderOSB()
This.AfterDraw()
This.oGfx = m.loGFXOld
ELSE
This._cSize = BINTOC(m.tnWidth,"4rs") + BINTOC(m.tnHeight,"4rs")
IF This._BMPWidth <> m.tnWidth OR This._BMPHeight <> m.tnHeight OR This.RenderMode = 7
This.CreateOSB(m.tnWidth, m.tnHeight)
ENDIF
This.BeforeDraw()
This.RenderOSB()
This.AfterDraw()
ENDIF
This._WidthOverride = -1
This._HeightOverride = -1
ENDPROC
PROCEDURE drawreport
LPARAMETERS tnWidth, tnHeight
LOCAL loRect, loEMF, loGFX, lcTempFile, lnSelect
** Hooking into a report is sensitive to the work area changing
** lets make sure we can restore the current workarea in case it changes
m.lnSelect = SELECT()
m.tnWidth = EVL(m.tnWidth, This.Width)
m.tnHeight = EVL(m.tnHeight, This.Height)
** The only way to support EMF in a VFP 9 report is to either draw it
** ourselves or go to disk. The Image object's PictureVal does not work
** for EMFs. So we are going to create a temp EMF file to draw to and
** then return the file name from this function. All temp files need to
** be stored in a collection so we can clean them up later
IF VARTYPE(This._TempEMFFile) <> "O"
This._TempEMFFile = CREATEOBJECT("Collection")
ENDIF
m.lcTempFile = ADDBS(SYS(2023))+SYS(2015)+".emf"
This._TempEMFFile.Add(m.lcTempFile)
WITH _SCREEN.System.Drawing
m.loRect = .Rectangle.New(0,0,m.tnWidth,m.tnHeight)
* m.loEMF = .Imaging.Metafile.New(m.lcTempFile, 0, ;
m.loRect, ;
.Imaging.MetafileFrameUnit.Pixel, ;
.Imaging.MetafileType.Emf)
* m.loEMF = .Imaging.Metafile.New(m.lcTempFile, 0, ;
m.loRect, ;
.Imaging.MetafileFrameUnit.Pixel, ;
.Imaging.MetafileType.EmfPlusDual)
m.loEMF = .Imaging.Metafile.New(m.lcTempFile, 0, ;
m.loRect, ;
.Imaging.MetafileFrameUnit.Pixel, ;
_Screen.System.Drawing.Imaging.MetafileType.EmfPlusOnly)
ASSERT m.loEMF.Handle <> 0 MESSAGE "Invalid EMF"
m.loGFX = .Graphics.FromImage(m.loEMF)
** Override the default Width, Height and Graphics
IF This._UseSmooth
loGfx.SmoothingMode = This.SmoothingMode
loGfx.TextRenderingHint = This.TextRenderingHint
loGfx.InterpolationMode = This.InterpolationMode
ENDIF
This.Draw(m.tnWidth, m.tnHeight, m.loGfx)
ENDWITH
m.loGFX = NULL
m.loEMF = NULL
m.loStream = NULL
m.loRect = NULL
SELECT (m.lnSelect)
RETURN m.lcTempFile
ENDPROC
PROCEDURE getextent
ENDPROC
PROTECTED PROCEDURE height_access
* If we are hosted in a Grid, the Height is invalid.
* We need to use the Grid's RowHeight
IF This._InForm AND This.Parent.BaseClass = "Column"
RETURN This.Parent.Parent.RowHeight
ENDIF
RETURN IIF(This._HeightOverride < 0, This.Height, This._HeightOverride)
ENDPROC
PROCEDURE Init
*********************************************************************
** Method: ImgCanvas.Init
**
** Initializes the ImageCanvas
**
** History:
** 2006/../..: BDurban - Coded
** 2007/12/23: CWollenhaupt - Fixed observations below
**
*********************************************************************
LOCAL lcPath
IF VARTYPE(_SCREEN.System) <> "O"
m.lcPath = ADDBS(JUSTPATH(SUBSTR(SYS(16), AT(" ",SYS(16),2)+1)))
DO CASE
CASE FILE("system.app")
DO ("system.app")
CASE FILE(m.lcPath+"system.app")
DO (m.lcPath+"system.app")
CASE FILE(m.lcPath+"system.prg")
DO (m.lcPath+"system.prg")
ENDCASE
ENDIF
This._InForm = TYPE("ThisForm")=="O"
This._IsInitialized = .T.
This.CreateOSB()
This.Controls=CREATEOBJECT("Collection")
This.Setup()
*========================================================================================
* Changes to the original class:
*
* - Bind the Form's Activate method to a new Activate method in this control. Previously
* the method was bound to Draw which forces a redraw. By redirecting this to Activate
* we can use additionally checks to confirm that we actually need to redraw the
* control. In addition, we only have to draw the control the first time the form is
* activated. After that any need to redraw is triggered by a Resize, the UIEnabled
* event or an explicit call to Draw.
*
* - Pages don't have a Resize event. In order to add this control a page it must respond
* to the PageFrame's Resize event after VFP completed the Resize event. Otherwise the
* PageWidth and PageHeight properties still contain the old values.
*
*========================================================================================
IF This._InForm
BINDEVENT(Thisform, "Activate", This, "Activate")
IF This.Parent.BaseClass == "Page"
BINDEVENT(This.Parent.Parent, "Resize", This, "Resize", 1)
ELSE
BINDEVENT(This.Parent, "Resize", This, "Resize")
ENDIF
ENDIF
ENDPROC
PROTECTED PROCEDURE interpolationmode_assign
LPARAMETERS vNewVal
THIS.InterpolationMode = m.vNewVal
This.oGfx.InterpolationMode = m.vNewVal
ENDPROC
PROTECTED PROCEDURE lredrawnow_assign
*********************************************************************
** Method: lRedrawNow_Assign
**
** History:
** 2007/12/23: CWollenhaupt - Coded - observations below
**
*********************************************************************
LPARAMETERS tlNow
*********************************************************************
* Force the control to resize itself. Draw additionaly ensures that we
** only draw the control when it is visible.
*********************************************************************
IF m.tlNow
This.lRedrawNow = .T.
This.Draw()
This.lRedrawNow = .F.
ENDIF
ENDPROC
PROTECTED PROCEDURE rectangle_access
IF VARTYPE(This.Rectangle) <> "O"
This.Rectangle = _SCREEN.System.Drawing.Rectangle.New(0,0,This.Width,This.Height)
ELSE
This.Rectangle.Width = This.Width
This.Rectangle.Height = This.Height
ENDIF
RETURN This.Rectangle
ENDPROC
PROCEDURE refresh && Repaints a Form or control and refreshes any values.
ENDPROC
PROTECTED PROCEDURE rendermode_assign
LPARAMETERS vNewVal
*To do: Modify this routine for the Assign method
THIS.RenderMode = m.vNewVal
This.CreateOSB()
ENDPROC
PROTECTED PROCEDURE renderosb
**************************************************************
* FUNCTION RenderOSB
*
* This PROTECTED method is called when the Image control needs
* to be updated to the screen.
**************************************************************
LOCAL llLockScreen
IF This._InForm
m.llLockScreen = ThisForm.LockScreen
ThisForm.LockScreen = .T.
ENDIF
DO CASE
CASE This.RenderMode = 0 && Memory BITMAP
This.PictureVal = This.oBmp.GetPictureValfromHBitmap()
CASE This.RenderMode = 1 && File BITMAP
IF EMPTY(This._tempfile)
This._tempfile = ADDBS(SYS(2023))+SYS(2015)+".bmp"
ELSE
This.Picture = ""
CLEAR RESOURCES (This._tempfile)
DELETE FILE (This._tempfile)
This._tempfile = ADDBS(SYS(2023))+SYS(2015)+".bmp"
ENDIF
This.oBmp.Save(This._tempfile, _Screen.System.Drawing.Imaging.ImageFormat.Bmp)
This.Picture = (This._tempfile)
CASE This.RenderMode = 4 && Memory PNG
** PNG PictureVal is only supported in SP2 and later
IF VERSION(4) >= "09.00.0000.5411" && "09.00.0000.5815" && VFP 9.0 SP2
This.PictureVal = This.oBmp.GetPictureVal(_Screen.System.Drawing.Imaging.ImageFormat.Png)
ELSE
** Default to BMP if SP1 or earlier
This.PictureVal = This.oBmp.GetPictureValfromHBitmap()
ENDIF
CASE This.RenderMode = 5 && File PNG
IF EMPTY(This._tempfile)
This._tempfile = ADDBS(SYS(2023))+SYS(2015)+".png"
ELSE
This.Picture = ""
CLEAR RESOURCES (This._tempfile)
DELETE FILE (This._tempfile)
This._tempfile = ADDBS(SYS(2023))+SYS(2015)+".png"
ENDIF
This.oBmp.Save(This._tempfile, _Screen.System.Drawing.Imaging.ImageFormat.Png)
This.Picture = (This._tempfile)
CASE This.RenderMode = 8 && File EMF
This.oGfx = NULL
LOCAL llLocked
IF This._InForm
m.llLocked = ThisForm.LockScreen
ThisForm.LockScreen = .T.
ENDIF
This.Picture = (This._tempFile)
IF This._InForm AND NOT ThisForm.LockScreen = m.llLocked
ThisForm.LockScreen = m.llLocked
ENDIF
ENDCASE
IF This._InForm
ThisForm.LockScreen = m.llLockScreen
ENDIF
RETURN
ENDPROC
PROCEDURE resize && Occurs when an object is resized.
IF This.Stretch = 0 AND This.Anchor > 0 && AND (m.nWidth <> This.Width OR m.nHeight <> This.Height)
This.Draw()
ENDIF
ENDPROC
PROCEDURE save
*********************************************************************
** Method: Save
**
** Saves an image of the current canvas object
**
** History:
** 2006/08/05: BDurban/CChalom - Added save method
** 2006/08/10: BDurban - Changed to use new oBMP property
*********************************************************************
LPARAMETERS tcFilename ;
, toEncoder AS xfcImageCodecInfo, toEncoderParams AS xfcEncoderParameters
LOCAL loExc
TRY
This.oBMP.Save(m.tcFilename, m.toEncoder, m.toEncoderParams)
CATCH TO m.loExc
THROW m.loExc
ENDTRY
ENDPROC
PROCEDURE setup
ENDPROC
PROTECTED PROCEDURE smoothingmode_assign
LPARAMETERS vNewVal
THIS.SmoothingMode = m.vNewVal
This.oGfx.SmoothingMode = m.vNewVal
ENDPROC
PROTECTED PROCEDURE textrenderinghint_assign
LPARAMETERS vNewVal
THIS.TextRenderingHint = m.vNewVal
This.oGfx.TextRenderingHint = m.vNewVal
ENDPROC
PROCEDURE UIEnable
*********************************************************************
** Method: ImgCanvas.UIEnable
**
** Occurs for all objects contained in a Page objects whenever the page is activated or deactivated
**
** History:
** 2007/12/23: CWollenhaupt - Coded - observations below
**
*********************************************************************
LPARAMETERS lEnable
*========================================================================================
* Using the form's Activate event only works for controls that reside on the form
* directly. It doesn't work for controls on a pageframe when the pageframe is anchored
* and resizes automatically. Controls on invisible pages aren't notified. Therefore we
* use the UIEnable event to redraw controls when the page becomes visible.
*========================================================================================
LOCAL lcNewSize
IF m.lEnable
m.lcNewSize = BINTOC(This.Width, "4rs") + BINTOC(This.Height, "4rs")
IF NOT This._cSize == m.lcNewSize
This.Draw()
ENDIF
ENDIF
ENDPROC
PROTECTED PROCEDURE width_access
** If we are hosted in a Grid, the width is invalid.
** We need to use the Column's width
IF This._InForm AND This.Parent.BaseClass = "Column"
RETURN This.Parent.Width
ENDIF
RETURN IIF(This._WidthOverride < 0, This.Width, This._WidthOverride)
ENDPROC
ENDDEFINE
DEFINE CLASS imgthemebase AS imgcanvas OF "gdiplusx.vcx"
*< CLASSDATA: Baseclass="image" Timestamp="" Scale="Pixels" Uniqueid="" />
*<DefinedPropArrayMethod>
*m: themestate_assign
*p: isxp
*p: themeclass
*p: themepart
*p: themestate
*</DefinedPropArrayMethod>
*<PropValue>
isxp = .F.
Name = "imgthemebase"
themeclass =
themepart = 0
themestate = 0
*</PropValue>
PROCEDURE beforedraw
IF NOT This.IsXP
RETURN
ENDIF
*!* Here's a super simple example
*!* There's more to this obviously, such as printing text on certain controls like Tabs or Buttons
*!* Anyways, I wanted to get most of the grunt work out of the way, now we can play
*!* Also, if you're wondering where I got all this stuff... I ripped and figured it out from a very impressive sample
*!* VB 6.0 application that Explores all of the stuff in uxtheme.dll
*!* http://www.vbaccelerator.com/home/vb/code/libraries/XP_Visual_Styles/Drawing_with_XP_Visual_Styles/article.asp
*!* I'd like us to make an example like what that guy did for this... only make it even better. :)
LOCAL System AS xfcSystem, lcThemeClass, ;
lnHDC, lnTheme, lqRectStruct
System = _SCREEN.System && NEWOBJECT("xfcSystem","System")
This.Clear()
WITH _SCREEN.System
m.lnTheme = OpenThemeData(0, This.ThemeClass) && Get ready to draw some theme stuff
IF m.lnTheme > 0
m.lnHDC = This.oGfx.GetHDC()
m.lqRectStruct = 0h00000000+0h00000000+BINTOC(This.Width,"4rs")+BINTOC(This.Height,"4rs")
hr=DrawThemeParentBackground(ThisForm.HWnd, m.lnHDC, @lqRectStruct)
** hr=DrawThemeBackground(lnTheme, lnHDC, EBP_NORMALGROUPCOLLAPSE, EBNGC_NORMAL, @lcRectStruct, @lcRectStruct)
hr=DrawThemeBackground(m.lnTheme, m.lnHDC, This.ThemePart, This.ThemeState, m.lqRectStruct, m.lqRectStruct)
This.oGfx.ReleaseHDC(m.lnHDC)
CloseThemeData(m.lnTheme)
ENDIF
ENDWITH
*!* One thing to keep in mind here is that we aren't anti-aliasing yet
*!* (VB 6.0 application didn't either) so the rendered controls look a little rough.
ENDPROC
PROCEDURE declaredll
DODEFAULT()
IF NOT This.IsXP
RETURN
ENDIF
TRY
imgThemeBaseDeclareDLL(0)
CATCH
DECLARE Long Sleep IN WIN32API AS imgThemeBaseDeclareDLL Long
*!* Here are the declares, as I haven't tested all of them there may be some that need adjusting
*!* most notably will be some of the ones that have a "LONG @" which may actually be STRING @ since
*!* they are looking for a structure
DECLARE LONG CloseThemeData IN UXTHEME LONG hTheme
DECLARE LONG DrawThemeBackground IN UXTHEME LONG hTheme, LONG hdc, LONG iPartId, LONG iStateId, STRING @pRect, STRING @pClipRect
DECLARE LONG DrawThemeBackgroundEx IN UXTHEME LONG hTheme, LONG hdc, LONG iPartId, LONG iStateId, LONG @pRect, STRING @poptions
DECLARE LONG DrawThemeEdge IN UXTHEME LONG hTheme, LONG hdc, LONG iPartId, LONG iStateId, LONG @pDestRect, uint egde, uint flags, LONG @pRect
DECLARE LONG DrawThemeIcon IN UXTHEME LONG hTheme, LONG hdc, LONG iPartId, LONG iStateId, LONG @pRect, LONG himl, LONG iImageIndex
DECLARE LONG DrawThemeParentBackground IN UXTHEME LONG hWnd, LONG hdc, STRING @pRect
DECLARE LONG DrawThemeText IN UXTHEME LONG hTheme, LONG hdc, LONG iPartId, LONG iStateId, STRING text, LONG textLength, LONG textFlags, LONG textFlags2, LONG @pRect
DECLARE LONG EnableThemeDialogTexture IN UXTHEME LONG hWnd, STRING flags
DECLARE LONG EnableTheming IN UXTHEME LONG fEnable
DECLARE LONG GetCurrentThemeName IN UXTHEME STRING stringThemeName, LONG lengthThemeName, STRING stringColorName, LONG lengthColorName, STRING stringSizeName, LONG lengthSizeName
DECLARE STRING GetThemeAppProperties IN UXTHEME
DECLARE LONG GetThemeBackgroundContentRect IN UXTHEME LONG hTheme, LONG hdc, LONG iPartId, LONG iStateId, LONG @pBoundingRect, LONG @pContentRect
DECLARE LONG GetThemeBackgroundExtent IN UXTHEME LONG hTheme, LONG hdc, LONG iPartId, LONG iStateId, LONG @pRect, LONG @pClipRect
DECLARE LONG GetThemeBackgroundRegion IN UXTHEME LONG hTheme, LONG hdc, LONG iPartId, LONG iStateId, LONG @pRect, LONG @pRegion
DECLARE LONG GetThemeBool IN UXTHEME LONG hTheme, LONG iPartId, LONG iStateId, LONG iPropId, LONG @pfVal
DECLARE LONG GetThemeColor IN UXTHEME LONG hTheme, LONG iPartId, LONG iStateId, LONG iPropId, LONG @pColor
DECLARE LONG GetThemeDocumentationProperty IN UXTHEME STRING stringThemeName, STRING stringPropertyName, STRING @stringValue, LONG lengthValue
DECLARE LONG GetThemeEnumValue IN UXTHEME LONG hTheme, LONG iPartId, LONG iStateId, LONG iPropId, LONG @piVal
DECLARE LONG GetThemeFilename IN UXTHEME LONG hTheme, LONG iPartId, LONG iStateId, LONG iPropId, STRING themeFileName, LONG themeFileNameLength
DECLARE LONG GetThemeFont IN UXTHEME LONG hTheme, LONG hdc, LONG iPartId, LONG iStateId, LONG iPropId, LONG @pFont
DECLARE LONG GetThemeInt IN UXTHEME LONG hTheme, LONG iPartId, LONG iStateId, LONG iPropId, LONG @piVal
DECLARE LONG GetThemeIntList IN UXTHEME LONG hTheme, LONG iPartId, LONG iStateId, LONG iPropId, LONG @pIntList
DECLARE LONG GetThemeMargins IN UXTHEME LONG hTheme, LONG hdc, LONG iPartId, LONG iStateId, LONG iPropId, LONG @pMargins
DECLARE LONG GetThemeMetric IN UXTHEME LONG hTheme, LONG hDC, LONG iPartId, LONG iStateId, LONG iPropId, LONG @piVal
DECLARE LONG GetThemePartSize IN UXTHEME INTEGER hTheme, INTEGER hdc, INTEGER iPartId, INTEGER iStateId, INTEGER @pRect, INTEGER eSize, STRING @SIZE
DECLARE LONG GetThemePosition IN UXTHEME LONG hTheme, LONG iPartId, LONG iStateId, LONG iPropId, LONG @pPoint
DECLARE LONG GetThemePropertyOrigin IN UXTHEME LONG hTheme, LONG iPartId, LONG iStateId, LONG iPropId, LONG @pOrigin
DECLARE LONG GetThemeRect IN UXTHEME LONG hTheme, LONG iPartId, LONG iStateId, LONG iPropId, LONG @pRect
DECLARE LONG GetThemeString IN UXTHEME LONG hTheme, LONG iPartId, LONG iStateId, LONG iPropId, STRING @themeString, LONG themeStringLength
DECLARE LONG GetThemeSysBool IN UXTHEME LONG hTheme, LONG iBoolId
DECLARE LONG GetThemeSysBrush IN UXTHEME LONG hTheme, LONG iColorId
DECLARE LONG GetThemeSysColor IN UXTHEME LONG hTheme, LONG iColorId
DECLARE LONG GetThemeSysFont IN UXTHEME LONG hTheme, LONG iFontId, LONG @plf
DECLARE LONG GetThemeSysInt IN UXTHEME LONG hTheme, LONG iIntId, LONG @piVal
DECLARE LONG GetThemeSysSize IN UXTHEME LONG hTheme, LONG iSizeId
DECLARE LONG GetThemeSysString IN UXTHEME LONG hTheme, LONG iStringId, STRING @stringSys, LONG stringSysLength
DECLARE LONG GetThemeTextExtent IN UXTHEME LONG hTheme, LONG hdc, LONG iPartId, LONG iStateId, STRING text, LONG textLength, LONG textFlags, LONG @boundingRect, STRING @extentRect
DECLARE LONG GetThemeTextMetrics IN UXTHEME LONG hTheme, LONG hdc, LONG iPartId, LONG iStateId, STRING @textMetric
DECLARE LONG GetWindowTheme IN UXTHEME LONG hWnd
DECLARE LONG HitTestThemeBackground IN UXTHEME LONG hTheme, LONG hdc, LONG iPartId, LONG iStateId, LONG dwOptions, LONG @pRect, LONG hrgn, POINT ptTest, STRING @code
DECLARE LONG IsAppThemed IN UXTHEME
DECLARE LONG IsThemeActive IN UXTHEME
DECLARE LONG IsThemeBackgroundPartiallyTransparent IN UXTHEME LONG hTheme, LONG iPartId, LONG iStateId
DECLARE LONG IsThemeDialogTextureEnabled IN UXTHEME LONG hWnd
DECLARE LONG IsThemePartDefined IN UXTHEME LONG hTheme, LONG iPartId, LONG iStateId
DECLARE LONG OpenThemeData IN UXTHEME LONG hWnd, STRING classList
DECLARE LONG SetSystemVisualStyle IN UXTHEME STRING pszFilename, STRING pszColor, STRING pszSize, LONG dwReserved
DECLARE SetThemeAppProperties IN UXTHEME STRING props
DECLARE LONG SetWindowTheme IN UXTHEME LONG hWnd, STRING textSubAppName, STRING textSubIdList
ENDTRY
ENDPROC
PROCEDURE Init
This.IsXP = FILE(GETENV("windir")+"\system32\uxtheme.dll")
This.DeclareDll()
DODEFAULT()
ENDPROC
PROCEDURE themestate_assign
LPARAMETERS vNewVal
THIS.themestate = m.vNewVal
This.Draw()
ENDPROC
ENDDEFINE
DEFINE CLASS imgthemebutton AS imgthemebase OF "gdiplusx.vcx"
*< CLASSDATA: Baseclass="image" Timestamp="" Scale="Pixels" Uniqueid="" />
*<PropValue>
Height = 29
Name = "imgthemebutton"
themeclass = (STRCONV("Button"+0h00,5))
themepart = 1
themestate = 1
Width = 114
*</PropValue>
PROCEDURE MouseDown
LPARAMETERS nButton, nShift, nXCoord, nYCoord
This.ThemeState = 3
ENDPROC
PROCEDURE MouseEnter
LPARAMETERS nButton, nShift, nXCoord, nYCoord
This.ThemeState = 2
ENDPROC
PROCEDURE MouseLeave
LPARAMETERS nButton, nShift, nXCoord, nYCoord
This.ThemeState = 1
ENDPROC
PROCEDURE MouseUp
LPARAMETERS nButton, nShift, nXCoord, nYCoord
This.ThemeState = 2
ENDPROC
ENDDEFINE
DEFINE CLASS imgthemeclock AS imgthemebase OF "gdiplusx.vcx"
*< CLASSDATA: Baseclass="image" Timestamp="" Scale="Pixels" Uniqueid="" />
*<PropValue>
Height = 94
Name = "imgthemeclock"
themeclass = (STRCONV("Clock"+0h00,5))
themepart = 1
themestate = 1
Width = 99
*</PropValue>
ENDDEFINE
DEFINE CLASS imgthemeprogressbar AS imgthemebase OF "gdiplusx.vcx"
*< CLASSDATA: Baseclass="image" Timestamp="" Scale="Pixels" Uniqueid="" />
*<PropValue>
Height = 20
Name = "imgthemeprogressbar"
themeclass = (STRCONV("Progress"+0h00,5))
themepart = 1
themestate = 1
Width = 207
*</PropValue>
ENDDEFINE
DEFINE CLASS imgthemetoolbarbutton AS imgthemebase OF "gdiplusx.vcx"
*< CLASSDATA: Baseclass="image" Timestamp="" Scale="Pixels" Uniqueid="" />
*<PropValue>
Height = 37
Name = "imgthemetoolbarbutton"
themeclass = (STRCONV("Toolbar"+0h00,5))
themepart = 1
themestate = 1
Width = 37
*</PropValue>
PROCEDURE MouseDown
LPARAMETERS nButton, nShift, nXCoord, nYCoord
This.ThemeState = 3
ENDPROC
PROCEDURE MouseEnter
LPARAMETERS nButton, nShift, nXCoord, nYCoord
This.ThemeState = 2
ENDPROC
PROCEDURE MouseLeave
LPARAMETERS nButton, nShift, nXCoord, nYCoord
This.ThemeState = 1
ENDPROC
PROCEDURE MouseUp
LPARAMETERS nButton, nShift, nXCoord, nYCoord
This.ThemeState = 2
ENDPROC
ENDDEFINE