Page 1 sur 1
[Résolu] Types de l'API et pointeurs, sos !
Publié : sam. 16/juil./2016 12:46
par JohnJohnsonSHERMAN
Je cherche a appeler des fonctions de l'API Windows, en particulier LoadCursorFromFile( LPCTSTR lpFileName), qui permet de charger un curseur perso... Seulement voilà, je ne sais pas de quel type PB est le "LPCTSTR"? Je pense qu'il s'agit d'un pointeur, mais je ne suis pas sûr...
J'ai fait ce petit bout de code pour charger un curseur perso, mais il ne fonctionne pas...
Code : Tout sélectionner
Prototype.i Proto_LoadCursorFromFile_(*lpFileName) ;Prototype... le type de lpFileName est un LPCTSTR de l'api... un pointeur?
If OpenLibrary(1,"user32.dll")
LoadCursor.Proto_LoadCursorFromFile_ = GetFunction(0,"LoadCursorFromFileW") ;on charge la fonction
cursorPath.s=OpenFileRequester("Curseur personnalisé","","Curseurs (.ani,.cur)|*.ani;*.cur|Tous les fichiers|*.*",0)
hCursor = LoadCursor(@cursorPath);et la... on balance l'adresse de cursorPath, puisque lpFileName est un pointeur? Ben non, erreur...
Else
MessageRequester("Erreur","Erreur d'accés a user32.dll.",16)
EndIf
If hCursor <> 0
;code ici
Else
MessageRequester("Erreur","Le curseur choisi n'est pas un curseur windows valide.",16)
EndIf
Alors ? Dans le prototype, de quel type dois-je déclarer lpFileName ? Que dois je passer à LoadCursor() pour charger mon curseur ?
Edit : Je me suis encore planté mais j'ai trouvé le probléme... je charge la dll avec le numéro 1 puis j'essaie d'y accédre avec le numéro 0... encore une faute d'attention...

Re: [Résolu] Types de l'API et pointeurs, sos !
Publié : sam. 16/juil./2016 17:19
par Zorro
sinon, tu peux aussi faire comme ça
prg a lancer tel quel sans modification
Code : Tout sélectionner
UsePNGImageDecoder()
Declare catchimage_net(adr$)
; va chercher une image valide (png) sur internet
adr$="http://files.softicons.com/download/system-icons/crystal-project-icons-by-everaldo-coelho/png/16x16/actions/jabber_original.png"
im=catchimage_net(adr$) ; cette fonction loadimage mais avec une adresse internet
ri=ResizeImage(im,64,64)
; image pour le mask
CreateImage(1, ImageWidth(im),ImageHeight(im))
StartDrawing(ImageOutput(1))
DrawImage(ImageID(im),0,0) ;4. Draw the bitmap onto Image#1
transcol=Point(0,0) ;5. Get the mask color at 0,0
For i=0 To ImageWidth(im)-1 ;6. Replace mask color pixels with #White And all other pixels with #Black
For j=0 To ImageHeight(im)-1
If Point(i,j)=transcol
Plot(i,j,#White)
Else
Plot(i,j,#Black)
EndIf
Next
Next
StopDrawing()
OpenWindow(0,0,0,640,480,"",#PB_Window_SystemMenu)
CanvasGadget(0, 10, 10, 200, 200,#PB_Canvas_ClipMouse)
;7. Fill in an ICONINFO Structure. (change xHotspot And yHotspot as desired)
icoInf.ICONINFO
icoInf\fIcon = #False
icoInf\xHotspot = 0
icoInf\yHotspot = 0
icoInf\hbmMask = ImageID(1)
icoInf\hbmColor = ri
;8. Create the cursor
customCursor = CreateIconIndirect_(icoInf)
;9. Set the window cursor
SetClassLong_(WindowID(0), #GCL_HCURSOR, customCursor) ;curseur avec la fenetre
;10. Set Canvas cursor
SetGadgetAttribute(0,#PB_Canvas_CustomCursor , customCursor) ;curseur avec Canvasgadget
Repeat
ev=WaitWindowEvent()
Until ev=#PB_Event_CloseWindow
DestroyIcon_(customCursor)
End
Procedure CatchImage_Net(Adr$)
InitNetwork()
Protected image
; By Ar-S
*Buffer = ReceiveHTTPMemory(Adr$)
If *Buffer
Image = CatchImage(#PB_Any, *Buffer, MemorySize(*Buffer) )
FreeMemory(*Buffer)
ProcedureReturn Image
Else
ProcedureReturn #false
EndIf
EndProcedure
Re: [Résolu] Types de l'API et pointeurs, sos !
Publié : sam. 16/juil./2016 18:07
par Zorro
autre solution :
Code : Tout sélectionner
; de netmaestro
;http://forums.purebasic.com/english/viewtopic.php?f=12&t=3763&hilit=%2A.cur&sid=2d4d6fc2d4c74d9d563b14e6176e1d3a
OpenWindow(0,0,0,320,240,"System Cursor Changer",#PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
ButtonGadget(0,100,100,100,20,"New Cursor")
ButtonGadget(1,100,130,100,20,"Old Cursor")
ButtonGadget(2,100,160,100,20,"Quit")
Repeat
quit=0
ev=WaitWindowEvent()
If ev=#PB_Event_Gadget
Select EventGadget()
Case 0
newcursor=LoadImage_(0,OpenFileRequester("Select a Cursor","c:\windows\cursors\","Cursors (*.cur)|*.cur",0),#IMAGE_CURSOR,0,0,#LR_LOADFROMFILE|#LR_DEFAULTSIZE)
oldcursor=GetCursor_() ;get a handle to the current cursor
oldcursor=CopyIcon_(oldcursor) ;save a copy of the cursor
If newcursor
SetSystemCursor_(newcursor, #OCR_NORMAL)
DisableGadget(0,1)
EndIf
Case 1
SetSystemCursor_(oldcursor, #OCR_NORMAL)
DisableGadget(0,0)
Case 2
SetSystemCursor_(oldcursor, #OCR_NORMAL)
quit=1
EndSelect
EndIf
Until quit
Re: [Résolu] Types de l'API et pointeurs, sos !
Publié : sam. 16/juil./2016 18:13
par JohnJohnsonSHERMAN
Comme édité dans mon premier message, tout fonctionne maintenant... cela dit ton premier code est intéressant dans la mesure ou n'importe quelle image peut servir, le seul bémol est l’accès a Internet, qui n'est pas toujours garanti (quoique de nos jours ce ne soit pas vraiment un probléme. Enfin merci quand même !
Re: [Résolu] Types de l'API et pointeurs, sos !
Publié : sam. 16/juil./2016 18:49
par Zorro
JohnJohnsonSHERMAN a écrit : le seul bémol est l’accès a Internet, qui n'est pas toujours garanti (quoique de nos jours ce ne soit pas vraiment un probléme.
ben dans ce cas, tu remplaces par un loadimage() ...
Re: [Résolu] Types de l'API et pointeurs, sos !
Publié : sam. 16/juil./2016 20:47
par JohnJohnsonSHERMAN
Oui évidemment...