ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Fonctions de GDI+   



L'auteur

Mike Gagnon
Canada Canada
Membre Simple
# 0000000025
enregistré le 14/10/2004

Gagnon Mike
Pointe Cla H9R 3K8
de la société Carver Technologies Inc.
Fiche personnelle


Note des membres
pas de note

Contributions > 11 - GDI +

Fonctions de GDI+
# 0000000164
ajouté le 23/03/2005 22:29:28 et modifié le 29/03/2006
consulté 9899 fois
Niveau initié

Version(s) Foxpro :
VFP 9.0

Zoomer sur l'image
Description

Voici quelques fonctions utiles exposées par GDIPLUS.vcx

N.B. Il faut noter que lorsqu'on utlise des formulaires Top niveau (ou des formulaires avec les Scrollbars réglés autre que 0), lu formulaire lui-meme en composé deux deux formulaires (ou trois dans le cas de top niveau et scrollbars). Le formulaire parent est la portion entete et bordures, est le formulaire enfant (child) est la portion que nous préoccupe, la portion sans bordure à l'intérieur de la portion titre et bordure.

Exemple d'appel pour un formulaire REGULIER et trouver le hWnd

oGr.CreateFromHWND(Thisform.HWnd)

Pour faire appel à un formulaire Top niveau et trouver le HWnd

Declare Long GetWindow in Win32API Long, Long
#DEFINE GW_CHILD 5
oGr.CreateFromHWND( GetWindow(Thisform.HWnd,GW_CHILD) )

Code source :
&&1. Charger un image sur un formulaire et faire un rotation

PUBLIC oform1

oform1=NEWOBJECT("form1")
oform1.Show
RETURN
DEFINE CLASS form1 AS form
  Top = 2
  Left = 70
  Height = 481
  Width = 603
  DoCreate = .T.
  Caption = "Form1"
  nsavegraphicshandle = .F.
  Name = "Form1"
  ADD OBJECT command1 AS commandbutton WITH ;
    Top = 396, ;
    Left = 288, ;
    Height = 27, ;
    Width = 84, ;
    Caption = "Command1", ;
    Name = "Command1"
  PROCEDURE command1.Click
    lcPic = Getpict()
    lnAngle = 90
    Public oGr As GpGraphics Of Home(1)+"ffc/_gdiplus.vcx"
    oGr = Newobject('GpGraphics',Home(1)+'ffc/_gdiplus.vcx')
    oGr.CreateFromHWND(Thisform.HWnd)
    Public oLogoImage As GpImage Of Home(1)+"ffc/_gdiplus.vcx"
    oLogoImage = Newobject('GpImage',Home(1)+'ffc/_gdiplus.vcx')
    oLogoImage.CreateFromFile('c:\picturetest\logo1.jpg')
    oRect= Newobject( ;
      'GpRectangle',Home(1)+'ffc/_gdiplus.vcx','',5, 5, 289, 145)
    If  lnAngle > 0
      lnX = 100
      lnY = 100
      oGr.TranslateTransform(lnX, lnY, 0)
      oGr.RotateTransform(lnAngle, 0)
      oGr.TranslateTransform(-lnX, -lnY, 0)
    Endif
    oGr.DrawImageScaled( oLogoImage, oRect )
  ENDPROC
ENDDEFINE

&& 2 Ecrire du texte avec n'importe quel angle sur un formulaire

PUBLIC oform1
oform1=NEWOBJECT("form1")
oform1.Show
RETURN
DEFINE CLASS form1 AS form
  Top = 2
  Left = 70
  Height = 481
  Width = 603
  DoCreate = .T.
  Caption = "Texte avec un angle"
  nsavegraphicshandle = .F.
  Name = "Form1"
  ADD OBJECT command1 AS commandbutton WITH ;
    AutoSize = .T., ;
    Top = 396, ;
    Left = 288, ;
    Height = 27, ;
    Width = 71, ;
    Caption = "Clicker ici", ;
    Name = "Command1"
  ADD OBJECT text1 AS textbox WITH ;
    Height = 25, ;
    Left = 180, ;
    Top = 24, ;
    Width = 325, ;
    Name = "Text1"
  ADD OBJECT label1 AS label WITH ;
    Caption = "Texte", ;
    Height = 17, ;
    Left = 108, ;
    Top = 24, ;
    Width = 40, ;
    Name = "Label1"
  ADD OBJECT spinner1 AS spinner WITH ;
    Height = 24, ;
    Increment =   5.00, ;
    Left = 372, ;
    SpinnerHighValue = 360.00, ;
    SpinnerLowValue =   0.00, ;
    Top = 72, ;
    Width = 121, ;
    Name = "Spinner1"
  PROCEDURE command1.Click
    LOCAL lcText, lnAngle
    lcText = ALLTRIM(this.Parent.text1.Value)
    lnAngle = this.Parent.spinner1.value
    Local oGr As GpGraphics Of ffc/_gdiplus.vcx
    oGr = Newobject('GpGraphics',Home(1)+'ffc/_gdiplus.vcx')
    oGr.CreateFromHWND( Thisform.HWnd )
    oFont = Newobject('GpFont',Home(1)+'ffc/_gdiplus.vcx')
    oFont.Create"Arial" ;       && font name
    , 20 ;                      && size in units below
    ,1;   && attributes
    , 2 ;      && units
    )
    oBounds = Newobject( ;
      'GpRectangle',Home(1)+'ffc/_gdiplus.vcx','' ;
      , 200 ;
      , 50 ;
      , 289 ;
      , 145 ;
      )
    Local oFillColor As GpColor Of ffc/_gdiplus.vcx ;
      , oBrush As GpSolidBrush Of ffc/_gdiplus.vcx
    oFillColor = Newobject( ;
      'GpColor',Home(1)+'ffc/_gdiplus.vcx','' ;
      , 0,255,0 ) && green
    oBrush = Newobject( ;
      'GpSolidBrush'Home(1)+'ffc/_gdiplus.vcx''' ;
      , m.oFillColor )
    oStringFormat = Newobject( ;
      'GpStringFormat',Home(1)+'ffc/_gdiplus.vcx')
    oStringFormat.Create( )
    oStringFormat.Alignment = 2
    oStringFormat.LineAlignment = 2
    oBounds.W = oBounds.W - 4
    oBounds.H = oBounds.H - 4
    oBounds.X = oBounds.X + 4
    oBounds.Y = oBounds.Y + 4
    oBrush.BrushColor = 0xA8000000
    oGr.RotateTransform(lnAngle)
    oGr.DrawStringA( lcText ;
      , oFont, oBounds, oStringFormat, oBrush )
  ENDPROC
ENDDEFINE

&& Stoker un image, écrire du texte dans le coin gauche (date) et sauvegarder en JPEG sur un nouveau nom.

lcfile = GETPICT()
SET CENTURY on
Public oLogoImage As GpImage Of Home(1)+"ffc/_gdiplus.vcx"
oLogoImage = Newobject('GpImage',Home(1)+'ffc/_gdiplus.vcx')
oLogoImage.CreateFromFile(lcFile)
oRect= Newobject( ;
  'GpRectangle',Home(1)+'ffc/_gdiplus.vcx','',5, 5, 289, 145)
Public oGr As GpGraphics Of Home(1)+"ffc/_gdiplus.vcx"
oGr = Newobject('GpGraphics',Home(1)+'ffc/_gdiplus.vcx')
oGr.CreateFromImage(oLogoImage)
Local oFillColor As GpColor Of ffc/_gdiplus.vcx ;
  , oBrush As GpSolidBrush Of ffc/_gdiplus.vcx
oFillColor = Newobject( ;
  'GpColor',Home(1)+'ffc/_gdiplus.vcx','' ;
  , 200,200,200 ) && green
oBrush = Newobject( ;
  'GpSolidBrush'Home(1)+'ffc/_gdiplus.vcx''' ;
  , m.oFillColor )
oBounds = Newobject( ;
  'GpRectangle',Home(1)+'ffc/_gdiplus.vcx','' ;
  , 0 ;
  , 0 ;
  , 289 ;
  , 145 ;
  )
oLineColor = Newobject( ;
  'GpColor',Home(1)+'ffc/_gdiplus.vcx','', 0,0,100 )
oPen = Newobject('GpPen'Home(1)+'ffc/_gdiplus.vcx' )
oPen.Create( m.oLineColor, 3 )
oFont = Newobject('GpFont',Home(1)+'ffc/_gdiplus.vcx')
oFont.Create"Arial" ;       && font name
, 20 ;                      && size in units below
,1;   && attributes
, 2 ;      && units
)
oStringFormat = Newobject( ;
  'GpStringFormat',Home(1)+'ffc/_gdiplus.vcx')
oStringFormat.Create( )
oStringFormat.Alignment = 0
oStringFormat.Linealignment =0
oGr.DrawStringA(Dtoc(Date()), oFont, oBounds,oStringFormat,oBrush)
oLogoImage.Savetofile( "c:\example.jpg", ;
  "image/jpeg""quality=100" )

&& Effet 3 dimension sur les polices.

Public oform1
oform1=Newobject("form1")
oform1.Show
Return
Define Class form1 As Form
  Top = 2
  Left = 70
  Height = 481
  Width = 603
  DoCreate = .T.
  Caption = "Texte avec un angle"
  BACKCOLOR = RGB(255,255,255)
  nsavegraphicshandle = .F.
  Name = "Form1"
  Add Object command1 As CommandButton With ;
    AutoSize = .T., ;
    Top = 396, ;
    Left = 288, ;
    Height = 27, ;
    Width = 71, ;
    Caption = "Clicker ici", ;
    Name = "Command1"
  Add Object text1 As TextBox With ;
    Height = 25, ;
    Left = 180, ;
    Top = 24, ;
    Width = 325, ;
    Name = "Text1"
  Add Object label1 As Label With ;
    Caption = "Texte", ;
    Height = 17, ;
    Left = 108, ;
    Top = 24, ;
    Width = 40, ;
    Name = "Label1"
  Procedure command1.Click
  Local lcText
  lcText = Alltrim(This.Parent.text1.Value)
  Local oGr As GpGraphics Of ffc/_gdiplus.vcx
  oGr = Newobject('GpGraphics',Home(1)+'ffc/_gdiplus.vcx')
  oGr.CreateFromHWND( Thisform.HWnd )
  oFont = Newobject('GpFont',Home(1)+'ffc/_gdiplus.vcx')
  oFont.Create"Arial", 32,1, 2)
  oBounds = Newobject('GpRectangle',Home(1)+'ffc/_gdiplus.vcx','', 200, 50, 289, 145)
  oBounds2 = Newobject('GpRectangle',Home(1)+'ffc/_gdiplus.vcx','', 50, 20, 289, 145)
  Local oFillColor As GpColor Of ffc/_gdiplus.vcx ;
    , oBrush As GpSolidBrush Of ffc/_gdiplus.vcx
  oFillColor = Newobject('GpColor',Home(1)+'ffc/_gdiplus.vcx','', 0,0,0 )
  oFillColor2 = Newobject( ;
    'GpColor',Home(1)+'ffc/_gdiplus.vcx','', 255,255,255 )
  oBrush = Newobject('GpSolidBrush'Home(1)+'ffc/_gdiplus.vcx''', m.oFillColor )
  oBrush2 = Newobject('GpSolidBrush'Home(1)+'ffc/_gdiplus.vcx''', m.oFillColor2 )
  oStringFormat = Newobject('GpStringFormat',Home(1)+'ffc/_gdiplus.vcx')
  oStringFormat.Create( )
  oStringFormat.Alignment = 2
  oStringFormat.LineAlignment = 2
  oGr.DrawStringA( lcText, oFont, oBounds, oStringFormat, oBrush )
  oBounds.X = oBounds.X + 1
  oGr.DrawStringA( lcText , oFont, oBounds, oStringFormat, oBrush2 )
  Endproc
Enddefine

&& Convertir un image JPEG en grayscale (Tons de gris). L'idée est de replacer les valeurs RBG de chaque pixel par la moyenne de la somme des trois valeurs qui devient un ton de gris.

cImage = Getpict('jpg')
ConvertToGrayscale(cImage)

Function ConvertToGrayscale(lcImage)
  Set Classlib To Home()+'ffc/_gdiplus.vcx' Additive
  oLogoImage = Newobject('gpBitmap',Home()+'ffc/_gdiplus.vcx')
  oLogoImage.CreateFromFile(lcImage)
  Private x,Y,nColor
  lnWidth = oLogoImage.imagewidth
  lnHeight = oLogoImage.imageheight
  For Y=0 To lnHeight-1
      For x=0 To lnwidth-1
      WAIT WINDOW NOWAIT "Largeur en pixels: "+TRANSFORM(x)+", hauteur en pixels :" +TRANSFORM(y)
        nColor = oLogoImage.GetPixel(x,Y)
        oColor = Createobject("gpColor",nColor)
      oAvg = (oColor.Red+oColor.Green+oColor.Blue)/3
      oColor.set(INT(oAvg),INT(oAvg),INT(oAvg))
         oLogoImage.SetPixel(x,Y,oColor.ARGB)
    NEXT
  NEXT
  oLogoImage.SaveToFile("c:\ex.jpg","image/jpeg""quality=100" )
Endfunc



Commentaires
le 14/04/2005, FredA a écrit :
bien vu ton explication sur les forms (child ou zone client)
le 14/04/2005, Mike Gagnon a écrit :
Je croyais bien que tu verrais l'impact de cette révélation, et cela n'est pas juste pour GDI, mais cela se répercute sur d'autres accès au formulaire qui semblait un 'bug', mais qui est en fait génial.

www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2024.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3