Page 1 sur 1

Avec les API je suis pas API

Publié : lun. 06/août/2007 21:12
par Jeff
Bonjour à tous,

A partir du post de Flype (voir ci-après) sur les timers et l'utilisation des API
Flype a écrit :et concernant le fonctionnement,

dans cet exemple tu es confronté à 3 choses différentes.

1/ du langage purebasic
2/ une fonction de l'API Win32 (SetTimer)
3/ une fonction 'callback' qui sont si particulières au début.

une fonction callback est une fonction que l'on écrit soi meme (ici TimerProc) mais dont on doit absolument respecter le nombre et le type des arguments (ici hwnd.l, uMsg.l, idEvent.l, dwTime.l) spécifiés par microsoft.

http://msdn2.microsoft.com/en-us/library/ms644907.aspx

une fois écrite, cette fonction pourra être utilisée en la 'passant' à la fonction SetTimer() grace au caractère @ qui indique l'adresse mémoire de la fonction callback (TimerProc).

et donc le but final, est que SetTimer() appelle tout les x temps la fonction callback, indépendamment de ton code principal qui gère le reste de l'application.

en espèrant être assez clair.
J'ai essayé de regarder le site lié et les forum (Fr & Uk) et plus je lis moins je comprends.

En plus des fonctions API, des callback il y a les sendmessage... :twisted:

Mon exemple de départ, peut-être trop compliqué est d'utiliser la fonction ListView_SetBkImage Macro afin de mettre une image dans un list view http://msdn2.microsoft.com/en-us/library/ms671182.aspx
documentation a écrit :"Sets the background image in a list-view control. You can use this macro or send the LVM_SETBKIMAGE message explicitly.

Syntax

BOOL ListView_SetBkImage(

HWND hwndLV,
LPLVBKIMAGE plvbki
);

Parameters

hwndLV
A handle to the list-view control.
plvbki
A pointer to an LVBKIMAGE structure that contains the new background image information.

Return Value

Returns nonzero if successful, or zero otherwise. Returns zero if the ulFlags member of the LVBKIMAGE structure is LVBKIF_SOURCE_NONE.

Remarks

Because the list-view control uses OLE COM to manipulate the background images, the calling application must call CoInitialize or OleInitialize before using this macro. It is best to call one of these functions when the application is initialized and call either CoUninitialize or OleUninitialize when the application is terminating.
Quel type de données sont HWND hwndLV, LPLVBKIMAGE plvbki ? Il me semble avoir vu un post sur les types de données des paramètres mais je ne le retrouve plus

en cliquant sur le lien sur la structure LVBIMAGE on a les infos suivantes

documentation a écrit :"
LVBKIMAGE Structure

Contains information about the background image of a list-view control. This structure is used for both setting and retrieving background image information.

Syntax

typedef struct tagLVBKIMAGE {
ULONG ulFlags;
HBITMAP hbm;
LPTSTR pszImage;
UINT cchImageMax;
int xOffsetPercent;
int yOffsetPercent;
} LVBKIMAGE, *LPLVBKIMAGE;
Autre methode proposée SENDMESSAGE

LVM_SETBKIMAGE Message
documentation a écrit :"Sets the background image in a list-view control. You can send this message explicitly or by using the ListView_SetBkImage macro.

Syntax

To send this message, call the SendMessage function as follows.

lResult = SendMessage( // returns LRESULT in lResult
(HWND) hWndControl, // handle to destination control
(UINT) LVM_SETBKIMAGE, // message ID
(WPARAM) wParam, // = 0; not used, must be zero
(LPARAM) lParam // = (LPARAM) (LPLVBKIMAGE) plvbki;
);

Parameters

wParam
Must be zero.
plvbki
Pointer to a LVBKIMAGE structure that contains the new background image information.

Return Value

Returns nonzero if successful, or zero otherwise. Returns zero if the ulFlags member of the LVBKIMAGE structure is LVBKIF_SOURCE_NONE.



Quelqu'un aurait-il un code pour je puisse faire des essais et comprendre le principe de raisonnement à avoir pour utiliser les fonctions API ; La documentation de microsoft étant un peu aride pour un débutant ?

Merci d'avance à tous

JF

Publié : lun. 06/août/2007 22:49
par Flype
Effectivement le système Win32 est très austère de prime abord.

C'est bien pour çà que PureBasic existe. Lui au moins il simplifie les choses.
Tout est plus clair. Mais comme il est forcément moins fournit en fonctions que le système hôte (win, linux, mac) il manque des choses.

Du coup, on passe par Win32 (sur windows donc) mais sa programmation requiert une habitude certaine (tout comme gtk sur linux par example) ceci dit cà s'apprend et si cà a l'air si compliqué c'est que dans la tête des programmeurs microsfot cà avait du sens (et souvent çà en a heureusement, quoique dès fois il y a des fonctions qui me dépassent).
Il faut s'habituer à la doc microsoft, elle est ainsi faite.

bref, déjà voici comment mettre en oeuvre la macro dont tu parles.

regardes, et ensuite demande si bloque sur des points en particulier.

Code : Tout sélectionner

;----------------------------------------------------------------------------------
; Chemin de l'image de fond
;----------------------------------------------------------------------------------


Image$ = #PB_Compiler_Home + "\Examples\Sources\Data\terrain_texture.jpg"


;----------------------------------------------------------------------------------
; Définition des constantes Win32 pour les contrôles de type ListView
;----------------------------------------------------------------------------------


#LVBKIF_SOURCE_NONE    = 0
#LVBKIF_SOURCE_HBITMAP = 1
#LVBKIF_SOURCE_URL     = 2
#LVBKIF_SOURCE_MASK    = 3

#LVBKIF_STYLE_NORMAL   = 0
#LVBKIF_STYLE_TILE     = $10
#LVBKIF_STYLE_MASK     = $10

#LVM_SETBKIMAGE  = #LVM_FIRST + 68
#LVM_SETBKIMAGEW = #LVM_FIRST + 138
#LVM_GETBKIMAGE  = #LVM_FIRST + 69
#LVM_GETBKIMAGEW = #LVM_FIRST + 139


;----------------------------------------------------------------------------------
; Définition de la structure LVBKIMAGE pour les contrôles de type ListView
; http://msdn2.microsoft.com/en-us/library/ms670562.aspx
;----------------------------------------------------------------------------------


Structure LVBKIMAGE
  ulFlags.l
  hbm.l
  pszImage.l
  cchImageMax.l
  xOffsetPercent.l
  yOffsetPercent.l
EndStructure


;----------------------------------------------------------------------------------
; Définition des Macros Win32 pour les contrôles de type ListView
; http://msdn2.microsoft.com/en-us/library/bb545712.aspx
;----------------------------------------------------------------------------------


Macro ListView_SetBkImage(hwndLV, plvbki)
  SendMessage_(hwndLV, #LVM_SETBKIMAGE, 0, plvbki)
EndMacro

Macro ListView_SetBkColor(hwndLV, clrBk)
  SendMessage_(hwndLV, #LVM_SETBKCOLOR, 0, clrBk)
EndMacro

Macro ListView_SetTextBkColor(hwndLV, clrBk)
  SendMessage_(hwndLV, #LVM_SETTEXTBKCOLOR, 0, clrBk)
EndMacro

Macro ListView_SetTextColor(hwndLV, clrBk)
  SendMessage_(hwndLV, #LVM_SETTEXTCOLOR, 0, clrBk)
EndMacro


;----------------------------------------------------------------------------------
; Définition d'une Macro perso (à titre de comparaison)
; Remplace les tout les '\n' dans une chaine de caractère par un 'LineFeed'.
;----------------------------------------------------------------------------------


Macro Formater(string)
  ReplaceString(string, "\n", Chr(10))
EndMacro


;----------------------------------------------------------------------------------
; Example d'utilisation - ListIconGadget avec une image de fond (Win32 uniquement).
;----------------------------------------------------------------------------------


; Initialisation de la bibliothèque COM.

CoInitialize_(0) 

If OpenWindow(0, 320, 240, 640, 480, "", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
  
  If CreateGadgetList(WindowID(0))
    
    ListIconGadget(0, 5, 5, 630, 475, "Col0", 150, #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    
    SetGadgetFont(0, LoadFont(0, "Tahoma", 12, #PB_Font_Bold))
    
    ; Remplissage du ListIcon
    
    AddGadgetColumn(0, 1, "Col1", 150)
    AddGadgetColumn(0, 2, "Col2", 150)
    AddGadgetColumn(0, 3, "Col3", 150)
    
    For i = 0 To 500
      AddGadgetItem(0, 0, Formater("PureBasic\nFeel\nThe Pure\nPower"), 0)
    Next
    
    ; Utilisation des Macros Win32 pour changer la couleur des lignes du ListIcon.
    
    ListView_SetBkColor(GadgetID(0), #Gray)
    ListView_SetTextColor(GadgetID(0), #Blue)
    ListView_SetTextBkColor(GadgetID(0), #CLR_NONE)
    
    ; Utilisation des Macros Win32 pour changer l'image de fond du ListIcon.
    
    lbk.LVBKIMAGE
    lbk\ulFlags        = #LVBKIF_STYLE_NORMAL|#LVBKIF_SOURCE_URL|#LVBKIF_STYLE_TILE
    lbk\pszImage       = @Image$
    lbk\xOffsetPercent = 0
    lbk\yOffsetPercent = 0
    
    ListView_SetBkImage(GadgetID(0), lbk)
    
  EndIf
  
  ; Boucle PureBasic
  
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
  
EndIf

CoUninitialize_()

End



nb:

la doc microsoft (msdn) donne souvent des codes en c/c++.
il est intéressant de noter que même si la programmation Win32 apparait compliquée, elle reste beaucoup sympa a aborder en PureBasic qu'en C.
Et c'est exactement pour çà que j'apprécie ce langage :wink: (entre autres, il y a la communauté aussi).

Publié : mar. 07/août/2007 7:33
par Kwai chang caine
Bonjour FLYPEBATOR :D

Je viens d'essayer ton code et j'ai une erreur à la ligne 133 c'est à dire sur le END (Invalide memory access) 8O

C'est pas banal ça....

Peut etre un quelquechose mal refermé ?

Publié : mar. 07/août/2007 8:49
par Flype
oui effectivement. ca ne me le faisait pas sur mon pc à la maison...

je regarderais çà... il faut peut etre remettre l'image à 0 avant de fermer le programme.

Publié : mar. 07/août/2007 19:54
par Jeff
Flype, merci pour ton super code.

J'ai du pain sur la planche pour comprendre l'affaire :lol:

Merci encore pour l'aide

@+

JF

Publié : mar. 07/août/2007 20:24
par Flype
@GOLDOKWAI

C'est bizarre, je confirme que chez moi çà le fait pas.
Testé avec 4.02 et 4.10B2, XP SP2 Famille.

Et au travail, ca plante avec 4.02, XP SP2 PRO.

Publié : mar. 07/août/2007 20:40
par Jeff
sous vista et 4.02 RAS

Publié : mer. 08/août/2007 8:33
par Kwai chang caine
@ALFLYPOR

Pour moi c'est W2000 SP4 et v4.10.
Et je SurConfirme ça plante toujours

Mais c'est pas grave, c'etait juste pour info, comme je sais que tu es un amateur de la perfection :wink:

Publié : mer. 08/août/2007 18:35
par Flype
@KWAÏGOTH

ha bon çà se voit tant que çà ? :P

sinon, bon j'ai pas le trop de temps chercher,
je vais mettre le code sur le forum anglais.
il y a bien quelqu'un qui trouvera pour nous...

Publié : mer. 08/août/2007 20:30
par Ollivier
Idem que Kwaïnisation II

ça marche nickel sauf pour quitter: il atterrit sur End avec un gros tampon bien méchant "Invalid memory access".

A priori, ce n'est pas une erreur de pile.
Toute la partie principale peut être migrée dans une procédure, ça refait exactement la même.

>> Le seul moyen est d'enlever _CoUninitialize(), et là ça marche.

Sinon, joli la ListIcon!

XP PB4.10 IE

Code : Tout sélectionner

;---------------------------------------------------------------------------------- 
; Chemin de l'image de fond 
;---------------------------------------------------------------------------------- 


Global Image$ = #PB_Compiler_Home + "\Examples\Sources\Data\terrain_texture.jpg" 


;---------------------------------------------------------------------------------- 
; Définition des constantes Win32 pour les contrôles de type ListView 
;---------------------------------------------------------------------------------- 


#LVBKIF_SOURCE_NONE    = 0 
#LVBKIF_SOURCE_HBITMAP = 1 
#LVBKIF_SOURCE_URL     = 2 
#LVBKIF_SOURCE_MASK    = 3 

#LVBKIF_STYLE_NORMAL   = 0 
#LVBKIF_STYLE_TILE     = $10 
#LVBKIF_STYLE_MASK     = $10 

#LVM_SETBKIMAGE  = #LVM_FIRST + 68 
#LVM_SETBKIMAGEW = #LVM_FIRST + 138 
#LVM_GETBKIMAGE  = #LVM_FIRST + 69 
#LVM_GETBKIMAGEW = #LVM_FIRST + 139 


;---------------------------------------------------------------------------------- 
; Définition de la structure LVBKIMAGE pour les contrôles de type ListView 
; http://msdn2.microsoft.com/en-us/library/ms670562.aspx 
;---------------------------------------------------------------------------------- 


Structure LVBKIMAGE 
  ulFlags.l 
  hbm.l 
  pszImage.l 
  cchImageMax.l 
  xOffsetPercent.l 
  yOffsetPercent.l 
EndStructure 


;---------------------------------------------------------------------------------- 
; Définition des Macros Win32 pour les contrôles de type ListView 
; http://msdn2.microsoft.com/en-us/library/bb545712.aspx 
;---------------------------------------------------------------------------------- 


Macro ListView_SetBkImage(hwndLV, plvbki) 
  SendMessage_(hwndLV, #LVM_SETBKIMAGE, 0, plvbki) 
EndMacro 

Macro ListView_SetBkColor(hwndLV, clrBk) 
  SendMessage_(hwndLV, #LVM_SETBKCOLOR, 0, clrBk) 
EndMacro 

Macro ListView_SetTextBkColor(hwndLV, clrBk) 
  SendMessage_(hwndLV, #LVM_SETTEXTBKCOLOR, 0, clrBk) 
EndMacro 

Macro ListView_SetTextColor(hwndLV, clrBk) 
  SendMessage_(hwndLV, #LVM_SETTEXTCOLOR, 0, clrBk) 
EndMacro 


;---------------------------------------------------------------------------------- 
; Définition d'une Macro perso (à titre de comparaison) 
; Remplace les tout les '\n' dans une chaine de caractère par un 'LineFeed'. 
;---------------------------------------------------------------------------------- 


Macro Formater(string) 
  ReplaceString(string, "\n", Chr(10)) 
EndMacro 


;---------------------------------------------------------------------------------- 
; Example d'utilisation - ListIconGadget avec une image de fond (Win32 uniquement). 
;---------------------------------------------------------------------------------- 


; Initialisation de la bibliothèque COM. 
Procedure Main()
CoInitialize_(0) 

If OpenWindow(0, 320, 240, 640, 480, "", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget) 
  
  If CreateGadgetList(WindowID(0)) 
    
    ListIconGadget(0, 5, 5, 630, 475, "Col0", 150, #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect) 
    
    SetGadgetFont(0, LoadFont(0, "Tahoma", 12, #PB_Font_Bold)) 
    
    ; Remplissage du ListIcon 
    
    AddGadgetColumn(0, 1, "Col1", 150) 
    AddGadgetColumn(0, 2, "Col2", 150) 
    AddGadgetColumn(0, 3, "Col3", 150) 
    
    For i = 0 To 500 
      AddGadgetItem(0, 0, Formater("PureBasic\nFeel\nThe Pure\nPower"), 0) 
    Next 
    
    ; Utilisation des Macros Win32 pour changer la couleur des lignes du ListIcon. 
    
    ListView_SetBkColor(GadgetID(0), #Gray) 
    ListView_SetTextColor(GadgetID(0), #Blue) 
    ListView_SetTextBkColor(GadgetID(0), #CLR_NONE) 
    
    ; Utilisation des Macros Win32 pour changer l'image de fond du ListIcon. 
    
    lbk.LVBKIMAGE 
    lbk\ulFlags        = #LVBKIF_STYLE_NORMAL|#LVBKIF_SOURCE_URL|#LVBKIF_STYLE_TILE 
    lbk\pszImage       = @Image$ 
    lbk\xOffsetPercent = 0 
    lbk\yOffsetPercent = 0 
    
    ListView_SetBkImage(GadgetID(0), lbk) 
    
  EndIf 
  
  ; Boucle PureBasic 
  
  Repeat 
  Until WaitWindowEvent() = #PB_Event_CloseWindow 
  
EndIf 

;CoUninitialize_() 
EndProcedure

Main()



End


Publié : jeu. 09/août/2007 8:17
par Kwai chang caine
@OUAFLLIVER

Maintenant le code de FLYPBATOR marche aussi chez moi :D

Merci à vous deux