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... :roll:

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... :roll: :roll: :roll:

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...