Page 1 sur 1

Comment faire pour que notre gadget se comporte comme tel ?

Publié : mar. 28/févr./2006 21:11
par olivier
Resalut 8)

Bon le sujet n'est pas tres parlant.... :?

Voilà je viens de finir l'ébauche de mon gridgadget !
C'est un premier jet, ce n'est pas encore tres propres...

Une question me taraude ! Comment faire en sorte pour que les évenements qui gère se "gadget" ne soit pas à inscrire dans le code à chaque fois, ainsi que la callback.

Je voudrais juste déclarer mon gridgadget avec ses paramêtres, et ne rien d'autre avoir à mettre dans mon prog.

Voici mon code, merci d'avance :D

Code : Tout sélectionner

Enumeration #PB_Compiler_EnumerationValue
    #saisie
    #area_tableau
    #image_tableau
    #image_colonne_temp
    #image_colonne
    #image_ligne_temp
    #image_ligne
    #image_coin
    #image_coin_hg
    #image_coin_hd
    #image_coin_bg
    
EndEnumeration

#tab_x=10
#tab_y=10
#tab_l=400
#tab_h=400
#tab_nb_colonne=20
#tab_largeur_colonne=60
#tab_nb_ligne=100
#tab_hauteur_ligne=20
#tab_largeur_colonne_tete=20

Enumeration
    #Fenetre_base
EndEnumeration

Global der_x,der_y,der_c,der_l
Procedure lecture_tableau()
    Global Dim tarif(#tab_nb_colonne,#tab_nb_ligne)
    For i=0 To #tab_nb_ligne
        prix=20+Random(100)
        For j=0 To #tab_nb_colonne
            tarif(j,i)=prix*(j+1)
        Next
    Next
EndProcedure

Procedure deplace_ligne_colonne()
    
    pos_x=GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)
    pos_y=GetGadgetAttribute(#area_tableau,#PB_ScrollArea_y)
    CreateGadgetList(WindowID(#Fenetre_base))
    GrabImage(#image_colonne_temp, #image_colonne, pos_x, 0, #tab_l-#tab_largeur_colonne_tete-20, #tab_hauteur_ligne)
    ImageGadget(#image_colonne,#tab_x+#tab_largeur_colonne_tete+1,#tab_y,10,10,ImageID(#image_colonne))
    
    GrabImage(#image_ligne_temp, #image_ligne, 0, pos_y, #tab_largeur_colonne_tete, #tab_h-20-#tab_hauteur_ligne)
    ImageGadget(#image_ligne,#tab_x,#tab_y+#tab_hauteur_ligne+1,10,10,ImageID(#image_ligne))
EndProcedure

Procedure creation_ligne_colonne()
    
    CreateGadgetList(WindowID(#Fenetre_base))
    li=#tab_nb_colonne*#tab_largeur_colonne
    hi=#tab_nb_ligne*#tab_hauteur_ligne
    
    ;{- colonne
    CreateImage(#image_colonne_temp,li,#tab_hauteur_ligne)
    LoadFont(1, "Arial", 10) 
    StartDrawing(ImageOutput(#image_colonne_temp))
    Box(0, 0, li,hi,$AEAEAE)
    
    DrawingFont(FontID(1)) 
    DrawingMode(1)
    For i=1 To  #tab_hauteur_ligne/2
        LineXY(0,i,li,i,RGB(196+5*i,196+5*i,196+5*i)) 
        LineXY(0,#tab_hauteur_ligne-i,li,#tab_hauteur_ligne-i,RGB(196+5*i,196+5*i,196+5*i)) 
    Next
    
    
    For i=1 To #tab_nb_colonne
        LineXY( i*#tab_largeur_colonne-1,6,i*#tab_largeur_colonne-1, #tab_hauteur_ligne-6,$C5C5C5) 
        LineXY( i*#tab_largeur_colonne,4,i*#tab_largeur_colonne, #tab_hauteur_ligne-4,$585858) 
        LineXY( i*#tab_largeur_colonne+1,6,i*#tab_largeur_colonne+1, #tab_hauteur_ligne-6,$C5C5C5) 
        DrawText((i-1)*#tab_largeur_colonne+15, 3, Str(i))
    Next
    
    StopDrawing()
    
    ;}
    
    ;{- ligne
    CreateImage(#image_ligne_temp,#tab_largeur_colonne_tete,hi)
    LoadFont(1, "Arial", 10) 
    StartDrawing(ImageOutput(#image_ligne_temp))
    
    Box(0, 0, #tab_largeur_colonne,hi,$AEAEAE)
    
    DrawingFont(FontID(1)) 
    DrawingMode(1)
    For i=1 To  #tab_largeur_colonne_tete/2
        c=180
        LineXY(i,0,i,hi,RGB(c+5*i,c+5*i,c+5*i)) 
        LineXY(#tab_largeur_colonne_tete-i,0,#tab_largeur_colonne_tete-i,hi,RGB(c+5*i,c+5*i,c+5*i)) 
    Next
    
    For i=1 To #tab_nb_ligne
        LineXY(6,i*#tab_hauteur_ligne-1,#tab_largeur_colonne_tete-6,i*#tab_hauteur_ligne-1,$C5C5C5) 
        LineXY(4,i*#tab_hauteur_ligne,#tab_largeur_colonne_tete-4,i*#tab_hauteur_ligne,$585858) 
        LineXY(6,i*#tab_hauteur_ligne+1,#tab_largeur_colonne_tete-6,i*#tab_hauteur_ligne+1,$C5C5C5) 
        
        DrawText(#tab_largeur_colonne_tete/2-(TextWidth(Str(i))/2) , (i-1)*#tab_hauteur_ligne+2, Str(i))
    Next
    
    StopDrawing()
    
    ;}
    deplace_ligne_colonne()
EndProcedure

Procedure tableau()
    
    
    
    CreateGadgetList(WindowID(#Fenetre_base))
    li=#tab_nb_colonne*#tab_largeur_colonne
    hi=#tab_nb_ligne*#tab_hauteur_ligne
    
    creation_ligne_colonne()
    
    ScrollAreaGadget(#area_tableau,#tab_x+#tab_largeur_colonne_tete,#tab_y+#tab_hauteur_ligne,#tab_l-#tab_largeur_colonne_tete,#tab_h-#tab_hauteur_ligne,li,hi,20,#PB_ScrollArea_Single )
    OpenGadgetList(#area_tableau)
    StringGadget(#saisie,0,0,#tab_largeur_colonne,#tab_hauteur_ligne,"",#PB_String_Numeric)
    SetGadgetColor(#saisie,#PB_Gadget_BackColor,$F1B4B7)
    HideGadget(#saisie,1)
    CreateImage(#image_tableau,li,hi)
    LoadFont(1, "Arial", 10) 
    StartDrawing(ImageOutput(#image_tableau))
    Box(0, 0, li,hi,$FFFFFF)
    
    DrawingFont(FontID(1)) 
    For i=1 To #tab_nb_colonne
        LineXY( i*#tab_largeur_colonne,0,i*#tab_largeur_colonne, hi,$585858) 
        LineXY( i*#tab_largeur_colonne+1,0,i*#tab_largeur_colonne+1, hi,$C5C5C5) 
        ;DrawText(i*largeur_colonne+15, 3, Str(i))
    Next
    For i=1 To #tab_nb_ligne
        LineXY(0,i*#tab_hauteur_ligne,li,i*#tab_hauteur_ligne,$585858) 
        LineXY(0,i*#tab_hauteur_ligne+1,li,i*#tab_hauteur_ligne+1,$C5C5C5) 
        ;DrawText(5, i*hauteur_ligne+2, Str(i))
    Next
    ;DrawingMode(1)
    For i=0 To #tab_nb_ligne
        For j=0 To #tab_nb_colonne
            DrawText((j+1)*#tab_largeur_colonne-5-TextWidth(Str(tarif(j,i))) , (i)*#tab_hauteur_ligne+2, Str(tarif(j,i)))
        Next
    Next
    
    StopDrawing()
    ImageGadget(#image_tableau,0,0,l,h,ImageID(#image_tableau))
    ;{creation des coins
    CreateGadgetList(WindowID(#Fenetre_base))
    
    CreateImage(#image_coin,#tab_largeur_colonne_tete*2,#tab_largeur_colonne_tete*2)
    StartDrawing(ImageOutput(#image_coin))
    Box(0,0,#tab_largeur_colonne_tete*2,#tab_largeur_colonne_tete*2,$D2D2D2)
    DrawingMode(4)
    For i=1 To #tab_largeur_colonne_tete/2
        c=180
        Circle(#tab_largeur_colonne_tete,#tab_largeur_colonne_tete, i,RGB(c+5*i,c+5*i,c+5*i)) 
        Circle(#tab_largeur_colonne_tete,#tab_largeur_colonne_tete, #tab_largeur_colonne_tete-i,RGB(c+5*i,c+5*i,c+5*i)) 
    Next
    
    StopDrawing()
    GrabImage(#image_coin, #image_coin_hg, 0, 0, #tab_largeur_colonne_tete,#tab_largeur_colonne_tete)
    GrabImage(#image_coin, #image_coin_hd, #tab_largeur_colonne_tete, 0, #tab_largeur_colonne_tete,#tab_largeur_colonne_tete)
    GrabImage(#image_coin, #image_coin_bg, 0, #tab_largeur_colonne_tete, #tab_largeur_colonne_tete,#tab_largeur_colonne_tete)
    ImageGadget(#image_coin_hg,#tab_x,#tab_y,#tab_largeur_colonne_tete,#tab_hauteur_ligne,ImageID(#image_coin_hg))
    ImageGadget(#image_coin_hd,#tab_x+#tab_l-#tab_largeur_colonne_tete,#tab_y,#tab_largeur_colonne_tete,#tab_hauteur_ligne,ImageID(#image_coin_hd))
    ImageGadget(#image_coin_bg,#tab_x,#tab_y+#tab_h-#tab_largeur_colonne_tete,#tab_largeur_colonne_tete,#tab_hauteur_ligne,ImageID(#image_coin_bg))
    
    ;}
EndProcedure

Procedure choix_cellule(c,l,dep=-1)
    If GetAsyncKeyState_(#VK_SHIFT) >=0
        If GetActiveGadget()=#saisie
            If dep>0 ;{deplacement avec les fleche ou la touche entree
                Select dep
                    
                    Case 4 : c=der_c-1  : l=der_l 
                    Case 8 : c=der_c     : l=der_l -1
                    Case 6 : c=der_c+1 : l=der_l 
                    Case 2 : c=der_c     : l=der_l +1
                    Case 1 : c=#tab_nb_colonne-1: l=der_l  : SetGadgetAttribute(#area_tableau,#PB_ScrollArea_X, GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)+#tab_nb_colonne*#tab_largeur_colonne)
                    Case 7 : c=0: l=der_l  : SetGadgetAttribute(#area_tableau,#PB_ScrollArea_X, 0)
                        
                EndSelect
            EndIf
            ;}
        EndIf
        ;{verification du depacement dans le tableau
        If c>#tab_nb_colonne-1 : c=#tab_nb_colonne-1 : EndIf
        If c<0 : c=0 : EndIf
        If l>#tab_nb_ligne-1: l=#tab_nb_ligne-1 : EndIf
        If l<0 : l=0 : EndIf
        ;}
        
        ;{mise à jour du tableau : si la cullule est modifié choix de la couleur
        nv_text$=GetGadgetText(#saisie)
        If nv_text$<>"" And tarif(der_c,der_l)<>Val(nv_text$)
            tarif(der_c,der_l)=Val(nv_text$)
            couleur=$B3F2C2
        Else
            couleur=$FFFFFF
        EndIf
        ;}
        
        ;{ redessine le tableau
        StartDrawing(ImageOutput(#image_tableau))
        ;efface avec un dessin de couleur
        DrawingFont(FontID(1)) 
        Box(der_c*#tab_largeur_colonne+2,der_l*#tab_hauteur_ligne+2, #tab_largeur_colonne-2,#tab_hauteur_ligne-2,couleur)
        DrawingMode(1)
        DrawText((der_c+1)*#tab_largeur_colonne-5-TextWidth(Str(tarif(der_c,der_l))), der_l*#tab_hauteur_ligne+2, Str(tarif(der_c,der_l)))
        ;(j+1)*#tab_largeur_colonne-5-TextWidth(Str(tarif(j,i)))
        ; dessine la boite de selection de la cellule
        If dep<>0
            Box(c*#tab_largeur_colonne+2,l*#tab_hauteur_ligne+2, #tab_largeur_colonne-2,#tab_hauteur_ligne-2,$F1B4B7)
            
            StopDrawing()
            der_c=c
            der_l=l
            
            SetGadgetState(#image_tableau,ImageID(#image_tableau))
            OpenGadgetList(#area_tableau)
            StringGadget(#saisie,c*#tab_largeur_colonne+1,l*#tab_hauteur_ligne+1,#tab_largeur_colonne,#tab_hauteur_ligne,Str(tarif(c,l)),#PB_String_Numeric )
            SetGadgetColor(#saisie,#PB_Gadget_BackColor,$F1B4B7)
            SetActiveGadget(#saisie)
            ;SimulateKeyPress(35,200,0,0,1)
        Else
            der_c=0
            der_l=0
            StopDrawing()
            SetGadgetState(#image_tableau,ImageID(#image_tableau))
            HideGadget(#saisie,1)
            SetGadgetText(#saisie,"")
        EndIf
        
        ;}
        
        ;{ deplacement de la zone area
        If  GadgetX(#saisie)>GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)+#tab_l-#tab_largeur_colonne*2
            SetGadgetAttribute(#area_tableau,#PB_ScrollArea_X, GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)+#tab_largeur_colonne)
        Else
            If  GadgetX(#saisie)<GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)
                SetGadgetAttribute(#area_tableau,#PB_ScrollArea_X, GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)-#tab_largeur_colonne)
            EndIf
        EndIf
        
        If  GadgetY(#saisie)>GetGadgetAttribute(#area_tableau,#PB_ScrollArea_y)+#tab_h-#tab_hauteur_ligne*2
            SetGadgetAttribute(#area_tableau,#PB_ScrollArea_y, GetGadgetAttribute(#area_tableau,#PB_ScrollArea_y)+#tab_hauteur_ligne)
        Else
            If  GadgetY(#saisie)<GetGadgetAttribute(#area_tableau,#PB_ScrollArea_y)
                SetGadgetAttribute(#area_tableau,#PB_ScrollArea_y, GetGadgetAttribute(#area_tableau,#PB_ScrollArea_y)-#tab_hauteur_ligne)
            EndIf
        EndIf
        ;}
        deplace_ligne_colonne()
    EndIf
    
    
EndProcedure

Procedure clic_tableau()
    
    x_i=WindowMouseX(#Fenetre_base)-#tab_x+#tab_largeur_colonne_tete+GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)
    y_i=WindowMouseY(#Fenetre_base)-#tab_y+GetGadgetAttribute(#area_tableau,#PB_ScrollArea_y)
    ;SetCursorPos_(WindowX(#Fenetre_base)+ WindowMouseX(#Fenetre_base)+45,WindowY(#Fenetre_base)+WindowMouseY(#Fenetre_base)+25)
    num_col=x_i/#tab_largeur_colonne-1
    num_ligne=y_i/#tab_hauteur_ligne-1
    ;Debug Str(num_col)+" : "+Str(num_ligne)
    choix_cellule(num_col,num_ligne)
    
EndProcedure

Procedure valide_saisie()
    Debug GadgetX(#saisie)
    If GadgetX(#saisie)>#tab_l/2
        SetGadgetAttribute(#area_tableau,#PB_ScrollArea_X, GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)+#tab_largeur_colonne)
        creation_ligne_colonne()
    EndIf
    
    x_m=WindowX(#Fenetre_base)+ GadgetX(#area_tableau)-GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)+ GadgetX(#saisie)+#tab_largeur_colonne+5
    y_m=WindowY(#Fenetre_base)+ GadgetY(#area_tableau)+GadgetY(#saisie)-GetGadgetAttribute(#area_tableau,#PB_ScrollArea_y)+5+25
    ; #MOUSEEVENTF_LEFTDOWN
    ; #MOUSEEVENTF_LEFTUP
    SetCursorPos_(x_m,y_m)
    mouse_event_(#MOUSEEVENTF_ABSOLUTE | #MOUSEEVENTF_LEFTDOWN	,  x_m,y_m,0,0)
    mouse_event_(#MOUSEEVENTF_ABSOLUTE | #MOUSEEVENTF_LEFTUP,  x_m,y_m,0,0)
    
EndProcedure

Procedure defile_tableau()
    nv_x=GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)
    nv_y=GetGadgetAttribute(#area_tableau,#PB_ScrollArea_y)
    If der_x<>nv_x Or der_y<>nv_y
        der_x=nv_x
        der_y=nv_y
        creation_ligne_colonne()
    EndIf
EndProcedure

Procedure CallBack_base(Hnd,Msg,wParam,lParam)
    Resultat = #PB_ProcessPureBasicEvents
    
    ;{- fenetre de base
    If Hnd=WindowID(#Fenetre_base)
        If Msg=13103
            deplace_ligne_colonne()
        EndIf
        
    EndIf
    ;}
    
    
    ProcedureReturn Resultat
EndProcedure

If OpenWindow(#Fenetre_base, 463, 182, 500, 500,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "Prog base")
    If CreateGadgetList(WindowID(#Fenetre_base))
       
         SetWindowCallback(@CallBack_base(),#Fenetre_base)
        lecture_tableau()
        tableau()
        Repeat
            event=WaitWindowEvent()
            
            ;If event<>0 : Debug event : EndIf
            If EventWindow()=#Fenetre_base

                Select event
                    Case #WM_KEYDOWN 
                        
                        Debug EventwParam()
                        Select EventwParam()
                            
                            Case 36 ;tout en haut
                                choix_cellule(0,0,7)
                            Case 35 ;tout à la fin
                                choix_cellule(0,0,1)
                            Case 13
                                choix_cellule(0,0,6)
                            Case 37
                                choix_cellule(0,0,4)
                            Case 38
                                choix_cellule(0,0,8)
                            Case 39
                                choix_cellule(0,0,6)
                            Case 40
                                choix_cellule(0,0,2)
                            Case 27 ;escape
                                choix_cellule(0,0,0)
                                
                        EndSelect

                    Case #PB_Event_Gadget; *****************Choix d'un bouton
                        Select EventGadget()
                            

                            Case #image_tableau
                                clic_tableau()
                                
                        EndSelect
                        
                        
                      
                    Case #WM_CLOSE ; ***************************#PB_EventCloseWindow
                        Quit=1

                        
                EndSelect
            EndIf
            
        Until Quit = 1
    EndIf
EndIf

    
End 

Publié : mar. 28/févr./2006 22:07
par nico
Pas mal du tout! :)

Si j'ai bien compris, tu voudrais éviter d'avoir choix_cellule(0,0,7) dans ta fenêtre principale.

Le parent reçoit toujours les notifications, en sous classant l'ScrollAreaGadget tu devrais pouvoir récupérer les évènements mais je ne te le conseille pas, de toute façon il faudra bien gérer les évènements dans une boucle alors pourquoi ne pas garder ce que tu as fait.

Tu peux créer ta callback au moment de la création de ton gadget, et tout gérer dedans, non?

Publié : mer. 01/mars/2006 7:56
par olivier
Quelque bug corrigé...

Je n'arrive pas à récupérer les événement dans la callback lorsque je suis en saisie dans la stringgadget.... une idée ???

Peut on avoir plusieur callback sur une même fenetre ?

Code : Tout sélectionner

Enumeration #PB_Compiler_EnumerationValue
    #saisie
    #area_tableau
    #image_tableau
    #image_colonne_temp
    #image_colonne
    #image_ligne_temp
    #image_ligne
    #image_coin
    #image_coin_hg
    #image_coin_hd
    #image_coin_bg
    
EndEnumeration

#tab_x=50
#tab_y=50
#tab_l=400
#tab_h=400
#tab_nb_colonne=20
#tab_largeur_colonne=40
#tab_nb_ligne=100
#tab_hauteur_ligne=20
#tab_largeur_colonne_tete=20

Global der_x,der_y,der_c,der_l
Enumeration
    #Fenetre_base
EndEnumeration 

Declare CallBack_tableau(Hnd,Msg,wParam,lParam)

Procedure lecture_tableau()
    Global Dim tarif(#tab_nb_colonne,#tab_nb_ligne)
    For i=0 To #tab_nb_ligne
        prix=20+Random(100)
        For j=0 To #tab_nb_colonne
            tarif(j,i)=prix*(j+1)
        Next
    Next
EndProcedure

Procedure deplace_ligne_colonne()
    
    pos_x=GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)
    pos_y=GetGadgetAttribute(#area_tableau,#PB_ScrollArea_y)
    
    GrabImage(#image_colonne_temp, #image_colonne, pos_x, 0, #tab_l-#tab_largeur_colonne_tete-20, #tab_hauteur_ligne)
    SetGadgetState(#image_colonne,ImageID(#image_colonne))
    
    GrabImage(#image_ligne_temp, #image_ligne, 0, pos_y, #tab_largeur_colonne_tete, #tab_h-20-#tab_hauteur_ligne)
    SetGadgetState(#image_ligne,ImageID(#image_ligne))
EndProcedure

Procedure creation_ligne_colonne()
    
    CreateGadgetList(WindowID(#Fenetre_base))
    li=#tab_nb_colonne*#tab_largeur_colonne
    hi=#tab_nb_ligne*#tab_hauteur_ligne
    
    ;{- colonne
    CreateImage(#image_colonne_temp,li,#tab_hauteur_ligne)
    LoadFont(1, "Arial", 10) 
    StartDrawing(ImageOutput(#image_colonne_temp))
    Box(0, 0, li,hi,$AEAEAE)
    
    DrawingFont(FontID(1)) 
    DrawingMode(1)
    For i=1 To  #tab_hauteur_ligne/2
        LineXY(0,i,li,i,RGB(196+5*i,196+5*i,196+5*i)) 
        LineXY(0,#tab_hauteur_ligne-i,li,#tab_hauteur_ligne-i,RGB(196+5*i,196+5*i,196+5*i)) 
    Next
    
    
    For i=1 To #tab_nb_colonne
        LineXY( i*#tab_largeur_colonne-1,6,i*#tab_largeur_colonne-1, #tab_hauteur_ligne-6,$C5C5C5) 
        LineXY( i*#tab_largeur_colonne,4,i*#tab_largeur_colonne, #tab_hauteur_ligne-4,$585858) 
        LineXY( i*#tab_largeur_colonne+1,6,i*#tab_largeur_colonne+1, #tab_hauteur_ligne-6,$C5C5C5) 
        DrawText((i-1)*#tab_largeur_colonne+15, 3, Str(i))
    Next
    
    StopDrawing()
    
    ;}
    
    ;{- ligne
    CreateImage(#image_ligne_temp,#tab_largeur_colonne_tete,hi)
    LoadFont(1, "Arial", 10) 
    StartDrawing(ImageOutput(#image_ligne_temp))
    
    Box(0, 0, #tab_largeur_colonne,hi,$AEAEAE)
    
    DrawingFont(FontID(1)) 
    DrawingMode(1)
    For i=1 To  #tab_largeur_colonne_tete/2
        c=180
        LineXY(i,0,i,hi,RGB(c+5*i,c+5*i,c+5*i)) 
        LineXY(#tab_largeur_colonne_tete-i,0,#tab_largeur_colonne_tete-i,hi,RGB(c+5*i,c+5*i,c+5*i)) 
    Next
    
    For i=1 To #tab_nb_ligne
        LineXY(6,i*#tab_hauteur_ligne-1,#tab_largeur_colonne_tete-6,i*#tab_hauteur_ligne-1,$C5C5C5) 
        LineXY(4,i*#tab_hauteur_ligne,#tab_largeur_colonne_tete-4,i*#tab_hauteur_ligne,$585858) 
        LineXY(6,i*#tab_hauteur_ligne+1,#tab_largeur_colonne_tete-6,i*#tab_hauteur_ligne+1,$C5C5C5) 
        
        DrawText(#tab_largeur_colonne_tete/2-(TextWidth(Str(i))/2) , (i-1)*#tab_hauteur_ligne+2, Str(i))
    Next
    
    StopDrawing()
    
    ;}
    
    CreateGadgetList(WindowID(#Fenetre_base))
    GrabImage(#image_colonne_temp, #image_colonne, pos_x, 0, #tab_l-#tab_largeur_colonne_tete-20, #tab_hauteur_ligne)
    ImageGadget(#image_colonne,#tab_x+#tab_largeur_colonne_tete+1,#tab_y,10,10,ImageID(#image_colonne))
    
    GrabImage(#image_ligne_temp, #image_ligne, 0, pos_y, #tab_largeur_colonne_tete, #tab_h-20-#tab_hauteur_ligne)
    ImageGadget(#image_ligne,#tab_x,#tab_y+#tab_hauteur_ligne+1,10,10,ImageID(#image_ligne))
EndProcedure

Procedure dessine_tableau()
    
    CreateGadgetList(WindowID(#Fenetre_base))
    li=#tab_nb_colonne*#tab_largeur_colonne
    hi=#tab_nb_ligne*#tab_hauteur_ligne
    
    creation_ligne_colonne()
    
    ScrollAreaGadget(#area_tableau,#tab_x+#tab_largeur_colonne_tete,#tab_y+#tab_hauteur_ligne,#tab_l-#tab_largeur_colonne_tete,#tab_h-#tab_hauteur_ligne,li,hi,20,#PB_ScrollArea_Single )
    OpenGadgetList(#area_tableau)
    StringGadget(#saisie,0,0,#tab_largeur_colonne,#tab_hauteur_ligne,"",#PB_String_Numeric)
    SetGadgetColor(#saisie,#PB_Gadget_BackColor,$F1B4B7)
    HideGadget(#saisie,1)
    CreateImage(#image_tableau,li,hi)
    LoadFont(1, "Arial", 10) 
    StartDrawing(ImageOutput(#image_tableau))
    Box(0, 0, li,hi,$FFFFFF)
    
    DrawingFont(FontID(1)) 
    For i=1 To #tab_nb_colonne
        LineXY( i*#tab_largeur_colonne,0,i*#tab_largeur_colonne, hi,$585858) 
        LineXY( i*#tab_largeur_colonne+1,0,i*#tab_largeur_colonne+1, hi,$C5C5C5) 
        ;DrawText(i*largeur_colonne+15, 3, Str(i))
    Next
    For i=1 To #tab_nb_ligne
        LineXY(0,i*#tab_hauteur_ligne,li,i*#tab_hauteur_ligne,$585858) 
        LineXY(0,i*#tab_hauteur_ligne+1,li,i*#tab_hauteur_ligne+1,$C5C5C5) 
        ;DrawText(5, i*hauteur_ligne+2, Str(i))
    Next
    ;DrawingMode(1)
    For i=0 To #tab_nb_ligne
        For j=0 To #tab_nb_colonne
            DrawText((j+1)*#tab_largeur_colonne-5-TextWidth(Str(tarif(j,i))) , (i)*#tab_hauteur_ligne+2, Str(tarif(j,i)))
        Next
    Next
    
    StopDrawing()
    ImageGadget(#image_tableau,0,0,l,h,ImageID(#image_tableau))
    ;{creation des coins
    CreateGadgetList(WindowID(#Fenetre_base))
    
    CreateImage(#image_coin,#tab_largeur_colonne_tete*2,#tab_largeur_colonne_tete*2)
    StartDrawing(ImageOutput(#image_coin))
    Box(0,0,#tab_largeur_colonne_tete*2,#tab_largeur_colonne_tete*2,$D2D2D2)
    DrawingMode(4)
    For i=1 To #tab_largeur_colonne_tete/2
        c=180
        Circle(#tab_largeur_colonne_tete,#tab_largeur_colonne_tete, i,RGB(c+5*i,c+5*i,c+5*i)) 
        Circle(#tab_largeur_colonne_tete,#tab_largeur_colonne_tete, #tab_largeur_colonne_tete-i,RGB(c+5*i,c+5*i,c+5*i)) 
    Next
    
    StopDrawing()
    GrabImage(#image_coin, #image_coin_hg, 0, 0, #tab_largeur_colonne_tete,#tab_largeur_colonne_tete)
    GrabImage(#image_coin, #image_coin_hd, #tab_largeur_colonne_tete, 0, #tab_largeur_colonne_tete,#tab_largeur_colonne_tete)
    GrabImage(#image_coin, #image_coin_bg, 0, #tab_largeur_colonne_tete, #tab_largeur_colonne_tete,#tab_largeur_colonne_tete)
    ImageGadget(#image_coin_hg,#tab_x,#tab_y,#tab_largeur_colonne_tete,#tab_hauteur_ligne,ImageID(#image_coin_hg))
    ImageGadget(#image_coin_hd,#tab_x+#tab_l-#tab_largeur_colonne_tete,#tab_y,#tab_largeur_colonne_tete,#tab_hauteur_ligne,ImageID(#image_coin_hd))
    ImageGadget(#image_coin_bg,#tab_x,#tab_y+#tab_h-#tab_largeur_colonne_tete,#tab_largeur_colonne_tete,#tab_hauteur_ligne,ImageID(#image_coin_bg))
    
    ;}
    
    SetWindowCallback(@CallBack_tableau(),#Fenetre_base)
EndProcedure

Procedure choix_cellule(c,l,dep=-1)
    If GetAsyncKeyState_(#VK_SHIFT) >=0
        If GetActiveGadget()=#saisie
            If dep>0 ;{deplacement avec les fleche ou la touche entree
                Select dep
                    
                    Case 4 : c=der_c-1  : l=der_l 
                    Case 8 : c=der_c     : l=der_l -1
                    Case 6 : c=der_c+1 : l=der_l 
                    Case 2 : c=der_c     : l=der_l +1
                    Case 1 : c=#tab_nb_colonne-1: l=der_l  : SetGadgetAttribute(#area_tableau,#PB_ScrollArea_X, GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)+#tab_nb_colonne*#tab_largeur_colonne)
                    Case 7 : c=0: l=der_l  : SetGadgetAttribute(#area_tableau,#PB_ScrollArea_X, 0)
                        
                EndSelect
            EndIf
            ;}
        EndIf
        ;{verification du depacement dans le tableau
        If c>#tab_nb_colonne-1 : c=#tab_nb_colonne-1 : EndIf
        If c<0 : c=0 : EndIf
        If l>#tab_nb_ligne-1: l=#tab_nb_ligne-1 : EndIf
        If l<0 : l=0 : EndIf
        ;}
        
        ;{mise à jour du tableau : si la cullule est modifié choix de la couleur
        nv_text$=GetGadgetText(#saisie)
        If nv_text$<>"" And tarif(der_c,der_l)<>Val(nv_text$)
            tarif(der_c,der_l)=Val(nv_text$)
            couleur=$B3F2C2
        Else
            couleur=$FFFFFF
        EndIf
        ;}
        
        ;{ redessine le tableau
        StartDrawing(ImageOutput(#image_tableau))
        ;efface avec un dessin de couleur
        DrawingFont(FontID(1)) 
        Box(der_c*#tab_largeur_colonne+2,der_l*#tab_hauteur_ligne+2, #tab_largeur_colonne-2,#tab_hauteur_ligne-2,couleur)
        DrawingMode(1)
        DrawText((der_c+1)*#tab_largeur_colonne-5-TextWidth(Str(tarif(der_c,der_l))), der_l*#tab_hauteur_ligne+2, Str(tarif(der_c,der_l)))
        ;(j+1)*#tab_largeur_colonne-5-TextWidth(Str(tarif(j,i)))
        ; dessine la boite de selection de la cellule
        If dep<>0
            Box(c*#tab_largeur_colonne+2,l*#tab_hauteur_ligne+2, #tab_largeur_colonne-2,#tab_hauteur_ligne-2,$F1B4B7)
            
            StopDrawing()
            der_c=c
            der_l=l
            
            SetGadgetState(#image_tableau,ImageID(#image_tableau))
            OpenGadgetList(#area_tableau)
            StringGadget(#saisie,c*#tab_largeur_colonne+1,l*#tab_hauteur_ligne+1,#tab_largeur_colonne,#tab_hauteur_ligne,Str(tarif(c,l)),#PB_String_Numeric )
            SetGadgetColor(#saisie,#PB_Gadget_BackColor,$F1B4B7)
            SetActiveGadget(#saisie)
            SendMessage_(GadgetID(#saisie),#EM_SETSEL,0,-1) 
            ;SimulateKeyPress(35,200,0,0,1)
        Else
            der_c=0
            der_l=0
            StopDrawing()
            SetGadgetState(#image_tableau,ImageID(#image_tableau))
            HideGadget(#saisie,1)
            SetGadgetText(#saisie,"")
        EndIf
        
        ;}
        
        ;{ deplacement de la zone area
        x_min=GadgetX(#saisie)
        y_min=GadgetY(#saisie)
        x_max=GadgetX(#saisie)+GadgetWidth(#saisie)
        y_max=GadgetY(#saisie)+GadgetHeight(#saisie)
        aff_x_min=GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)
        aff_x_max=GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)+#tab_l-20-#tab_largeur_colonne_tete
        aff_y_min=GetGadgetAttribute(#area_tableau,#PB_ScrollArea_y)
        aff_y_max=GetGadgetAttribute(#area_tableau,#PB_ScrollArea_y)+#tab_h-20-#tab_hauteur_ligne
        
        If x_min<aff_x_min Or x_max>aff_x_max Or y_min<aff_y_min  Or y_max>aff_y_max
            Debug "replace"
            Select dep
                Case 4 :SetGadgetAttribute(#area_tableau,#PB_ScrollArea_X, x_min)
                Case 8 :SetGadgetAttribute(#area_tableau,#PB_ScrollArea_y, y_min)
                Case 6 :SetGadgetAttribute(#area_tableau,#PB_ScrollArea_X, x_max-#tab_l+20+#tab_largeur_colonne_tete)
                Case 2 :SetGadgetAttribute(#area_tableau,#PB_ScrollArea_y, y_max-#tab_h+20+#tab_hauteur_ligne)
            EndSelect
        EndIf
        
        
        ;}GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)
        deplace_ligne_colonne()
    EndIf
    
    
EndProcedure

Procedure clic_tableau()
    
    x_i=WindowMouseX(#Fenetre_base)-#tab_x+#tab_largeur_colonne_tete+GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)
    y_i=WindowMouseY(#Fenetre_base)-#tab_y+GetGadgetAttribute(#area_tableau,#PB_ScrollArea_y)
    
    num_col=x_i/#tab_largeur_colonne-1
    num_ligne=y_i/#tab_hauteur_ligne-1
    
    choix_cellule(num_col,num_ligne)
    
EndProcedure

Procedure tableau_gestion_clavier(touche)
    
    Select touche
        Case 36 ;tout en haut
            choix_cellule(0,0,7)
        Case 35 ;tout à la fin
            choix_cellule(0,0,1)
        Case 13
            choix_cellule(0,0,6)
        Case 37
            choix_cellule(0,0,4)
        Case 38
            choix_cellule(0,0,8)
        Case 39
            choix_cellule(0,0,6)
        Case 40
            choix_cellule(0,0,2)
        Case 27 ;escape
            choix_cellule(0,0,0)
    EndSelect
    
EndProcedure

Procedure CallBack_tableau(Hnd,Msg,wParam,lParam)
    Resultat = #PB_ProcessPureBasicEvents
    
    ;{- fenetre de base
    If Hnd=WindowID(#Fenetre_base)
        Debug Msg
        Select Msg
            Case 13103
                deplace_ligne_colonne()
        EndSelect
        ;}
    EndIf
    
    
    ProcedureReturn Resultat
EndProcedure

If OpenWindow(#Fenetre_base, 463, 182, 500, 500,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "Prog base")
    If CreateGadgetList(WindowID(#Fenetre_base))
        
        
        lecture_tableau()
        dessine_tableau()
        Repeat
            event=WaitWindowEvent()
            
            ;If event<>0 : Debug event : EndIf
            If EventWindow()=#Fenetre_base
                
                Select event
                    Case #WM_KEYDOWN
                        
                        tableau_gestion_clavier(EventwParam())
                        
                    Case #PB_Event_Gadget; *****************Choix d'un bouton
                        Select EventGadget()
                            
                            
                            Case #image_tableau
                                clic_tableau()
                                
                        EndSelect
                        
                        
                        
                    Case #WM_CLOSE ; ***************************#PB_EventCloseWindow
                        Quit=1
                        
                        
                EndSelect
            EndIf
            
        Until Quit = 1
    EndIf
EndIf
  
End


Publié : mer. 01/mars/2006 8:57
par Progi1984
De mémoire, oui, on peut avoir plusieurs callbacks. Fais un recherche sur le forum (il y en a déjà été question)

Publié : sam. 04/mars/2006 8:26
par olivier
Merci Progi1984