J'avais pondu ce code pour faire un tableau...
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
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 )
creation_ligne_colonne()
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, "Prog base", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
If CreateGadgetList(WindowID(#Fenetre_base))
lecture_tableau()
tableau()
SetWindowCallback(@CallBack_base(),#Fenetre_base)
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