GDIPLUS.DLL

Partagez votre expérience de PureBasic avec les autres utilisateurs.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

0% chez moi avec un P4 2,6
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

Entre 0 et 2% pour moi sur mon P4 2.8Ghz du boulot.
Image
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

Merci, ça me rassure... :P
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

Puis-je (pouvons-nous) voir le source de l'horloge, Mr Erix14 ?
Cà m'aiderait à faire des examples plus abouti pour l'archive que je mets en partage.

j'aimerais aussi m'essayer au double buffering avec GDI+.
à mon avis il faut créer un bitmap sur lequel on dessine avant de l'afficher à l'écran...
Image
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

OK, je viens de l'adapter pour ton XIncludeFile "gdiplus.pbi", comme cela ça fait un peu moins de code à poster :wink:
Si cela devait lancer la mode des Widgets avec PureBasic, par pitié soyez original, pas de Widget météo... :lol:
Puisqu'on en est là, je vais vous montrer sur quoi je travaille en ce moment : http://www.rx14.info/archives/PureSpy.exe
La partie librairie, pour voir les DLL utilisées par un processus est fonctionnel, mais c'est l'affichage qui ne l'est pas encore.
Sinon, Flype, la fonction GdipCreateBitmapFromResource, t'as réussi ?
Car avec UsePNGImageDecoder cela alourdit l'exe inutilement... :?

Code : Tout sélectionner

XIncludeFile "gdiplus.pbi"
Global GRAPH,Gdip
input.GdiplusStartupInput\GdiplusVersion = 1
GdiplusStartup(@Gdip,@input,0)

Procedure GetHombre(PosX.F,PosY.F,PosZ.F,*Hombre.POINTF)
     
     LumX.F = 0
     LumY.F = 0
     LumZ.F = 300
     
     mm.F = ( PosY - LumY ) / ( PosX - LumX )
     nn.F = ( PosZ - LumZ ) / ( PosX - LumX )
     qq.F = LumY - mm * LumX
     pp.F = LumZ - nn * LumX
     
     *Hombre\x =  - pp / nn
     *Hombre\y = mm * *Hombre\x + qq
     
EndProcedure
Procedure Gdip_Pen1(LineWidth.F,ARGB,StartCap,EndCap)
     GdipCreatePen1(ARGB,LineWidth,2,@Pen)
     GdipSetPenStartCap(Pen,StartCap)
     GdipSetPenEndCap(Pen,EndCap) 
     ProcedureReturn Pen
EndProcedure
Procedure Gdip_SetFontFamily(fontName.s)
     GdipCreateFontFamilyFromName(fontName,#Null,@Family)
     ProcedureReturn Family
EndProcedure
Procedure Gdip_DrawText(Texte.s,x.F,y.F,Width.F,Height.F,Font,Brush)
     R.RECTF\left = x  : R\top = y
     R\Width = Width : R\Height = Height
     GdipDrawString(GRAPH,Texte,-1,Font,R, #Null,Brush)
EndProcedure

CreateImage(0,160,160);{
hdc = StartDrawing(ImageOutput(0))
     
GdipCreateFromHDC(hdc,@GRAPH)
GdipSetSmoothingMode(GRAPH,2)
     
GdipCreateSolidFill(MAKECOLOR(0,255,255,255),@Brush)
GdipFillRectangleI(GRAPH, Brush, 0, 0, 160, 160)
GdipDeleteBrush(Brush)

GdipCreateSolidFill(MAKECOLOR(160,0,0,255),@Brush)
GdipFillEllipseI(GRAPH, Brush, 3, 3, 154, 154)
GdipDeleteBrush(Brush)

GdipCreateSolidFill(MAKECOLOR(200,255,255,255),@Brush)
GdipFillEllipseI(GRAPH, Brush, 3, 3, 154, 154)
GdipDeleteBrush(Brush)
Pen = Gdip_Pen1(3,MAKECOLOR(200,50,50,50),2,2)
GdipDrawEllipseI(GRAPH,Pen,2,2,155,155)
GdipDeletePen(Pen)

GdipCreateSolidFill(MAKECOLOR(127,50,50,50),@Brush)
Family = Gdip_SetFontFamily("Arial")
GdipCreateFont(Family,18,1,2,@Font) 
Gdip_DrawText("PureBasic",35,100,300,30,Font,Brush)
GdipDeleteFont(Font)
GdipCreateFont(Family,12,2,2,@Font) 
Gdip_DrawText("Erix14",60,120,300,30,Font,Brush)
GdipDeleteFont(Font)
GdipDeleteFontFamily(Family)
GdipDeleteBrush(Brush)

Pen = Gdip_Pen1(3,MAKECOLOR(127,0,0,0),2,2)
For t=0 To 11
     R.F = t * 30 - 90
     GdipDrawLineI(GRAPH,Pen,80+Cos(R*(3.14159265/180))*76,80+Sin(R*(3.14159265/180))*76,80+Cos(R*(3.14159265/180))*70,80+Sin(R*(3.14159265/180))*70)
Next
GdipDeletePen(Pen)

GdipDeleteGraphics(GRAPH)
StopDrawing();}

Global BrushFond = CreatePatternBrush_(ImageID(0))
Global Size.SIZE
Size\cx = 160 : Size\cy = 160
;/
Procedure HorlogeCallback(WindowID, message, wParam, lParam) 
     Select message 
          Case #WM_CREATE
          Case #WM_CLOSE ;{
               DestroyWindow_(WindowID) ;}
          Case #WM_DESTROY ;{
               GdiplusShutdown(Gdip)
               DeleteObject_(BrushFond)
               PostQuitMessage_(0) ;}
          Case #WM_CHAR ;{
               Select wParam
                    Case #VK_ESCAPE
                         SendMessage_(WindowID,#WM_CLOSE,0,0)
               EndSelect ;}
          Case #WM_RBUTTONDOWN ;{
               SendMessage_(WindowID,#WM_CLOSE,0,0) ;} 
          Case #WM_LBUTTONDOWN ;{
               ReleaseCapture_()
               SendMessage_(WindowID, #WM_NCLBUTTONDOWN, #HTCAPTION, 0);}
          Case #WM_TIMER ;{
               InvalidateRect_(WindowID, #Null, #False) ;}
          Case #WM_PAINT ;{
               hwndDC = BeginPaint_(WindowID,ps.PAINTSTRUCT)
               
               hdc = CreateCompatibleDC_(hwndDC)
               SelectObject_(hdc, ImageID(0))
               
               GdipCreateFromHDC(hdc,@GRAPH)
               GdipSetSmoothingMode(GRAPH,2) 
               
               SetRect_(rect.RECT,0,0,160,160)
               FillRect_(hdc, rect, BrushFond)
               ;/
               GetSystemTime_(@MonTime.SYSTEMTIME)
               ;/ H E U R E S
               heure = MonTime\wHour % 12 + 2
               ih.F = (360 * (heure * 60 + MonTime\wMinute)) / 720 - 90
               PosX.F = 80+Cos(ih*(3.14159265/180))*45
               PosY.F = 80+Sin(ih*(3.14159265/180))*45
               GetHombre(PosX,PosY,6,@Hombre.POINTF)
               
               Pen = Gdip_Pen1(4,MAKECOLOR(80,0,0,100),2,20)
               GdipDrawLine(GRAPH,Pen,81,81,Hombre\x,Hombre\y)
               GdipDeletePen(Pen)
               
               Pen = Gdip_Pen1(4,MAKECOLOR(200,40,40,40),2,20)
               GdipDrawLine(GRAPH,Pen,80,80,PosX,PosY)
               GdipDeletePen(Pen)
               ;/ M I N U T E S
               im.F = (360 * (MonTime\wMinute * 60 + MonTime\wSecond)) / 3600 - 90
               PosX.F = 80+Cos(im*(3.14159265/180))*60
               PosY.F = 80+Sin(im*(3.14159265/180))*60
               GetHombre(PosX,PosY,8,@Hombre)
               
               Pen = Gdip_Pen1(4,MAKECOLOR(80,0,0,100),2,20)
               GdipDrawLine(GRAPH,Pen,81,81,Hombre\x,Hombre\y)
               GdipDeletePen(Pen)
               
               GdipDeletePen(Pen)
               Pen = Gdip_Pen1(4,MAKECOLOR(200,40,40,40),2,20)
               GdipDrawLine(GRAPH,Pen,80,80,PosX,PosY)
               GdipDeletePen(Pen)
               ;/ S E C O N D E S
               is.F = (360 * (MonTime\wSecond * 1000 + MonTime\wMilliseconds)) / 60000 - 90
               PosX.F = 80+Cos(is*(3.14159265/180))*64
               PosY.F = 80+Sin(is*(3.14159265/180))*64
               GetHombre(PosX,PosY,10,@Hombre)
               
               Pen = Gdip_Pen1(3,MAKECOLOR(80,0,0,100),2,2)
               GdipDrawLine(GRAPH,Pen,81,81,Hombre\x,Hombre\y)
               GdipDeletePen(Pen)
               
               Pen = Gdip_Pen1(3,MAKECOLOR(200,255,0,0),2,2)
               GdipDrawLine(GRAPH,Pen,80,80,PosX,PosY)
               GdipDeletePen(Pen)
               ;/ C E N T R E
               GdipCreateSolidFill(MAKECOLOR(80,0,0,100),@Brush)
               GdipFillEllipseI(GRAPH, Brush, 74, 74, 14, 14)
               GdipDeleteBrush(Brush)
               
               GdipCreateSolidFill(MAKECOLOR(250,200,0,0),@Brush)
               GdipFillEllipseI(GRAPH, Brush, 73, 73, 14, 14)
               GdipDeleteBrush(Brush)
               ;/
               ContextOffset.POINT
               BlendMode.BLENDFUNCTION
               BlendMode\SourceConstantAlpha = 246
               BlendMode\AlphaFormat = 1
               
               UpdateLayeredWindow_(WindowID, hwndDC, 0, @Size, hdc, @ContextOffset, 0, @BlendMode, 2)
               
               GdipDeleteGraphics(GRAPH)
               DeleteDC_(hdc)
               
               EndPaint_(WindowID,ps) ;} 
     EndSelect 
     ProcedureReturn DefWindowProc_(WindowID, message, wParam, lParam) 
EndProcedure
;- Debut Programme
;{/ Create Window
wc.WNDCLASSEX 
wc\cbSize = SizeOf(WNDCLASSEX)
hInstance = GetModuleHandle_(#Null)
If GetClassInfoEx_(hInstance,@"Horloge",@wc) = 0
     wc.WNDCLASSEX 
     wc\cbSize = SizeOf(WNDCLASSEX) 
     wc\style = #CS_HREDRAW|#CS_VREDRAW|#CS_BYTEALIGNWINDOW 
     wc\lpfnWndProc = @HorlogeCallback() 
     wc\hCursor = LoadCursor_(#Null,#IDC_ARROW)
     wc\hInstance = hInstance 
     wc\lpszClassName = @"Horloge" 
     If RegisterClassEx_(@wc) = 0
          End
     EndIf
EndIf
hWndMain  = CreateWindowEx_($00080088,"Horloge","Horloge",$96000000,50,50,160,160,0,0,hInstance,0) 
InvalidateRect_(hWndMain, #Null, #False)
SetTimer_(hWndMain,0,40,0)
;}/
While GetMessage_(msg.MSG,#Null,0,0) 
     TranslateMessage_(msg) 
     DispatchMessage_(msg) 
Wend
End
Dernière modification par erix14 le lun. 17/juil./2006 13:47, modifié 1 fois.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Qu'entendez vous par widget ?
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

C'est bien sympathique tout ça.

Note mesquine : #Pi existe dans les résidents depuis la V4. :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

Qu'entendez vous par widget ?
Voici les Widgets d'Opera : http://widgets.opera.com/time/
Mais ce n'est pas les seul à proposer ça, sous Mac c'est assez populaire... essaie de faire une capture d'écran sur un Widget :wink:
Note mesquine : #Pi existe dans les résidents depuis la V4.
c'est noté :lol:
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

excitant tout çà...
Sinon, Flype, la fonction GdipCreateBitmapFromResource, t'as réussi ?
pas eu le temps en fait, j'ai surtout travaillé sur le wrapper GDI+.
mais je regarderais c'est sûr.
sinon désolé de prendre du retard sur la lib MySQL (je pense à proggy surtout), je m'intéresse à GDI+ pour mon travail, et dieu sait que mon travail reste prioritaire sur le forum ( enfin quoique, shhhhut :) ). mais vendredi j'suis en vacances tralalalala...



sinon erix14, tu n'as plus besoin de te faire ch***

avec les fonctions :

GdipAlloc()
GdipFree()
MultiByteToWideChar_()

pour les fonctions :

GdipDrawString()
GdipCreateFontFamilyFromName()

c'est vrai que GDI+ travaille uniquement en unicode, mais grace aux pseudotypes déclarés comme il faut dans l'include tu peux passer directement la chaine sans avoir à la transformer ;-)
Image
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

Merci Flype, je viens de rééditer mon code. Petit à petit je m'adapte à la v4 de PureBasic, mais je crois qu'il va falloir que je lise l'aide, car je vois que je suis à la traîne par rapport à vous. :)
Coolman
Messages : 432
Inscription : sam. 01/janv./2005 16:07

Message par Coolman »

Je teste rarement les exes (ou sous vmplayer avec emulation session test winxp), mais puisque le code source est fourni, j'etais curieux de voir, impressionant, bravo. pour les ressources, pas de probleme 0%, bizarrement en compilé, ca monte un peu +2%... :)
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

Merci Coolman de ta confiance. Surtout n'exécute pas PureSpy.exe, vu le nom moi j'aurais peur :lol:
Coolman
Messages : 432
Inscription : sam. 01/janv./2005 16:07

Message par Coolman »

erix14 a écrit :Merci Coolman de ta confiance. Surtout n'exécute pas PureSpy.exe, vu le nom moi j'aurais peur :lol:
8O 8O 8O 8O, Hors de question, moi pas not jamais executer PureSpy :lol:

Il ne s'agit pas de confiance, je ne teste pas sur mon ord de travail, mais j'en ai un autre plus eloigné sur lequel je peux le faire :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Je n'arrive pas à faire fonctionner cette fonction:

Code : Tout sélectionner

*token = Gdiplus_New()

If OpenWindow(0, 0, 0, 800, 600, "test", #PB_Window_ScreenCentered | #PB_Window_SystemMenu) 
  If Gdiplus_StartDrawing(WindowOutput(0)) 
     Gdiplus_Ellipse(100, 100, 50, 50, RGB(255,0,0) )
    Gdiplus_StopDrawing() 
  EndIf
  Repeat 
  Until WaitWindowEvent() = #PB_Event_CloseWindow 
  Quitter = #True
EndIf 

GdiplusShutdown(*token)
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

Tu utilises mon include ? si oui la fonction Gdiplus_Ellipse() est une fonction rajoutée, il y a peut etre un probleme dans l'ancienne include.
J'ai bcp bossé depuis dessus... je mettrais à jour.

En attendant, essayes comme çà plutot, en utilisant la fonction d'origine, GdipDrawEllipseI().
Le 'I' c'est Integer, sinon sans le 'I' c'est pour des arguments en flottant.

Code : Tout sélectionner

XIncludeFile "gdiplus.pbi"

If OpenWindow(0, 0, 0, 640, 480, "GdiPlus 1.0", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
  
  ShowCursor_(#False)
  SetWindowColor(0, #Blue)
  
  *token = Gdiplus_New()
  
  GdipCreatePen1(ARGB(#White, 4), 30, 0, @*pen) 
  
  Repeat
    Select WaitWindowEvent()
      Case #WM_MOUSEMOVE
        *gfx = Gdiplus_StartDrawing(WindowOutput(0)) 
        For i = 0 To 5
          GdipDrawEllipseI(*gfx, *pen, WindowMouseX(0)+Random(50)-25, WindowMouseY(0)+Random(50)-25, Random(60), 30)
        Next
        Gdiplus_StopDrawing() 
      Case #PB_Event_CloseWindow
        Break
    EndSelect
  ForEver
  
  GdipDeletePen(*pen) 
  Gdiplus_Del(*token)

EndIf
Image
Répondre