Début de code pour faire un excel like

Sujets variés concernant le développement en PureBasic
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Début de code pour faire un excel like

Message par kwandjeen »

Pour le moment j'ai du passé à un autre projet mais je reviendrai là dessus plus tard et je laisse le soin à des plus expérimentés de corriger mon travail et améliorer celui-ci :)

Ce sont des commandes window ainsi qu'une multitude de commande pour faire des tableau style excel.

Ce n'est qu'un début mais les cellules, les bordures, les éditions, sélections, redimensionnement, police (taille,couleur,font),la fusino des cellules sont déjà en place.

J'aurai pu faire directement une image sur fenetre mais lorsque j'ai commencé je suis parti avec un gadgetimage au cas ou pour avoir plus de controle.

le fichier pour gérer les tableau. Le post suivant il y a le code kwin qui sert aux évènements.

Code : Tout sélectionner

XIncludeFile "kwin.pbi"

;--***** commande interne
Procedure kwar_init_tableau()
  Structure struct
  id_fenetre.l
  id.l
  nb_case.l
  id_case.l
  id_image.l
  id_imagegadget.l
  id_edit.l
  largeur.l
  hauteur.l
  nb_col.l
  nb_ligne.l
  posx.l
  posy.l
  position_bordure.l
  largeur_bordure.l
  bordure_gauche.l
  bordure_haut.l
  bordure_droite.l
  bordure_bas.l
  couleur_bordure_g.l
  couleur_bordure_h.l
  couleur_bordure_d.l
  couleur_bordure_b.l
  num_col.l
  num_ligne.l
  color_bordure.l
  color_fond_case.l
  texte.s
  sens_texte.l
  color_texte_case.l
  mode_backtexte.l
  color_backtexte.l
  font_texte_case.l
  posx_case.l
  posy_case.l
  align_texte_h_case.l
  align_texte_v_case.l
  user_tx_colonne.l
  user_tx_ligne.l
  tx_colonne.l
  tx_ligne.l
  etat_case.l
  mode_etat.l
  EndStructure
  
  #left_border = 1
  #top_border = 10
  #right_border = 100
  #bottom_border = 1000
  #all_border = 1111
  
  #kwar_text_center = #PB_Text_Center
  #kwar_text_right = #PB_Text_Right
  #kwar_text_left = 1244
  #kwar_text_top = 1245
  #kwar_text_bottom = 1246
  
  #kwar_text_sensH = 1247
  #kwar_text_sensV = 1248
  
  #kwar_copy_text = 1249
  #kwar_copy_all = 1250
  
  #kwar_noselected = 1251
  #kwar_selected = 1252
  #kwar_oneselect = 1253
  #kwar_multiselect = 1254
  
  Enumeration
  #retour
  EndEnumeration
  
  Global NewList kwar_tableau.struct()
  Global kwar_creation_liste = 1
  
  
EndProcedure

Macro kwar_calcul_taille_cellule(id)
;taille des colonne
  SelectElement(kwar_tableau(),kwar_get_index(id))
  largeur_tableau = kwar_tableau()\largeur
  hauteur_tableau = kwar_tableau()\hauteur
  nb_col = kwar_tableau()\nb_col
  nb_lg = kwar_tableau()\nb_ligne
  nb_case = kwar_tableau()\nb_case
  largeur_bordure = kwar_tableau()\largeur_bordure
  
  espace_colonne = largeur_tableau-(largeur_bordure*(nb_col+1))
  espace_ligne = hauteur_tableau-(largeur_bordure*(nb_lg+1))
  user_colonne = 0
  user_ligne = 0
  
  compteur_col = nb_col  
  For icol=1 To nb_col
     kwar_select_case(id,1,icol)
     If kwar_tableau()\user_tx_colonne>0
       espace_colonne = espace_colonne-kwar_tableau()\user_tx_colonne
       user_colonne = user_colonne + kwar_tableau()\user_tx_colonne
       compteur_col = compteur_col-1
     EndIf
  Next
  
  compteur_lg = nb_lg
  For ilg=1 To nb_lg
     kwar_select_case(id,ilg,1)
     If kwar_tableau()\user_tx_ligne>0
       espace_ligne = espace_ligne-kwar_tableau()\user_tx_ligne
       user_ligne = user_ligne + kwar_tableau()\user_tx_ligne
       compteur_lg = compteur_lg-1
     EndIf    
  
  Next
  If compteur_col>0
    tx_colonne = espace_colonne/compteur_col
  EndIf
  If compteur_lg>0
    tx_ligne = espace_ligne/compteur_lg
  EndIf
  
  largeur = user_colonne+(tx_colonne*compteur_col)+((nb_col+1)*largeur_bordure)
  hauteur = user_ligne+(tx_ligne*compteur_lg)+((nb_lg+1)*largeur_bordure)
  
  SelectElement(kwar_tableau(),kwar_get_index(id))
  kwar_tableau()\largeur = largeur
  kwar_tableau()\hauteur = hauteur
  ResizeGadget(kwar_tableau()\id_imagegadget, kwar_tableau()\posx, kwar_tableau()\posy, largeur, hauteur)
  ResizeImage(kwar_tableau()\id_image, largeur, hauteur)
  
  For i=1 To nb_case
    NextElement(kwar_tableau())
    If kwar_tableau()\user_tx_colonne=0
      kwar_tableau()\tx_colonne = tx_colonne
    EndIf
    If kwar_tableau()\user_tx_ligne=0
      kwar_tableau()\tx_ligne = tx_ligne
    EndIf
  Next

EndMacro

Procedure kwar_get_index(id.l)
  dep_tableau = 0
  FirstElement(kwar_tableau())
  ForEach kwar_tableau()
    If kwar_tableau()\id = id
      dep_tableau = ListIndex(kwar_tableau())
      Break
    EndIf
  Next
  ProcedureReturn dep_tableau
EndProcedure

Procedure kwar_get_count_column(id.l)
  SelectElement(kwar_tableau(),kwar_get_index(id)) 
  count_colonne = kwar_tableau()\nb_col
  ProcedureReturn count_colonne
EndProcedure

Procedure kwar_get_count_line(id.l)
  SelectElement(kwar_tableau(),kwar_get_index(id)) 
  count_ligne = kwar_tableau()\nb_ligne
  ProcedureReturn count_ligne
EndProcedure

Procedure.b kwar_select_case(id.l,ligne.l,colonne.l)
  retour = 1
  If ligne>0 And colonne>0
    count_ligne = kwar_get_count_line(id)
    count_colonne = kwar_get_count_column(id)
    If ligne<=count_ligne And colonne<=count_colonne
      idcase = ((ligne-1)*count_colonne)+colonne
      SelectElement(kwar_tableau(),kwar_get_index(id)+idcase)
    Else
      retour = 0
    EndIf
  Else
    retour = 0
  EndIf
  ProcedureReturn retour    
EndProcedure

Procedure kwar_dessiner_bordure(casex.l,casey.l,largeur_bordure.l,couleur_bordure.l)
bordure = kwar_tableau()\position_bordure
bordure_g = kwar_tableau()\bordure_gauche
bordure_h = kwar_tableau()\bordure_haut
bordure_d = kwar_tableau()\bordure_droite
bordure_b = kwar_tableau()\bordure_bas
col_bor_g = kwar_tableau()\couleur_bordure_g
col_bor_h = kwar_tableau()\couleur_bordure_h
col_bor_d = kwar_tableau()\couleur_bordure_d
col_bor_b = kwar_tableau()\couleur_bordure_b

  If Mid(Str(bordure),5,1)= "1" ; bordure gauche
    Box(casex,casey,largeur_bordure,kwar_tableau()\tx_ligne+(2*largeur_bordure),couleur_bordure)
    Box(casex+largeur_bordure,casey,bordure_g,kwar_tableau()\tx_ligne+(2*largeur_bordure),col_bor_g)
  EndIf
  If Mid(Str(bordure),4,1)= "1" ;bordure top
    Box(casex,casey,kwar_tableau()\tx_colonne+(2*largeur_bordure),largeur_bordure,couleur_bordure)
    Box(casex+largeur_bordure,casey+largeur_bordure,kwar_tableau()\tx_colonne+(2*largeur_bordure),bordure_h,col_bor_h)     
  EndIf
  If Mid(Str(bordure),3,1)= "1" ;bordure droite
    Box(casex+kwar_tableau()\tx_colonne+largeur_bordure,casey,largeur_bordure,kwar_tableau()\tx_ligne+(2*largeur_bordure),couleur_bordure)
    Box(casex+kwar_tableau()\tx_colonne+largeur_bordure-bordure_d,casey+largeur_bordure,bordure_d,kwar_tableau()\tx_ligne+(2*largeur_bordure),col_bor_d)
  EndIf
  If Mid(Str(bordure),2,1)= "1" ;bordure basse
    Box(casex,casey+kwar_tableau()\tx_ligne+largeur_bordure,kwar_tableau()\tx_colonne+(2*largeur_bordure),largeur_bordure,couleur_bordure)    
    Box(casex+largeur_bordure,casey+kwar_tableau()\tx_ligne+largeur_bordure-bordure_b,kwar_tableau()\tx_colonne+(2*largeur_bordure),bordure_b,col_bor_b)
  EndIf

EndProcedure

Procedure kwar_draw_select(casex.l,casey.l,largeur_bordure.l)
bordure = kwar_tableau()\position_bordure

  If Mid(Str(bordure),5,1)= "1" ; bordure gauche
    Box(casex,casey,2,kwar_tableau()\tx_ligne+(4),RGB(50,50,50))
  EndIf
  If Mid(Str(bordure),4,1)= "1" ;bordure top
    Box(casex,casey,kwar_tableau()\tx_colonne+(4),2,RGB(50,50,50))
  EndIf
  If Mid(Str(bordure),3,1)= "1" ;bordure droite
    Box(casex+kwar_tableau()\tx_colonne+2,casey,2,kwar_tableau()\tx_ligne+4,RGB(0,0,0))
  EndIf
  If Mid(Str(bordure),2,1)= "1" ;bordure basse
    Box(casex,casey+kwar_tableau()\tx_ligne+2,kwar_tableau()\tx_colonne+2,4,RGB(0,0,0))
  EndIf
  
  Box(casex+2,casey+2,kwar_tableau()\tx_colonne-2,kwar_tableau()\tx_ligne-2,RGB(207, 208, 2))
EndProcedure

Procedure.l kwar_detect_idcase(window.l)
;kwin_verif_init() à mettre avec le fichier kwinit
;position souris
souris_x = WindowMouseX(window)
souris_y = WindowMouseY(window)
idwin = kwin_IDover_gadget(WindowID(window))
idpb = kwin_get_idgadget(idwin)
  ForEach kwar_tableau()
    If kwar_tableau()\id_imagegadget = idpb
      Break
    EndIf
  Next

  position_x = souris_x-kwar_tableau()\posx
  position_y = souris_y-kwar_tableau()\posy
  largeur = kwar_tableau()\largeur
  hauteur = kwar_tableau()\hauteur
  nb_col = kwar_tableau()\nb_col
  nb_lg = kwar_tableau()\nb_ligne
  id_tableau = kwar_tableau()\id
  
  For tx=1 To nb_col
    kwar_select_case(id_tableau,1,tx)
    cellule1 = kwar_tableau()\posx_case
    If tx=nb_col
      cellule2 = largeur
    Else
      kwar_select_case(id_tableau,1,tx+1)
      cellule2 = kwar_tableau()\posx_case
    EndIf
    If cellule1<=position_x And cellule2>position_x
      colonne = tx
      Break
    EndIf
  Next
  
  For ty=1 To nb_lg
    kwar_select_case(id_tableau,ty,1)
    cellule1 = kwar_tableau()\posy_case
    If ty=nb_lg
      cellule2 = hauteur
    Else
      kwar_select_case(id_tableau,ty+1,1)
      cellule2 = kwar_tableau()\posy_case
    EndIf
    If cellule1<=position_y And cellule2>position_y
      ligne = ty
      Break
    EndIf
  Next
 
  kwar_select_case(id_tableau,ligne,colonne)
  id_case = kwar_tableau()\id_case
  ProcedureReturn id_case
EndProcedure

Procedure.l kwar_idcase_to_line(id.l,idcase.l)
  SelectElement(kwar_tableau(),kwar_get_index(id)+idcase)
  ligne = kwar_tableau()\num_ligne
  ProcedureReturn ligne   
EndProcedure

Procedure.l kwar_over_line(window.l,id.l)
  idcase = kwar_detect_idcase(window) 
  ligne = kwar_idcase_to_line(id,idcase)
  ProcedureReturn ligne
EndProcedure

Procedure.l kwar_idcase_to_column(id.l,idcase.l)
  SelectElement(kwar_tableau(),kwar_get_index(id)+idcase)
  colonne = kwar_tableau()\num_col
  ProcedureReturn colonne
EndProcedure

Procedure.l kwar_over_column(window.l,id.l)
  idcase = kwar_detect_idcase(window) 
  colonne = kwar_idcase_to_column(id,idcase)
  ProcedureReturn colonne
EndProcedure

Procedure kwar_refresh(id.l)
;rafraichit l'affichage du tableau
SelectElement(kwar_tableau(),kwar_get_index(id))
id_imagegadget = kwar_tableau()\id_imagegadget
id_image = kwar_tableau()\id_image

StartDrawing(ImageOutput(kwar_tableau()\id_image))
  ;Box(0,0,tableau()\largeur,tableau()\hauteur,tableau()\color_bordure);bordure
  nb_col = kwar_tableau()\nb_col
  nb_lg = kwar_tableau()\nb_ligne
  largeur_bordure = kwar_tableau()\largeur_bordure
  couleur_bordure = kwar_tableau()\color_bordure
  
  casex = 0;largeur_bordure
  casey = 0;largeur_bordure
  
  For lg=1 To nb_lg
    For col=1 To nb_col
      NextElement(kwar_tableau())
      Box(casex,casey,kwar_tableau()\tx_colonne+(2*largeur_bordure),kwar_tableau()\tx_ligne+(2*largeur_bordure),kwar_tableau()\color_fond_case)
      kwar_tableau()\posx_case = casex
      kwar_tableau()\posy_case = casey
      
      If kwar_tableau()\etat_case = 1 And kwar_tableau()\mode_etat = #kwar_selected
        kwar_draw_select(casex,casey,largeur_bordure)
      Else
        kwar_dessiner_bordure(casex,casey,largeur_bordure,couleur_bordure)
      EndIf
      
      axe_x = kwar_tableau()\bordure_droite - kwar_tableau()\bordure_gauche
      axe_y = kwar_tableau()\bordure_bas - kwar_tableau()\bordure_haut
      
      DrawingMode(kwar_tableau()\mode_backtexte)
      
      If IsFont(kwar_tableau()\font_texte_case)
        DrawingFont(FontID(kwar_tableau()\font_texte_case))
      Else
        DrawingFont(#PB_Font_Default)
      EndIf
      
      l_texte = TextWidth(kwar_tableau()\texte)
      h_texte = TextHeight(kwar_tableau()\texte)
      
      Select kwar_tableau()\align_texte_h_case
        Case #kwar_text_center
          decalh_texte = ((kwar_tableau()\tx_colonne-(l_texte)-axe_x)/2)+largeur_bordure
        Case #kwar_text_right
          decalh_texte = kwar_tableau()\tx_colonne-(l_texte+1)
        Default
          decalh_texte = 2 + largeur_bordure          
      EndSelect
      
      Select kwar_tableau()\align_texte_v_case
        Case #kwar_text_center
          decalv_texte = ((kwar_tableau()\tx_ligne-h_texte)/2)+largeur_bordure - (axe_y/2)
        Case #kwar_text_top
          decalv_texte = 2 - axe_y
          If decalv_texte <=0
            decalv_texte = 0
          EndIf
        Default
          decalv_texte = kwar_tableau()\tx_ligne - h_texte + 1.5*largeur_bordure - axe_y       
      EndSelect
      
      DrawText(casex+decalh_texte,casey+decalv_texte,kwar_tableau()\texte,kwar_tableau()\color_texte_case,kwar_tableau()\color_backtexte)
      
      casex = casex+kwar_tableau()\tx_colonne+largeur_bordure 
    Next

    casey = casey+kwar_tableau()\tx_ligne+largeur_bordure
    casex = 0;largeur_bordure   
  Next
StopDrawing()
SetGadgetState(id_imagegadget, ImageID(id_image))  
EndProcedure

;--***** commande utilisateur
Procedure.l kwar_create(id.l,posx.l,posy.l,largeur.l,hauteur.l,nb_lg.l,nb_col.l)
  If kwar_creation_liste = 0
    kwar_init_tableau()
  EndIf
   
  ;AddKeyboardShortcut(GetActiveWindow(),#PB_Shortcut_Return,#retour)

  ;on rentre les donnees du tableau
  LastElement(kwar_tableau())
  AddElement(kwar_tableau())
    kwar_tableau()\id_fenetre = GetActiveWindow()
    kwar_tableau()\nb_case = nb_col*nb_lg
    kwar_tableau()\nb_col = nb_col
    kwar_tableau()\nb_ligne = nb_lg
    
  largeur_bordure = 1
  tx_colonne = (largeur-((nb_col+1)*largeur_bordure))/nb_col
  tx_ligne = (hauteur-((nb_lg+1)*largeur_bordure))/nb_lg

  largeur = (tx_colonne*nb_col)+((nb_col+1)*largeur_bordure)
  hauteur = (tx_ligne*nb_lg)+((nb_lg+1)*largeur_bordure)
 
    kwar_tableau()\largeur = largeur
    kwar_tableau()\hauteur = hauteur
    kwar_tableau()\posx = posx
    kwar_tableau()\posy = posy
    kwar_tableau()\color_bordure = RGB(0, 0, 0)
    kwar_tableau()\largeur_bordure = 1
  ;création de l'image
    id_image = CreateImage(#PB_Any,largeur,hauteur)
    kwar_tableau()\id_image = id_image
    If id=#PB_Any 
      id_imagegadget = ImageGadget(#PB_Any,posx,posy,largeur,hauteur,ImageID(id_image))
      id = id_imagegadget
    Else
      ImageGadget(id,posx,posy,largeur,hauteur,ImageID(id_image))
      id_imagegadget = id
    EndIf
    
    id_edit = StringGadget(#PB_Any,0,0,50,20,"",#PB_String_BorderLess)
    kwar_tableau()\id_edit = id_edit
   
    HideGadget(id_edit,1)
    
    kwar_tableau()\id = id 
    kwar_tableau()\id_imagegadget = id_imagegadget
    
  ;on remplit les cellules
  largeur_bordure = 1
  ;tx_colonne = (largeur-((nb_col+1)*largeur_bordure))/nb_col
  ;tx_ligne = (hauteur-((nb_lg+1)*largeur_bordure))/nb_lg
  
  compteur = 1
  For i=1 To nb_lg
    For t=1 To nb_col
      AddElement(kwar_tableau())
      kwar_tableau()\id_case = compteur
      kwar_tableau()\num_ligne = i
      kwar_tableau()\num_col = t
      kwar_tableau()\color_fond_case = RGB(255,255,255)
      kwar_tableau()\texte = "" ;Str(compteur)
      kwar_tableau()\sens_texte = #kwar_text_sensH
      kwar_tableau()\color_texte_case = RGB(0,0,0)
      kwar_tableau()\mode_backtexte = #PB_2DDrawing_Transparent
      kwar_tableau()\color_backtexte = RGB(255,255,255)
      kwar_tableau()\align_texte_h_case = #kwar_text_center
      kwar_tableau()\align_texte_v_case = #kwar_text_center
      kwar_tableau()\font_texte_case = #PB_Default
      kwar_tableau()\position_bordure = #all_border+10000
      kwar_tableau()\bordure_gauche = 0
      kwar_tableau()\couleur_bordure_g = RGB(0, 0, 0)      
      kwar_tableau()\bordure_haut = 0
      kwar_tableau()\couleur_bordure_h = RGB(0, 0, 0)
      kwar_tableau()\bordure_droite = 0
      kwar_tableau()\couleur_bordure_d = RGB(0, 0, 0)
      kwar_tableau()\bordure_bas = 0
      kwar_tableau()\couleur_bordure_b = RGB(0, 0, 0)
      kwar_tableau()\etat_case = 0
      kwar_tableau()\mode_etat = #kwar_selected
    ;définition de la taille des cases
      
      kwar_tableau()\user_tx_colonne = 0
      kwar_tableau()\user_tx_ligne = 0
      
      kwar_tableau()\tx_colonne = tx_colonne      
      kwar_tableau()\tx_ligne = tx_ligne 
      compteur = compteur+1
    Next t  
  Next i
  
  kwar_refresh(id)  
  ProcedureReturn id
EndProcedure

Procedure kwar_set_text(id.l,lg.l,col.l,texte$,alignV.l=#PB_Ignore,alignH.l=#PB_Ignore)
;Change le texte d'une cellule ainsi que l'alignement
  ;dep_tableau = index_tableau(id) 
  If kwar_select_case(id,lg,col)
    kwar_tableau()\texte = texte$
    If alignH<>#PB_Ignore
      kwar_tableau()\align_texte_h_case = alignH
    EndIf
    If alignV<>#PB_Ignore
      kwar_tableau()\align_texte_v_case = alignV
    EndIf
    kwar_refresh(id) 
  EndIf
EndProcedure

Procedure kwar_set_textcolor(id.l,lg.l,col.l,color.l)
;Change la couleur du texte
;Si col=0 on appplique à toute la ligne
;Si ligne=0 on applique à toute la colonne
;Si ligne=0 et colonne=0 on applique à tout le tableau

  If lg=0 And col=0
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_case = kwar_tableau()\nb_case
    For i=1 To nb_case
      NextElement(kwar_tableau())
      kwar_tableau()\color_texte_case = color
    Next i
  
  ElseIf lg=0 And col>0
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_lg = kwar_tableau()\nb_ligne
    For i=1 To nb_lg
      kwar_Select_case(id,i,col)
      kwar_tableau()\color_texte_case = color
    Next i
  ElseIf lg>0 And col=0
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_col = kwar_tableau()\nb_col
    For i=1 To nb_col
      kwar_Select_case(id,lg,i)
      kwar_tableau()\color_texte_case = color
    Next i  
  ElseIf lg>0 And col>0
    If kwar_Select_case(id,lg,col)
      kwar_tableau()\color_texte_case = color
    EndIf
  EndIf

  kwar_refresh(id) 
EndProcedure

Procedure kwar_set_backcolor(id.l,lg.l,col.l,color.l)
;Change la couleur de fond de(s) cellule(s)
;Si col=0 on applique à toute la ligne
;Si lg=0 on applique à toute la colonne

  If lg=0 And col=0
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_case = kwar_tableau()\nb_case
    For i=1 To nb_case
      NextElement(kwar_tableau())
      kwar_tableau()\color_fond_case = color
    Next i
  
  ElseIf lg=0 And col>0
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_lg = kwar_tableau()\nb_ligne
    For i=1 To nb_lg
      kwar_Select_case(id,i,col)
      kwar_tableau()\color_fond_case = color
    Next i
  ElseIf lg>0 And col=0
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_col = kwar_tableau()\nb_col
    For i=1 To nb_col
      kwar_Select_case(id,lg,i)
      kwar_tableau()\color_fond_case = color
    Next i  
  ElseIf lg>0 And col>0
    If kwar_Select_case(id,lg,col)
      kwar_tableau()\color_fond_case = color
    EndIf
  EndIf

  kwar_refresh(id)
EndProcedure

Procedure kwar_set_border(id.l,largeur_bordure.l,color.l=#PB_Ignore)
;Défini la largeur et/ou la couleur de la bordure su tableau
  SelectElement(kwar_tableau(),kwar_get_index(id))
  If color<>#PB_Ignore
    kwar_tableau()\color_bordure = color
  EndIf
  If largeur_bordure<>#PB_Ignore
    kwar_tableau()\largeur_bordure = largeur_bordure
    largeur = kwar_tableau()\largeur
    hauteur = kwar_tableau()\hauteur
    nb_lg = kwar_tableau()\nb_ligne
    nb_col = kwar_tableau()\nb_col
  
    kwar_calcul_taille_cellule(id)
    
  EndIf 
   
  kwar_refresh(id)
EndProcedure

Procedure kwar_set_itemborder(id.l,lg.l,col.l,bordure.l)
;défini la présence bordure tableau dans les cellules
;Si colonne=#pb_ignore alors on compte avec les idcase et plus par ligne/colonne
  SelectElement(kwar_tableau(),kwar_get_index(id))
  nb_case = kwar_tableau()\nb_case
  max_col = kwar_tableau()\nb_col
  max_lg = kwar_tableau()\nb_ligne
  
  If Len(Str(bordure))<5
    bordure = bordure+10000
  EndIf
  valid = 0
  If col=#PB_Ignore And lg<=nb_case
    SelectElement(kwar_tableau(),kwar_get_index(id)+lg)
    col = kwar_idcase_to_column(id,lg)
    lg = kwar_idcase_to_line(id,lg)
    valid = 1
  ElseIf kwar_select_case(id,lg,col)
    valid = 1
  EndIf
  
  If valid = 1
    kwar_tableau()\position_bordure = bordure
      If Mid(Str(bordure),5,1)="0" And col-1>0
        kwar_select_case(id,lg,col-1)
          If Mid(Str(kwar_tableau()\position_bordure),3,1) = "1"
            kwar_tableau()\position_bordure = kwar_tableau()\position_bordure - 100
          EndIf
      ElseIf Mid(Str(bordure),5,1)="1" And col-1>0
        kwar_select_case(id,lg,col-1)
          If Mid(Str(kwar_tableau()\position_bordure),3,1) = "0"
            kwar_tableau()\position_bordure = kwar_tableau()\position_bordure + 100
          EndIf    
      EndIf
  
      If Mid(Str(bordure),4,1)="0" And lg-1>0
        kwar_select_case(id,lg-1,col)
          If Mid(Str(kwar_tableau()\position_bordure),2,1) = "1"
            kwar_tableau()\position_bordure = kwar_tableau()\position_bordure - 1000
          EndIf
      ElseIf Mid(Str(bordure),4,1)="1" And lg-1>0
        kwar_select_case(id,lg-1,col)
          If Mid(Str(kwar_tableau()\position_bordure),2,1) = "0"
            kwar_tableau()\position_bordure = kwar_tableau()\position_bordure + 1000
          EndIf
      EndIf
  
      If Mid(Str(bordure),3,1)="0" And col+1<=max_col
        kwar_select_case(id,lg,col+1)
          If Mid(Str(kwar_tableau()\position_bordure),5,1) = "1"
            kwar_tableau()\position_bordure = kwar_tableau()\position_bordure - 1
          EndIf
      ElseIf Mid(Str(bordure),3,1)="1" And col+1<=max_col
        kwar_select_case(id,lg,col+1)
          If Mid(Str(kwar_tableau()\position_bordure),5,1) = "0"
            kwar_tableau()\position_bordure = kwar_tableau()\position_bordure + 1
          EndIf
      EndIf
  
      If Mid(Str(bordure),2,1)="0" And lg+1<=max_lg
        kwar_select_case(id,lg+1,col)
          If Mid(Str(kwar_tableau()\position_bordure),4,1) = "1"
            kwar_tableau()\position_bordure = kwar_tableau()\position_bordure - 10
          EndIf
      ElseIf Mid(Str(bordure),2,1)="1" And lg+1<=max_lg
        kwar_select_case(id,lg+1,col)
          If Mid(Str(kwar_tableau()\position_bordure),4,1) = "0"
            kwar_tableau()\position_bordure = kwar_tableau()\position_bordure + 10
          EndIf
      EndIf    
      
    kwar_refresh(id) 
  EndIf
EndProcedure

Procedure kwar_set_font(id,police.l)
;change la police de tout le tableau
  SelectElement(kwar_tableau(),kwar_get_index(id))
  For i=1 To kwar_tableau()\nb_case
    NextElement(kwar_tableau())
    kwar_tableau()\font_texte_case = police
  Next
EndProcedure

Procedure kwar_set_itemfont(id,lg.l,col.l,police.l)
;Change la police de la cellule
  ;SelectElement(kwar_tableau(),kwar_get_index(id))
;Si col=0 on applique à toute la ligne
;Si lg=0 on applique à toute la colonne

  If lg=0 And col=0
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_case = kwar_tableau()\nb_case
    For i=1 To nb_case
      NextElement(kwar_tableau())
      kwar_tableau()\font_texte_case = police
    Next i
  
  ElseIf lg=0 And col>0
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_lg = kwar_tableau()\nb_ligne
    For i=1 To nb_lg
      kwar_Select_case(id,i,col)
      kwar_tableau()\font_texte_case = police
    Next i
  ElseIf lg>0 And col=0
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_col = kwar_tableau()\nb_col
    For i=1 To nb_col
      kwar_Select_case(id,lg,i)
      kwar_tableau()\font_texte_case = police
    Next i  
  ElseIf lg>0 And col>0
    If kwar_Select_case(id,lg,col)
      kwar_tableau()\font_texte_case = police
    EndIf
  EndIf

  kwar_refresh(id) 
EndProcedure

Procedure kwar_set_state(id.l,lg.l,col.l,etat.b,multi.l=#kwar_oneselect)
;Change l'état de la cellule

  If kwar_Select_case(id,lg,col)
    etat_case = kwar_tableau()\etat_case
    If etat = -1
      etat = Abs(etat_case + etat)
    EndIf
      
    If etat = 1
      SelectElement(kwar_tableau(),kwar_get_index(id))
      nb_case = kwar_tableau()\nb_case
      If multi <> #kwar_multiselect
        For t = 1 To nb_case
          NextElement(kwar_tableau())
          kwar_tableau()\etat_case = 0
        Next 
      EndIf      
    EndIf
    kwar_Select_case(id,lg,col)
    kwar_tableau()\etat_case = etat 
  EndIf
  kwar_refresh(id)
EndProcedure

Procedure kwar_set_widthcolumn(id.l,col.l,tx_col.l)
;Change la largeur de la colonne
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_lg = kwar_tableau()\nb_ligne
    For i=1 To nb_lg
      If kwar_Select_case(id,i,col)
        kwar_tableau()\user_tx_colonne = tx_col
        kwar_tableau()\tx_colonne = tx_col
      EndIf
    Next i
  kwar_calcul_taille_cellule(id)
  kwar_refresh(id)
EndProcedure

Procedure kwar_set_heightline(id.l,lg.l,tx_lg.l)
;Change la hauteur de la ligne
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_col = kwar_tableau()\nb_col
    For i=1 To nb_col
      If kwar_Select_case(id,lg,i)
        kwar_tableau()\user_tx_ligne = tx_lg
        kwar_tableau()\tx_ligne = tx_lg
      EndIf
    Next i
  kwar_calcul_taille_cellule(id)
  kwar_refresh(id)
EndProcedure

Procedure kwar_set_iteminborder(id.l,ligne.l,colonne.l,bordure.l,size.l=#PB_Ignore,color.l=#PB_Ignore)
 ;défini la présence bordure interne de cellule ainsi que taille et couleur
 ;si colonne=#pb_ignore alors on compte par idcase
   If colonne=#PB_Ignore
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_case = kwar_tableau()\nb_case
   EndIf
  valid = 0
  If colonne=#PB_Ignore And ligne<=nb_case
    SelectElement(kwar_tableau(),kwar_get_index(id)+ligne)
    valid = 1
  ElseIf kwar_select_case(id,ligne,colonne)
    valid = 1
  EndIf
    
  If valid
     bordure = bordure + 10000 
     
    If Mid(Str(bordure),5,1)= "1" ; bordure gauche
      If size<>#PB_Ignore
        kwar_tableau()\bordure_gauche = size
      EndIf
      If color<>#PB_Ignore
        kwar_tableau()\couleur_bordure_g = color
      EndIf
    EndIf
    If Mid(Str(bordure),4,1)= "1" ;bordure top
      If size<>#PB_Ignore
        kwar_tableau()\bordure_haut = size
      EndIf
      If color<>#PB_Ignore
        kwar_tableau()\couleur_bordure_h = color
      EndIf    
    EndIf
    If Mid(Str(bordure),3,1)= "1" ;bordure droite
      If size<>#PB_Ignore
        kwar_tableau()\bordure_droite = size
      EndIf
      If color<>#PB_Ignore
        kwar_tableau()\couleur_bordure_d = color
      EndIf
    EndIf
    If Mid(Str(bordure),2,1)= "1" ;bordure basse
      If size<>#PB_Ignore
        kwar_tableau()\bordure_bas = size
      EndIf
      If color<>#PB_Ignore
        kwar_tableau()\couleur_bordure_b = color
      EndIf
    EndIf
    kwar_refresh(id)
  EndIf
EndProcedure

Procedure kwar_set_textalign(id.l,ligne.l,colonne.l,alignV.l=#PB_Ignore,alignH.l=#PB_Ignore)
;Change l'alignement du texte dans la cellule (ou les)
;Si col=0 on appplique à toute la ligne
;Si ligne=0 on applique à toute la colonne
;Si ligne=0 et colonne=0 on applique à tout le tableau

  If lg=0 And col=0
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_case = kwar_tableau()\nb_case
    For i=1 To nb_case
      NextElement(kwar_tableau())
        If alignV<>#PB_Ignore
          kwar_tableau()\align_texte_v_case = alignV
        EndIf
        If alignH<>#PB_Ignore
          kwar_tableau()\align_texte_h_case = alignH
        EndIf    
    Next i
  
  ElseIf lg=0 And col>0
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_lg = kwar_tableau()\nb_ligne
    For i=1 To nb_lg
      kwar_Select_case(id,i,col)
        If alignV<>#PB_Ignore
          kwar_tableau()\align_texte_v_case = alignV
        EndIf
        If alignH<>#PB_Ignore
          kwar_tableau()\align_texte_h_case = alignH
        EndIf
    Next i
  ElseIf lg>0 And col=0
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_col = kwar_tableau()\nb_col
    For i=1 To nb_col
      kwar_Select_case(id,lg,i)
        If alignV<>#PB_Ignore
          kwar_tableau()\align_texte_v_case = alignV
        EndIf
        If alignH<>#PB_Ignore
          kwar_tableau()\align_texte_h_case = alignH
        EndIf
    Next i  
  ElseIf lg>0 And col>0
    If kwar_Select_case(id,lg,col)
        If alignV<>#PB_Ignore
          kwar_tableau()\align_texte_v_case = alignV
        EndIf
        If alignH<>#PB_Ignore
          kwar_tableau()\align_texte_h_case = alignH
        EndIf
    EndIf
  EndIf
  
  kwar_refresh(id)
EndProcedure

Procedure kwar_set_backtext(id.l,ligne.l,colonne.l,color.l,mode.l=#PB_2DDrawing_Transparent)
;Change le mode d'affichage du texte avec ou sans fond de texte en couleur
;Si col=0 on appplique à toute la ligne
;Si ligne=0 on applique à toute la colonne
;Si ligne=0 et colonne=0 on applique à tout le tableau

  If ligne0 And colonne=0
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_case = kwar_tableau()\nb_case
    For i=1 To nb_case
      NextElement(kwar_tableau())
      kwar_tableau()\color_backtexte = color
      kwar_tableau()\mode_backtexte = mode
    Next i
  
  ElseIf ligne=0 And colonne>0
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_lg = kwar_tableau()\nb_ligne
    For i=1 To nb_lg
      kwar_Select_case(id,i,colonne)
      kwar_tableau()\color_backtexte = color
      kwar_tableau()\mode_backtexte = mode
    Next i
  ElseIf ligne>0 And colonne=0
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_col = kwar_tableau()\nb_col
    For i=1 To nb_col
      kwar_Select_case(id,ligne,i)
      kwar_tableau()\color_backtexte = color
      kwar_tableau()\mode_backtexte = mode
    Next i  
  ElseIf ligne>0 And colonne>0
    If kwar_Select_case(id,ligne,colonne)
      kwar_tableau()\color_backtexte = color
      kwar_tableau()\mode_backtexte = mode
    EndIf
  EndIf
  
  kwar_refresh(id)
EndProcedure

Procedure kwar_set_itemmode(id.l,ligne.l,colonne.l,mode.l)
;Défini si la cellule peut être sélectionnée ou pas (vérrouillée)
;Si col=0 on appplique à toute la ligne
;Si ligne=0 on applique à toute la colonne
;Si ligne=0 et colonne=0 on applique à tout le tableau

  If ligne0 And colonne=0
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_case = kwar_tableau()\nb_case
    For i=1 To nb_case
      NextElement(kwar_tableau())
      If mode <> #kwar_noselected And mode <> #kwar_selected
        mode = #kwar_noselected
      EndIf
      kwar_tableau()\mode_etat = mode
    Next i
  
  ElseIf ligne=0 And colonne>0
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_lg = kwar_tableau()\nb_ligne
    For i=1 To nb_lg
      kwar_Select_case(id,i,colonne)
      If mode <> #kwar_noselected And mode <> #kwar_selected
        mode = #kwar_noselected
      EndIf
      kwar_tableau()\mode_etat = mode
    Next i
  ElseIf ligne>0 And colonne=0
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_col = kwar_tableau()\nb_col
    For i=1 To nb_col
      kwar_Select_case(id,ligne,i)
      If mode <> #kwar_noselected And mode <> #kwar_selected
        mode = #kwar_noselected
      EndIf
      kwar_tableau()\mode_etat = mode

    Next i  
  ElseIf ligne>0 And colonne>0
    If kwar_Select_case(id,ligne,colonne)
      If mode <> #kwar_noselected And mode <> #kwar_selected
        mode = #kwar_noselected
      EndIf
      kwar_tableau()\mode_etat = mode

    EndIf
  EndIf
  
  kwar_refresh(id)
EndProcedure

Procedure kwar_set_width(id.l,largeur.l)
;Redéfinition de la largeur du tableau
  SelectElement(kwar_tableau(),kwar_get_index(id))
  kwar_tableau()\largeur = largeur
  kwar_calcul_taille_cellule(id)
  kwar_refresh(id) 
EndProcedure

Procedure kwar_set_height(id.l,hauteur.l)
;Rdéfinition de la hauteur du tableau
  SelectElement(kwar_tableau(),kwar_get_index(id))
  kwar_tableau()\hauteur = hauteur
  kwar_calcul_taille_cellule(id)
  kwar_refresh(id)
EndProcedure

Procedure.l kwar_count(id.l)
;Renvoie le nombre de cellule du tableau
  SelectElement(kwar_tableau(),kwar_get_index(id))
  valeur = kwar_tableau()\nb_case
  ProcedureReturn valeur
EndProcedure

Procedure.l kwar_get_state(id.l)
;Renvoie l'ID de la première cellule active
  cellule = -1
  SelectElement(kwar_tableau(),kwar_get_index(id))
  nb_case = kwar_tableau()\nb_case
  
  For i=1 To nb_case
    NextElement(kwar_tableau())
    If kwar_tableau()\etat_case = 1 
      cellule = i
      Break
    EndIf
  Next
  ProcedureReturn cellule
EndProcedure

Procedure.l kwar_get_itemstate(id.l,ligne.l,col.l=#PB_Ignore)
;Renvoie l'état de la cellule sélectionnée
;Si colonne=#pb_ignore alors on compte avec les idcase et plus par ligne/colonne
SelectElement(kwar_tableau(),kwar_get_index(id))
nb_case = kwar_tableau()\nb_case
retour = -1

  If col=#PB_Ignore And ligne<=nb_case
    SelectElement(kwar_tableau(),kwar_get_index(id)+ligne)    
    retour = kwar_tableau()\etat_case
  Else
    If kwar_Select_case(id,ligne,col) 
      retour = kwar_tableau()\etat_case
    EndIf
  EndIf
ProcedureReturn retour
EndProcedure

Procedure.l kwar_get_aligntext(id.l,lg.l,col.l)
  If kwar_Select_case(id,lg,col) 
    alignement = kwar_tableau()\align_texte_h_case
  EndIf
  ProcedureReturn alignement  
EndProcedure

Procedure.l kwar_get_textcolor(id.l,lg.l,col.l)
  If kwar_Select_case(id,lg,col) 
    couleur = kwar_tableau()\color_texte_case
  EndIf
  ProcedureReturn couleur
EndProcedure

Procedure.l kwar_get_backcolor(id.l,lg.l,col.l)
  If kwar_select_case(id,lg,col)
    couleur = kwar_tableau()\color_fond_case
  EndIf
  ProcedureReturn couleur
EndProcedure

Procedure.l kwar_get_itemfont(id.l,lg.l,col.l)
  If kwar_select_case(id,lg,col)
    police = kwar_tableau()\font_texte_case
  EndIf
  ProcedureReturn police
EndProcedure

Procedure.s kwar_get_text(id.l,lg.l,col.l)
  If kwar_Select_case(id,lg,col)
        texte$ = kwar_tableau()\texte      
  EndIf
  ProcedureReturn texte$
EndProcedure

Procedure.l kwar_get_widthcolumn(id.l,col.l)
  If kwar_Select_case(id,1,col)
    taille = kwar_tableau()\tx_colonne
  EndIf
  ProcedureReturn taille
EndProcedure

Procedure.l kwar_get_heigthline(id.l,lg.l)
  If kwar_Select_case(id,lg,1)
    taille = kwar_tableau()\tx_ligne
  EndIf
  ProcedureReturn taille
EndProcedure

Procedure.l kwar_get_bordercolor(id.l)
  SelectElement(kwar_tableau(),kwar_get_index(id))
  couleur = kwar_tableau()\color_bordure
  ProcedureReturn couleur
EndProcedure

Procedure.l kwar_get_itemborder(id.l,ligne.l,col.l=#PB_Ignore);si il n'y a que la ligne alors c'est un idcase
;Renvoie la position des bordures de la cellule
If col=#PB_Ignore
  SelectElement(kwar_tableau(),kwar_get_index(id)+ligne)
  valeur = kwar_tableau()\position_bordure
Else
  If kwar_select_case(id,ligne,col)
    valeur = kwar_tableau()\position_bordure
  EndIf 
EndIf
ProcedureReturn valeur
EndProcedure

Procedure.l kwar_get_widthborder(id)
;Renvoie la largeur de la bordure tableau
  SelectElement(kwar_tableau(),kwar_get_index(id))
  taille = kwar_tableau()\largeur_bordure
  ProcedureReturn taille
EndProcedure

Procedure.l kwar_get_modebacktext(id.l,ligne.l,colonne.l)
;Renvoie le mode d'affichage du texte dans les cellules
  kwar_select_case(id,ligne,colonne)
  mode = kwar_tableau()\mode_backtexte
  ProcedureReturn mode
EndProcedure

Procedure.l kwar_get_backtext_color(id.l,ligne.l,colonne.l)
;Renvoie la couleur du fond de texte à ne pas confondre avec la couleur de la cellule
  kwar_select_case(id,ligne,colonne)
  color = kwar_tableau()\color_backtexte
  ProcedureReturn color
EndProcedure

Procedure kwar_insert_line(id.l,lg.l)
;Insère une ligne dans le tableau après la ligne spécifié
  SelectElement(kwar_tableau(),kwar_get_index(id))
  nb_col = kwar_tableau()\nb_col
  nb_case = kwar_tableau()\nb_case
  nb_ligne = kwar_tableau()\nb_ligne

  kwar_tableau()\nb_case = nb_case + nb_col
  kwar_tableau()\nb_ligne = nb_ligne + 1
  
  If kwar_select_case(id,lg,nb_col)
    For u=1 To nb_col
      AddElement(kwar_tableau())
      kwar_tableau()\color_fond_case = RGB(255,255,255)
      kwar_tableau()\texte = ""
      kwar_tableau()\color_texte_case = RGB(0,0,0)
      kwar_tableau()\align_texte_h_case = #kwar_text_center 
      kwar_tableau()\font_texte_case = #PB_Default
      ;kwar_tableau()\position_bordure = #all_border+10000
      kwar_tableau()\user_tx_ligne = 0
      kwar_tableau()\etat_case = 0      
    Next
    
    For u=1 To nb_col
      kwar_select_case(id,lg,u)
      user_x = kwar_tableau()\user_tx_colonne
      tx_col = kwar_tableau()\tx_colonne
      bordure = kwar_tableau()\position_bordure
      kwar_select_case(id,lg+1,u)
      kwar_tableau()\user_tx_colonne = user_x
      kwar_tableau()\tx_colonne = tx_col
      kwar_tableau()\position_bordure = bordure
    Next 
    
    SelectElement(kwar_tableau(),kwar_get_index(id))   
    
    compteur = 1
    For i=1 To nb_ligne+1
     For t=1 To nb_col
      NextElement(kwar_tableau())
       kwar_tableau()\id_case = compteur
       kwar_tableau()\num_ligne = i
       kwar_tableau()\num_col = t
       compteur = compteur+1
      Next t  
    Next i
    
  EndIf
  kwar_calcul_taille_cellule(id)
  kwar_refresh(id)
EndProcedure

Procedure kwar_insert_column(id,col.l)
;Insère une colonne dans le tableau après la colonne spécifié
  SelectElement(kwar_tableau(),kwar_get_index(id))
  nb_col = kwar_tableau()\nb_col
  nb_case = kwar_tableau()\nb_case
  nb_ligne = kwar_tableau()\nb_ligne

  kwar_tableau()\nb_case = nb_case + nb_ligne
  kwar_tableau()\nb_col = nb_col + 1
  
  If kwar_select_case(id,nb_ligne,col)
    For u=1 To nb_ligne
      kwar_select_case(id,u,col)
      AddElement(kwar_tableau())
      kwar_tableau()\color_fond_case = RGB(255,255,255)
      kwar_tableau()\texte = ""
      kwar_tableau()\color_texte_case = RGB(0,0,0)
      kwar_tableau()\align_texte_h_case = #kwar_text_center
      kwar_tableau()\font_texte_case = #PB_Default
      ;kwar_tableau()\position_bordure = #all_border+10000
      kwar_tableau()\user_tx_colonne = 0
      kwar_tableau()\etat_case = 0      
    Next
    
    For u=1 To nb_ligne
      kwar_select_case(id,u,col)
      user_y = kwar_tableau()\user_tx_ligne
      tx_lg = kwar_tableau()\tx_ligne
      bordure = kwar_tableau()\position_bordure
      kwar_select_case(id,u,col+1)
      kwar_tableau()\user_tx_ligne = user_y
      kwar_tableau()\tx_ligne = tx_lg
      kwar_tableau()\position_bordure = bordure
    Next 
    
    SelectElement(kwar_tableau(),kwar_get_index(id))   
    
    compteur = 1
    For i=1 To nb_ligne
     For t=1 To nb_col+1
      NextElement(kwar_tableau())
       kwar_tableau()\id_case = compteur
       kwar_tableau()\num_ligne = i
       kwar_tableau()\num_col = t
       compteur = compteur+1
      Next t  
    Next i
    
  EndIf
  kwar_calcul_taille_cellule(id)
  kwar_refresh(id)
EndProcedure

Procedure kwar_delete_line(id.l,lg.l)
;Efface une ligne
  If kwar_select_case(id,lg,1)
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_col = kwar_tableau()\nb_col
    nb_case = kwar_tableau()\nb_case
    nb_ligne = kwar_tableau()\nb_ligne


    
    For y=1 To nb_col
      kwar_select_case(id,lg,(nb_col+1)-y)
      DeleteElement(kwar_tableau())    
    Next y
    
    SelectElement(kwar_tableau(),kwar_get_index(id))   
    
    kwar_tableau()\nb_case = nb_case - nb_col
    nb_ligne = nb_ligne - 1
    kwar_tableau()\nb_ligne = nb_ligne
    
    compteur = 1
    For i=1 To nb_ligne
     For t=1 To nb_col
      NextElement(kwar_tableau())
       kwar_tableau()\id_case = compteur
       kwar_tableau()\num_ligne = i
       kwar_tableau()\num_col = t
       compteur = compteur+1
      Next t  
    Next i
    
  EndIf
  kwar_calcul_taille_cellule(id)
  kwar_refresh(id)   
EndProcedure

Procedure kwar_delete_column(id.l,col.l)
;Efface une colonne
  If kwar_select_case(id,1,col)
    SelectElement(kwar_tableau(),kwar_get_index(id))
    nb_col = kwar_tableau()\nb_col
    nb_case = kwar_tableau()\nb_case
    nb_ligne = kwar_tableau()\nb_ligne


    
    For y=1 To nb_ligne
      kwar_select_case(id,(nb_ligne+1)-y,col)
      DeleteElement(kwar_tableau())    
    Next y
    
    SelectElement(kwar_tableau(),kwar_get_index(id))   
    
    kwar_tableau()\nb_case = nb_case - nb_ligne
    nb_col = nb_col - 1
    kwar_tableau()\nb_col = nb_col
    
    compteur = 1
    For i=1 To nb_ligne
     For t=1 To nb_col
      NextElement(kwar_tableau())
       kwar_tableau()\id_case = compteur
       kwar_tableau()\num_ligne = i
       kwar_tableau()\num_col = t
       compteur = compteur+1
      Next t  
    Next i
    
  EndIf
  kwar_calcul_taille_cellule(id)
  kwar_refresh(id)
EndProcedure  

Procedure kwar_delete_array(id.l)
;Efface un tableau et détruit le gadget
  SelectElement(kwar_tableau(),kwar_get_index(id))
  id_imagegadget = kwar_tableau()\id_imagegadget
  id_image = kwar_tableau()\id_image
  nb_case = kwar_tableau()\nb_case
  
  For u=0 To nb_case
      SelectElement(kwar_tableau(),kwar_get_index(id)+(nb_case-u))
      DeleteElement(kwar_tableau())
  Next
  
  FreeImage(id_image)
  FreeGadget(id_imagegadget)    
EndProcedure

Procedure kwar_itemcopy(id.l,ligne.l,colonne.l,lgcopy.l,colcopy.l,mode.l=#Null)
  kwar_select_case(id,ligne,colonne)
  
  texte$ = kwar_tableau()\texte
  sens_texte = kwar_tableau()\sens_texte
  couleur_texte = kwar_tableau()\color_texte_case
  police = kwar_tableau()\font_texte_case
  
  couleur_fond = kwar_tableau()\color_fond_case
  alignH = kwar_tableau()\align_texte_h_case
  alignV = kwar_tableau()\align_texte_v_case
  color_backtexte = kwar_tableau()\color_backtexte
  mode_backtexte = kwar_tableau()\mode_backtexte
  pos_bordure = kwar_tableau()\position_bordure
  bordure_g = kwar_tableau()\bordure_gauche
  col_bordure_g = kwar_tableau()\couleur_bordure_g     
  bordure_h = kwar_tableau()\bordure_haut
  col_bordure_h = kwar_tableau()\couleur_bordure_h
  bordure_d = kwar_tableau()\bordure_droite
  col_bordure_d = kwar_tableau()\couleur_bordure_d
  bordure_b = kwar_tableau()\bordure_bas
  col_bordure_b = kwar_tableau()\couleur_bordure_b
  
  kwar_select_case(id,lgcopy,colcopy)
  
  kwar_tableau()\texte = texte$
  kwar_tableau()\sens_texte = sens_texte
  
  If mode<>#Null
    kwar_tableau()\font_texte_case = police
    kwar_tableau()\color_fond_case = couleur_fond
    kwar_tableau()\align_texte_h_case = alignH
    kwar_tableau()\align_texte_v_case = alignV
    kwar_tableau()\mode_backtexte = mode_backtexte
    kwar_tableau()\color_backtexte = color_backtexte
    kwar_tableau()\position_bordure = pos_bordure
    kwar_tableau()\bordure_gauche = bordure_g
    kwar_tableau()\couleur_bordure_g = col_bordure_g     
    kwar_tableau()\bordure_haut = bordure_h
    kwar_tableau()\couleur_bordure_h = col_bordure_h
    kwar_tableau()\bordure_droite = bordure_d
    kwar_tableau()\couleur_bordure_d = col_bordure_d
    kwar_tableau()\bordure_bas = bordure_b
    kwar_tableau()\couleur_bordure_b = col_bordure_b
    
    kwar_set_itemborder(id,lgcopy,colcopy,pos_bordure)
  EndIf 
  kwar_refresh(id)
EndProcedure

Procedure.s kwar_edititem(id.l,ligne.l,colonne.l)
  SelectElement(kwar_tableau(),kwar_get_index(id))
  id_edit = kwar_tableau()\id_edit
  AddKeyboardShortcut(kwar_tableau()\id_fenetre,#PB_Shortcut_Return,#retour)
  AddKeyboardShortcut(kwar_tableau()\id_fenetre,#PB_Shortcut_Escape,#ESC)
  posx = kwar_tableau()\posx + kwar_tableau()\largeur_bordure
  posy = kwar_tableau()\posy + kwar_tableau()\largeur_bordure
  
  kwar_select_case(id,ligne,colonne)  
    If kwar_tableau()\font_texte_case<>#PB_Default
      SetGadgetFont(id_edit,FontID(kwar_tableau()\font_texte_case))
    EndIf
  SetGadgetColor(id_edit,#PB_Gadget_BackColor,kwar_tableau()\color_fond_case)
  SetGadgetColor(id_edit,#PB_Gadget_FrontColor,kwar_tableau()\color_texte_case)
  SetGadgetText(id_edit,kwar_tableau()\texte)
  ResizeGadget(id_edit,kwar_tableau()\posx_case+posx,kwar_tableau()\posy_case+posy,kwar_tableau()\tx_colonne,kwar_tableau()\tx_ligne)
  HideGadget(id_edit,0)
  DisableGadget(id,1)
  SetActiveGadget(id_edit)
  memo$ = GetGadgetText(id_edit)
  
  Repeat
    event = WaitWindowEvent()
      texte$ = GetGadgetText(id_edit)
      If EventMenu() = #ESC
        texte$ = memo$
        Break
      EndIf
  Until event = #PB_Event_Menu And EventMenu() = #Retour
  ;texte$ = GetGadgetText(id_edit)
  HideGadget(id_edit,1)
  kwar_tableau()\texte = texte$
  DisableGadget(id,0)
  kwar_refresh(id)
  ProcedureReturn texte$
EndProcedure
If OpenWindow(0, 100, 200, 300, 200, "2D Drawing Test") And CreateGadgetList(WindowID(0))

  ; Create an offscreen image, with a green circle in it.
  ; It will be displayed later
;LoadFont(1, "Arial", 13)
LoadFont(2,"courrier",15)
gadget1 = kwar_create(#PB_Any,10,10,201,101,4,4)

kwar_set_itemfont(1,3,3,2)
  ; Create a gadget to display our nice image
kwar_create(2,10,120,100,52,2,3)
kwar_set_text(1,2,4,"l2,c4",#kwar_Text_left,#kwar_text_center)
kwar_set_textcolor(1,3,3,RGB(200,50,120))
kwar_set_backcolor(1,3,3,RGB(200,240,255))
kwar_set_text(1,3,3,"100 m",#kwar_text_center,#kwar_text_center)
;kwar_set_textalign(gadget1,3,3,#kwar_text_top,#kwar_Text_left)
kwar_set_border(1,3,RGB(200,100,200))
kwar_set_widthcolumn(2,3,60)
kwar_set_heightline(1,4,40)
;kwar_set_itemborder(1,2,1,#right_border+#left_border)
kwar_set_itemborder(1,6,#PB_Ignore,#right_border+#left_border)

For i=1 To 4
  kwar_set_backcolor(1,i,1,RGB(50*i,200,150))
  ;kwar_set_itemborder(1,i,1,#left_border+#right_border)
Next
 kwar_set_itemmode(gadget1,2,2,#kwar_selected)
 kwar_set_iteminborder(gadget1,3,3,#bottom_border,2,kwar_get_bordercolor(gadget1))
 ;kwar_set_iteminborder(gadget1,3,3,#all_border,1,#PB_Ignore)
 
  ; This is the 'event loop'. All the user actions are processed here.
  ; It's very easy to understand: when an action occurs, the EventID
  ; isn't 0 and we just have to see what have happened...
  ;
  
  Repeat
    EventID = WaitWindowEvent() 
       
       Select Eventid
     
        Case #PB_Event_Gadget
        
          If EventType()=#PB_EventType_LeftClick
            
           Select EventGadget()
             Case gadget1
                  kwar_set_state(gadget1,kwar_over_line(0,gadget1),kwar_over_column(0,gadget1),1,#kwar_oneselect)
                  kwar_edititem(gadget1,kwar_over_line(0,gadget1),kwar_over_column(0,gadget1))
           EndSelect
          EndIf
          
          If EventType()=#PB_EventType_RightClick
          Select EventGadget()
            Case gadget1
              kwar_set_state(gadget1,kwar_over_line(0,gadget1),kwar_over_column(0,gadget1),1,#kwar_multiselect)
              ;kwar_set_text(gadget1,kwar_over_line(0,1),kwar_over_column(0,1),Str(compteur),#kwar_text_bottom)    
              ;compteur = compteur+1
              ;kwar_itemcopy(gadget1,1,1,3,4,1)
              ;kwar_set_backtext(gadget1,3,3,RGB(200,255,200),#PB_2DDrawing_Default)
              ;kwar_insert_line(gadget1,2)
              ;kwar_delete_line(gadget1,3)
              ;kwar_delete_column(gadget1,2)
              ;kwar_set_border(gadget1,5,RGB(255,150,150))           
            Case 2
              kwar_set_state(2,kwar_over_line(0,2),kwar_over_column(0,2),-1,#kwar_multiselect)
              kwar_set_width(2,200)
              kwar_set_height(2,20)
          EndSelect
          EndIf
       EndSelect

  Until EventID = #PB_Event_CloseWindow  ; If the user has pressed on the window close button
  
EndIf

End
[/code]
Dernière modification par kwandjeen le dim. 09/nov./2008 18:20, modifié 3 fois.
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Message par kwandjeen »

le fichier kwin pour gerer les évènement et style graphique des gadgets

Code : Tout sélectionner

Procedure kwin_init()
  #simple = 0
  #miroir = 1
  
  Enumeration
  #elliptic
  #rect
  #vert
  #horz
  #ballon
  #defaut
  #switch
  EndEnumeration
  
  Structure ibdata 
    pbgadget.l 
    idgadget.l 
    etat.l 
    hwnd.l 
    image.l[3] 
  EndStructure 
  Global NewList buttondata.ibdata() 
  
  Global backbrush
  Global idgadget_event.l
  Global pbgadget_event.l
  Global gid
  Global ToolTipControl
  
  #IButton_none=1
  #IButton_MouseDown=2 
  #IButton_MouseEnter=3 
  #IButton_MouseUp=4 
  
  Global centrex.l
  Global centrey.l
  Global backbrush
  Global kwin_verification_init=1
EndProcedure

Procedure kwin_verif_init()
If kwin_verification_init = 0
  kwin_init()
EndIf
EndProcedure

Procedure kwin_CreateImageButton(gadget,image,bkimage,hwnd,posx,posy,transcolor)
kwin_verif_init()
 ;CreateImageButton(#gadget,#image,BackgroundImageID,WindowHandle,x,y,Transcolor)
; la taille du bouton est donné par l'image
  AddElement(buttondata()) 
  buttondata()\pbgadget=gadget
  buttondata()\hwnd=hwnd 
  id=ImageID(image) 
  w=ImageWidth(image)/3:h=ImageHeight(image) 
  If transcolor=-1 
    StartDrawing(ImageOutput(image)) 
      transcolor=Point(w-1,0) 
    StopDrawing() 
  EndIf 
  imglist=ImageList_Create_(w,h,#ILC_COLORDDB|#ILC_MASK,3,0) 
  ImageList_AddMasked_(imglist,id,transcolor) 
  If bkimage = #PB_Ignore
    bkimage = image
  EndIf 
  dc=StartDrawing(ImageOutput(bkimage)) 
    For i=0 To 2 
      buttondata()\image[i]=CreateCompatibleBitmap_(dc,w,h) 
      tdc=CreateCompatibleDC_(dc) 
      object=SelectObject_(tdc,buttondata()\image[i]) 
      BitBlt_(tdc,0,0,w,h,dc,posx,posy,#SRCCOPY) 
      ImageList_Draw_(imglist,i,tdc,0,0,#ILD_TRANSPARENT) 
      DeleteObject_(object) 
      DeleteDC_(tdc) 
    Next i    
  StopDrawing()  
  ImageList_Destroy_(imglist) 
  buttondata()\idgadget=CreateWindowEx_(0,"STATIC","",1409286158|#SS_NOTIFY,posx,posy,w,h,hwnd,0,0,0) 
  SendMessage_(buttondata()\idgadget,370,0,buttondata()\image[0]) 
  ProcedureReturn buttondata()\idgadget 
EndProcedure

Procedure kwin_buttonEvent() ; change l'image et renvoie le gadget cliqué
  GetCursorPos_(mousepos.POINT) 
  ForEach buttondata() 
    GetWindowRect_(buttondata()\idgadget,position.RECT) 
    If PtInRect_(position,mousepos\x,mousepos\y) And GetForegroundWindow_()=buttondata()\hwnd 
      If GetAsyncKeyState_(#VK_LBUTTON+GetSystemMetrics_(#SM_SWAPBUTTON)) 
        If buttondata()\etat=1
          SendMessage_(buttondata()\idgadget,370,0,buttondata()\image[2])
          buttondata()\etat=2:etype=#IButton_MouseDown
        EndIf
      ElseIf buttondata()\etat=2
        SendMessage_(buttondata()\idgadget,370,0,buttondata()\image[0])
        buttondata()\etat=0:etype=#IButton_MouseUp
      ElseIf buttondata()\etat=0
        SendMessage_(buttondata()\idgadget,370,0,buttondata()\image[1]) 
        buttondata()\etat=1:etype=#IButton_mouseEnter
      ;ElseIf buttondata()\state>1
        ;SendMessage_(buttondata()\handle,370,0,buttondata()\image[1]) 
        ;buttondata()\state=1:etype=#IButton_Inside
      ;ElseIf buttondata()\state<1
        ;SendMessage_(buttondata()\handle,370,0,buttondata()\image[1]) 
        ;buttondata()\state=1:etype=#IButton_Enter
      EndIf 
      pbgadget_event=buttondata()\pbgadget 
      idgadget_event=buttondata()\idgadget
    ElseIf buttondata()\etat>0 
      etype=#IButton_none
      buttondata()\etat=0 
      SendMessage_(buttondata()\idgadget,370,0,buttondata()\image[0]) 
    EndIf 
  Next 
  ProcedureReturn etype
  EndProcedure

Procedure kwin_gradient(posx.l,posy.l,taillex.l,tailley.l,col1.l,col2.l,sens.b,miroir.b)
kwin_verif_init()
  If sens = #vert
    i = taillex
  Else
    i = tailley
  EndIf
  
  If miroir<>0
    i = i/2
  EndIf 
  
    sRed.f   = Red(col1)   : r.f = (Red  (col1) - Red  (col2))/i 
    sGreen.f = Green(col1) : g.f = (Green(col1) - Green(col2))/i 
    sBlue.f  = Blue(col1)  : b.f = (Blue (col1) - Blue (col2))/i
    
    For a=0 To i
        x.f = sRed   - a*r 
        y.f = sGreen - a*g 
        z.f = sBlue  - a*b 

        If sens=#horz 
          Line(posx,posy+a,taillex,0,RGB(x,y,z)) 
          If miroir <> 0
            Line(posx,posy+(tailley-a),taillex,0,RGB(x,y,z))
          EndIf
        Else 
          Line(posx+a,posy,0,tailley,RGB(x,y,z)) 
          If miroir <> 0
            Line(pox+(taillex-a),posy,0,tailley,RGB(x,y,z))
          EndIf
        EndIf 
    Next a 

EndProcedure

Procedure kwin_remplissage(dc,region,couleur,image)
  If image <> #PB_Ignore
    brush = CreatePatternBrush_(ImageID(image))
  Else
    brush = CreateSolidBrush_(couleur)
  EndIf
  FillRgn_(dc,region,brush):DeleteObject_(brush) ;remplir avec le brush et la region
EndProcedure

Procedure.l kwin_create_region(forme.b,posx.l,posy.l,lx.l,ly.l,ar1.l,ar2.l) ; création d'une region style rectangle arrondi
kwin_verif_init()
If forme = #elliptic
  region = CreateEllipticRgn_(lx, ly, ar1, ar2)
Else
  region = CreateRoundRectRgn_(posx,posy,lx, ly, ar1, ar2)
EndIf 
  ProcedureReturn region
EndProcedure

Procedure kwin_apply_region(idgadget,region)
  SetWindowRgn_(idgadget, region, #True)
EndProcedure

Procedure kwin_liseret(dc,region,couleur,image,t1,t2) ; dessin liseret dans un startdrawing
  If image <> #PB_Ignore
    brush = CreatePatternBrush_(ImageID(image))
  Else
    brush = CreateSolidBrush_(couleur)
  EndIf
  FrameRgn_(dc,region,brush,t1,t2):DeleteObject_(brush) ; créer un contour
EndProcedure

Procedure kwin_image_window(window.l,image.l,wregion.l) ; applique image à la fenetre
  cox = WindowX(window)
  coy = WindowY(window)
  If wregion = #PB_Ignore
    wregion = #Null
  EndIf
  backbrush=CreatePatternBrush_(ImageID(image))
  SetWindowRgn_(WindowID(window),wregion,#True):DeleteObject_(wregion) 
  SetClassLong_(WindowID(window),#GCL_HBRBACKGROUND,backbrush)
  ResizeWindow(window,cox-1,coy-1,#PB_Ignore,#PB_Ignore)
EndProcedure

Procedure kwin_titlebar_CB(hWnd,Msg,wParam,lParam) 
  Addr=GetWindowLong_(hWnd,#GWL_USERDATA) 
  
  If GetWindowLong_(hWnd,#GWL_USERDATA)<>0 
    Result=CallWindowProc_(PeekL(Addr),hWnd,Msg,wParam,lParam) 
  Else 
    Result=DefWindowProc_(hWnd,Msg,wParam,lParam) 
  EndIf 
  
  
  If Msg=#WM_SETTEXT Or Msg=#WM_NCPAINT Or Msg=#WM_SIZE Or Msg=#WM_MOVE Or Msg=#WM_SHOWWINDOW Or Msg=#WM_PAINT Or Msg=#WM_DISPLAYCHANGE Or Msg=#WM_ACTIVATE 
    
    RE.RECT 
    GetWindowRect_(hWnd,RE) 
    WindowLx=RE\Right-RE\Left 
    WindowLy=RE\Bottom-RE\Top 
    
    RGB1=PeekL(Addr+4) 
    RGB2=PeekL(Addr+8) 
    TextColor=PeekL(Addr+12) 
    Font=PeekL(Addr+16) 
    
    DC=GetWindowDC_(hWnd) 
    
    CapW=(WindowLx-GetSystemMetrics_(#SM_CXFIXEDFRAME)*2) 
    
    Y=GetSystemMetrics_(#SM_CYCAPTION)-1 
    If Y=Y And #WS_SIZEBOX:Y=Y+1:EndIf 
    
    For X=0 To WindowLx-(GetSystemMetrics_(#SM_CXFIXEDFRAME)*2)    
      R1=Red(RGB1) 
      G1=Green(RGB1) 
      B1=Blue(RGB1) 
      R2=Red(RGB2) 
      G2=Green(RGB2) 
      B2=Blue(RGB2) 
      M=(CapW-X) 
      
      Pen=CreatePen_(#PS_SOLID,1,RGB((R1*M+R2*X)/CapW,(G1*M+G2*X)/CapW,(B1*M+B2*X)/CapW)) 
      SelectObject_(DC,Pen) 
      MoveToEx_(DC,X+GetSystemMetrics_(#SM_CXFIXEDFRAME),GetSystemMetrics_(#SM_CYFIXEDFRAME),0) 
      LineTo_(DC,X+GetSystemMetrics_(#SM_CXFIXEDFRAME),GetSystemMetrics_(#SM_CYFIXEDFRAME)+Y) 
      DeleteObject_(Pen) 
    Next 
    
    Global Dim Rect(3) 
    SelectObject_(DC,Font)    
    Text$=Space(GetWindowTextLength_(hWnd)+1)+Chr(0) 
    GetWindowText_(hWnd,Text$,GetWindowTextLength_(hWnd)+1) 
    
    Txtheight=DrawText_(DC,Text$,Len(Text$),@Rect(0),0) 
    Rect(0)=GetSystemMetrics_(#SM_CXFIXEDFRAME) 
    Rect(1)=(GetSystemMetrics_(#SM_CYCAPTION)+GetSystemMetrics_(#SM_CYFIXEDFRAME))/2-Txtheight/2 
    Rect(2)=WindowLx-GetSystemMetrics_(#SM_CXFIXEDFRAME) 
    Rect(3)=GetSystemMetrics_(#SM_CYCAPTION)+GetSystemMetrics_(#SM_CYFIXEDFRAME) 
    
    SetTextColor_(DC,TextColor) 
    SetBkMode_(DC,1) 
    DrawText_(DC,Text$,Len(Text$),@Rect(0),#DT_CENTER|#DT_VCENTER) 
    ReleaseDC_(hWnd,DC) 
  EndIf 
  
  If Msg=#WM_DESTROY 
    GlobalFree_(Addr) 
    SetWindowLong_(hWnd,#GWL_USERDATA,0) 
  EndIf 
  
  ProcedureReturn Result 
EndProcedure

Procedure kwin_color_titlebar(hwnd,Color1,Color2,TextColor,Font) ; colore la titlebar
  If Font=0:Font=GetStockObject_(#ANSI_VAR_FONT):EndIf 
  Addr=GlobalAlloc_(#GMEM_FIXED,20) 
  OldCB=SetWindowLong_(hWnd,#GWL_WNDPROC,@kwin_titlebar_CB()) 
  PokeL(Addr,OldCB) 
  PokeL(Addr+4,Color1) 
  PokeL(Addr+8,Color2) 
  PokeL(Addr+12,TextColor) 
  PokeL(Addr+16,Font) 
  SetWindowLong_(hWnd,#GWL_USERDATA,Addr)  
EndProcedure

Procedure kwin_centre_ecran() ; récupère le point central de l'écran
  centrex=GetSystemMetrics_(#SM_CXSCREEN)/2
  centrey=GetSystemMetrics_(#SM_CYSCREEN)/2
EndProcedure

Procedure kwin_get_idgadget(idgadget) ; renvoie l'id gadget PB avec l'id window du gadget
  pbgadget = GetDlgCtrlID_(idgadget)
  ProcedureReturn pbgadget
EndProcedure

Procedure kwin_ISover_idgadget(idGadget)
  ;GetWindowRect_(GadgetID(Gadget),GadgetRect.RECT) si numero gadget PB
  GetWindowRect_(idGadget,GadgetRect.RECT)
  GetCursorPos_(mouse.POINT) 
  If mouse\x>=GadgetRect\Left And mouse\x<=GadgetRect\right And mouse\y>=GadgetRect\Top And mouse\y<=GadgetRect\bottom 
    ProcedureReturn #True 
  Else 
    ProcedureReturn #False 
  EndIf 
EndProcedure

Procedure kwin_IDover_gadget(Windowid=#PB_Ignore)
  If windowid = #PB_Ignore
    windowid = GetForegroundWindow_()
  EndIf
  ;hwnd = WindowID(Window)
  ;hwnd.l = Windowid ; il faut renvoyé l'ID de la fenetre
  GetCursorPos_(mouse.POINT)
  ScreenToClient_ (Windowid, @mouse)
  ;MapWindowPoints_(0,Window,mouse,1)
  ProcedureReturn ChildWindowFromPoint_(Windowid,mouse\x,mouse\y) 
EndProcedure

Procedure kwin_addtooltip(Handle,window,Text$,coltext,colfond,effet)
  #TTS_BALLOON = $40
  
  Select effet
    Case #ballon
      valeffet = $D0000040
    Case #switch
      valeffet = 40
    Default
      valeffet = $D0000000
  EndSelect
  
  ToolTipControl=CreateWindowEx_(0,"tooltips_class32","",valeffet,0,0,0,0,WindowID(window),0,GetModuleHandle_(0),0) 
  SendMessage_(ToolTipControl,1044,coltext ,0) ;couleur du texte
  SendMessage_(ToolTipControl,1043,colfond,0) ;couleur du fond
  SendMessage_(ToolTipControl,1048,0,180) ;taille maxi du tolltip
  Button.TOOLINFO\cbSize=84 ; SizeOf( TOOLINFO )
  Button\uFlags=$11
  Button\hWnd=Handle
  Button\uId=Handle
  Button\lpszText=@Text$
  SendMessage_(ToolTipControl,$0404,0,Button)
  ProcedureReturn ToolTipControl ; retourne l'handle
EndProcedure

Procedure kwin_close_all()
  ForEach buttondata() 
    For i=0 To 2 
      DeleteObject_(buttondata()\image[i]) 
    Next i 
    If mode 
      DestroyWindow_(buttondata()\idgadget) 
    EndIf 
  Next 
  ClearList(buttondata())
  DeleteObject_(backbrush)
  End
EndProcedure
Dernière modification par kwandjeen le dim. 09/nov./2008 18:04, modifié 1 fois.
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Message par kwandjeen »

des exmples vite fait

Code : Tout sélectionner

XIncludeFile "kwin.pbi"
XIncludeFile "kwar.pbi" ;procedure tableau

If OpenWindow(0, 100, 200, 300, 200, "2D Drawing Test") And CreateGadgetList(WindowID(0))

  ; Create an offscreen image, with a green circle in it.
  ; It will be displayed later
;LoadFont(1, "Arial", 13)
LoadFont(2,"courrier",15)
gadget1 = kwar_create(#PB_Any,10,10,201,101,4,4)

kwar_set_itemfont(1,3,3,2)
  ; Create a gadget to display our nice image
kwar_create(2,10,120,100,52,2,3)
kwar_set_text(1,2,4,"l2,c4",#kwar_Text_left,#kwar_text_center)
kwar_set_textcolor(1,3,3,RGB(200,50,120))
kwar_set_backcolor(1,3,3,RGB(200,240,255))
kwar_set_text(1,3,3,"100 m",#kwar_text_center,#kwar_text_center)
;kwar_set_textalign(gadget1,3,3,#kwar_text_top,#kwar_Text_left)
kwar_set_border(1,3,RGB(200,100,200))
kwar_set_widthcolumn(2,3,60)
kwar_set_heightline(1,4,40)
;kwar_set_itemborder(1,2,1,#right_border+#left_border)
kwar_set_itemborder(1,6,#PB_Ignore,#right_border+#left_border)

For i=1 To 4
  kwar_set_backcolor(1,i,1,RGB(50*i,200,150))
  ;kwar_set_itemborder(1,i,1,#left_border+#right_border)
Next
 kwar_set_itemmode(gadget1,2,2,#kwar_selected)
 kwar_set_iteminborder(gadget1,3,3,#bottom_border,2,kwar_get_bordercolor(gadget1))
 ;kwar_set_iteminborder(gadget1,3,3,#all_border,1,#PB_Ignore)
 
  ; This is the 'event loop'. All the user actions are processed here.
  ; It's very easy to understand: when an action occurs, the EventID
  ; isn't 0 and we just have to see what have happened...
  ;
  
  Repeat
    EventID = WaitWindowEvent() 
       
       Select Eventid
     
        Case #PB_Event_Gadget
        
          If EventType()=#PB_EventType_LeftClick
            
           Select EventGadget()
             Case gadget1
                  kwar_set_state(gadget1,kwar_over_line(0,gadget1),kwar_over_column(0,gadget1),1,#kwar_oneselect)
                  kwar_edititem(gadget1,kwar_over_line(0,gadget1),kwar_over_column(0,gadget1))
           EndSelect
          EndIf
          
          If EventType()=#PB_EventType_RightClick
          Select EventGadget()
            Case gadget1
              kwar_set_state(gadget1,kwar_over_line(0,gadget1),kwar_over_column(0,gadget1),1,#kwar_multiselect)
              ;kwar_set_text(gadget1,kwar_over_line(0,1),kwar_over_column(0,1),Str(compteur),#kwar_text_bottom)    
              ;compteur = compteur+1
              ;kwar_itemcopy(gadget1,1,1,3,4,1)
              ;kwar_set_backtext(gadget1,3,3,RGB(200,255,200),#PB_2DDrawing_Default)
              ;kwar_insert_line(gadget1,2)
              ;kwar_delete_line(gadget1,3)
              ;kwar_delete_column(gadget1,2)
              ;kwar_set_border(gadget1,5,RGB(255,150,150))           
            Case 2
              kwar_set_state(2,kwar_over_line(0,2),kwar_over_column(0,2),-1,#kwar_multiselect)
              kwar_set_width(2,200)
              kwar_set_height(2,20)
          EndSelect
          EndIf
       EndSelect

  Until EventID = #PB_Event_CloseWindow  ; If the user has pressed on the window close button
  
EndIf

End
et là le début d'un éditeur de tableau, il n' y a que les bordure qui fonctionne j'ai pas beaucoup avancé

Code : Tout sélectionner

;editeur tableau
XIncludeFile "kwin.pbi" ;procedure interface
XIncludeFile "kwar.pbi" ;procedure tableau

Enumeration
;#window_0
#window_newt
EndEnumeration
#window_0 = 12
Enumeration
;constante fenetre principale
#tool_bar

#tool_new
#tool_open
#tool_save
#tool_cut
#tool_copy
#tool_coller
#tool_delete
#tool_properties
#tool_quit
#tool_bordureG
#tool_bordureH
#tool_bordureD
#tool_bordureB

#im_quit
#im_bordureG
#im_bordureH
#im_bordureD
#im_bordureB

;constante fenetre création tableau
  #newt_label1
  #newt_label2
  #newt_label3
  #newt_label4
  #newt_entry_largeur
  #newt_entry_hauteur
  #newt_entry_ligne
  #newt_entry_colonne
  #newt_bouton_creer
  #newt_bouton_annuler
  
  #supp
EndEnumeration

Global gadgetliste.l
Global idtableau.l

;création de l'image quitter pour la toolbar
CreateImage(#im_quit,16,16)
StartDrawing(ImageOutput(#im_quit))
  kwin_gradient(0,0,16,16,RGB(199, 180, 85),RGB(236, 229, 196),#horz,#miroir)
  LineXY(3,3,12,12,RGB(223, 0, 0))
  LineXY(3,12,12,3,RGB(223, 0, 0))
StopDrawing()

CreateImage(#im_bordureG,16,16)
CreateImage(#im_bordureH,16,16)
CreateImage(#im_bordureD,16,16)
CreateImage(#im_bordureB,16,16)

For i=0 To 3
  StartDrawing(ImageOutput(#im_bordureG+i))
    Box(0,0,16,16,RGB(254, 255, 221))
    Select i
      Case 0
        Box(1,1,3,14,RGB(0,0,0))
      Case 1
        Box(1,1,14,3,RGB(0,0,0))
      Case 2
        Box(12,1,3,14,RGB(0,0,0))
      Case 3
        Box(1,12,14,3,RGB(0,0,0))
    EndSelect
  StopDrawing()
Next


Procedure window_0()
If OpenWindow(#window_0,#PB_Ignore,#PB_Ignore,800,600,"Editeur de tableau",#PB_Window_SystemMenu |#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
    If CreateToolBar(#tool_bar, WindowID(#window_0))
      ToolBarStandardButton(#tool_new, #PB_ToolBarIcon_New)
      ToolBarToolTip(#tool_bar,#tool_new,"Nouveau tableau")
      ToolBarStandardButton(#tool_open, #PB_ToolBarIcon_Open)
      ToolBarStandardButton(#tool_save, #PB_ToolBarIcon_Save)
      ToolBarSeparator()
      ToolBarSeparator()
      ToolBarStandardButton(#tool_cut, #PB_ToolBarIcon_Cut)
      ToolBarStandardButton(#tool_copy, #PB_ToolBarIcon_Copy)
      ToolBarStandardButton(#tool_coller, #PB_ToolBarIcon_Paste)
      ToolBarSeparator()
      ToolBarStandardButton(#tool_delete, #PB_ToolBarIcon_Delete)
      ToolBarStandardButton(#tool_properties, #PB_ToolBarIcon_Properties)
      ToolBarSeparator()
      ToolBarImageButton(#tool_quit,ImageID(#im_quit))
      ToolBarToolTip(#tool_bar,#tool_quit,"Quitter l'application")
      ToolBarSeparator()
      ToolBarImageButton(#tool_bordureG,ImageID(#im_bordureG))
      ToolBarImageButton(#tool_bordureH,ImageID(#im_bordureH))
      ToolBarImageButton(#tool_bordureD,ImageID(#im_bordureD))
      ToolBarImageButton(#tool_bordureB,ImageID(#im_bordureB))
    EndIf
  gadgetliste = CreateGadgetList(WindowID(#window_0))  
EndIf
EndProcedure

Procedure.l new_tableau()

  If OpenWindow(#window_newt, 216, 0, 260, 110, "Création tableau", #PB_Window_ScreenCentered ,WindowID(#window_0))
    If CreateGadgetList(WindowID(#window_newt))
      TextGadget(#newt_label1, 10, 14, 80, 20, "Largeur/hauteur")
      TextGadget(#newt_label3, 10, 44, 108, 20, "NB_ligne/NB_colonne")
      StringGadget(#newt_entry_largeur, 130, 10, 50, 20, "",#PB_String_Numeric)
      StringGadget(#newt_entry_hauteur, 200, 10, 50, 20, "",#PB_String_Numeric)
      TextGadget(#newt_label2, 186, 14, 8, 15, "X")
      StringGadget(#newt_entry_ligne, 130, 40, 50, 20, "",#PB_String_Numeric)
      StringGadget(#newt_entry_colonne, 200, 40, 50, 20, "",#PB_String_Numeric)
      TextGadget(#newt_label4, 186, 44, 8, 15, "X")
      ButtonGadget(#newt_bouton_creer, 50, 80, 60, 20, "Créer")
      ButtonGadget(#newt_bouton_annuler, 150, 80, 60, 20, "Annuler")
      StickyWindow(#window_newt, 1) 
      SetActiveWindow(#window_newt)
      SetActiveGadget(#newt_entry_largeur)
  Repeat
    Event = WaitWindowEvent()
      Select Event    
        Case #PB_Event_Gadget
          
          Select EventGadget()            
            Case #newt_bouton_annuler
              event = fin
            Case #newt_bouton_creer
              largeur.s = GetGadgetText(#newt_entry_largeur)
              hauteur.s = GetGadgetText(#newt_entry_hauteur)
              ligne.s = GetGadgetText(#newt_entry_ligne)
              col.s = GetGadgetText(#newt_entry_colonne)
              If largeur="" Or hauteur="" Or ligne="" Or col=""
                MessageRequester("Erreur","Une entrée au moins n'est pas correcte ou non remplie")
              Else
                  If idtableau<>0
                      kwar_delete_array(idtableau)
                  EndIf
                  UseGadgetList(WindowID(#window_0))
                  
                  idtableau.l = kwar_create(#PB_Any,10,30,Val(largeur),Val(hauteur),Val(ligne),Val(col))
                  event = fin
              EndIf                
          EndSelect
                    
      EndSelect
    

  Until Event = fin      
      
    EndIf
  EndIf
  CloseWindow(#window_newt)
  ProcedureReturn idtableau
EndProcedure

Procedure bordure(idtableau,border)
long = Len(Str(border))-1 
  For i=1 To kwar_count(idtableau)  
    If kwar_get_itemstate(idtableau,i)=1
      bordure = kwar_get_itemborder(idtableau,i) 
                         
      If Mid(Str(bordure),5-long,1) = "1"
        bordure = bordure - border
      Else
        bordure = bordure + border
      EndIf
      kwar_set_itemborder(idtableau,i,#PB_Ignore,bordure)
    EndIf
  Next
EndProcedure

window_0()
AddKeyboardShortcut(#window_0,#PB_Shortcut_Delete,#supp)
  Repeat
    EventID = WaitWindowEvent()
     
      Select EventID
    
        Case #PB_Event_Menu
          Select EventMenu()  
            Case #tool_new
              idtableau = new_tableau()  
            Case #tool_bordureG              
              bordure(idtableau,#left_border)
            Case #tool_bordureH
              bordure(idtableau,#top_border)
            Case #tool_bordureD
              bordure(idtableau,#right_border)
            Case #tool_bordureB
              bordure(idtableau,#bottom_border)
            Case #supp              
              For ncas=1 To kwar_count(idtableau)
                
                If kwar_get_itemstate(idtableau,ncas,#PB_Ignore) = 1
                  kwar_set_text(idtableau,ncas,#PB_Ignore,"")
                EndIf
              Next
          EndSelect 
        
        Case #PB_Event_Gadget
          Select EventGadget()
            Case idtableau
              If EventType()=#PB_EventType_LeftClick
                
                If GetAsyncKeyState_(#VK_LBUTTON)<0                   
                  While GetAsyncKeyState_(#VK_LBUTTON)>0 
                    lg=kwar_over_line(#window_0,idtableau)
                    col= kwar_over_column(#window_0,idtableau)
                    If lg<>memo_lg Or col<>memo_col                
                      kwar_set_state(idtableau,kwar_over_line(#window_0,idtableau),kwar_over_column(#window_0,idtableau),-1,#kwar_multiselect)  
                      memo_lg = lg
                      memo_col = col
                      relache = 0
                    EndIf
                  Wend
                  If GetAsyncKeyState_(#VK_LBUTTON)=0
                    memo_lg = 0
                    memo_col = 0
                  EndIf
                EndIf
                ;kwar_set_state(idtableau,kwar_over_line(#window_0,idtableau),kwar_over_column(#window_0,idtableau),-1,#kwar_multiselect)
              EndIf
              If EventType() = #PB_EventType_LeftDoubleClick
                kwar_edititem(idtableau,kwar_over_line(#window_0,idtableau),kwar_over_column(#window_0,idtableau))
              EndIf

          EndSelect       
      EndSelect
    

  Until EventID = #PB_Event_CloseWindow

Répondre