Page 1 sur 2

ptits problèmes

Publié : mer. 20/oct./2004 17:38
par Dr. Dri
Salut à tous
C'est difficile de coder des ptites applis en PB sans le net ^^
Mais bon la doc est bien foutue alors c'est pas si grave ^^ (ptete pour la doc windows e fait...)

J'ai donc besoin d'une réponse (la plus rapide possible) aux quelques problèmes que j'ai...
-Comment connaitre la hauteur d'un onglet dans un panel gadget ?
-Comment connaître la hauteur d'une barre d'outils ?

Merci d'avance :)

Dri

[edit]
je viens de trouver ca sur codearchive

Code : Tout sélectionner

Procedure GetPanelItemWidth(PanelGadget) 
  ; returns the inner width of panel items 
  tc.TC_ITEM\mask = #TCIF_PARAM 
  If SendMessage_(GadgetID(PanelGadget),#TCM_GETITEM,0,@tc) 
    GetClientRect_(tc\lParam,rect.RECT) 
    ProcedureReturn rect\right 
  EndIf 
EndProcedure 

Procedure GetPanelItemHeight(Panelgadget) 
  ; returns the inner height of panel items 
  tc.TC_ITEM\mask = #TCIF_PARAM 
  If SendMessage_(GadgetID(PanelGadget),#TCM_GETITEM,0,@tc) 
    GetClientRect_(tc\lParam,rect.RECT) 
    ProcedureReturn rect\bottom 
  EndIf 
EndProcedure 

Publié : mer. 20/oct./2004 17:55
par Anonyme2
Pour la Toolbar sous XP seulement, tu récupère les infos avec le message TB_GETMETRICS


Sinon pour les autres OS, je pense qu'en utilisant l'API GetWindowRect_() tu devrais pouvoir retrouver les infos

Premier paramètre le handle de la toolbar (GadgetID(#Ma_Toolbar) et en deuxième paramètre une variable basée sur la structure RECT


GetWindoWRect_(GadgetID(#Ma_Toolbar), Coor.RECT)

Hauteur = Coor\bottom- Coor\top

Largeur = Coor\right- Coor\left




Pour XP seulement

TB_GETMETRICS Message

--------------------------------------------------------------------------------

Retrieves the metrics of a toolbar control.

Syntax


To send this message, call the SendMessage function as follows.
lResult = SendMessage( // returns nothing in lResult (HWND) hWndControl, // handle to destination control (UINT) TB_GETMETRICS, // message ID (WPARAM) wParam, // = 0; not used, must be zero (LPARAM) lParam // = (LPARAM) (TBMETRICS) ptbMetrics; );
Parameters

wParam
Must be zero.
ptbMetrics
Pointer to a TBMETRICS structure that receives the toolbar metrics.
Return Value

The return value is not used.

Remarks

Note To use this API, you must provide a manifest specifying Comclt32.dll version 6.0. For more information on manifests, see Using Windows XP Visual Styles.
Message Information

Header commctrl.h
Minimum operating systems Windows XP

Publié : mer. 20/oct./2004 17:57
par Chris
Pour les dimensions d'un onglet, il y a ça:

Code : Tout sélectionner

If OpenWindow(0,0,0,322,220,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"PanelGadget")
  If CreateGadgetList(WindowID(0)) 
    PanelGadget     (0,8,8,306,203) 
    AddGadgetItem (0,-1,"Panel 1") 
    AddGadgetItem (0,-1,"Panel 2") 
    ButtonGadget(2, 10, 15, 80, 24,"Button 1") 
    ButtonGadget(3, 95, 15, 80, 24,"Button 2") 
    CloseGadgetList() 
  EndIf
  
  SendMessage_(GadgetID(0),#TCM_GETITEMRECT,0,@prc.RECT)
  
  Debug "Hauteur de l'onglet 0 : "+Str(prc\bottom - prc\top)
  Debug "Largeur de l'onglet 0 : "+Str(prc\right - prc\left)
  
  
  Repeat
  Until WaitWindowEvent()=#PB_Event_CloseWindow  
EndIf 
wParam est l'index de l'onglet.

C'est ça que tu cherches???

Publié : mer. 20/oct./2004 18:02
par Dr. Dri
merci à tou les deux, j'espere que vous avez tapé dans le mille, je ne manquerait pas de vous le faire savoir ^^

Dri

Publié : mer. 20/oct./2004 18:05
par Chris
Bon, ben moi, je prépare le casque.
On sait jamais, des fois que je me soit planté, et que tu reviennes avec un manche de pioche. :lol:

Publié : mer. 20/oct./2004 18:12
par Anonyme2
Chris a écrit :Bon, ben moi, je prépare le casque.
On sait jamais, des fois que je me soit planté, et que tu reviennes avec un manche de pioche. :lol:
Y a de la place pour deux ? :mrgreen:

En fait j'ai pas testé, c'est juste une idée :roll:

Publié : mer. 20/oct./2004 18:39
par Chris
Ptit bonus:

Code : Tout sélectionner

Procedure MakeLong(low.w, high.w)   
  ProcedureReturn low + (high<<16)
EndProcedure

If OpenWindow(0,0,0,322,220,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"PanelGadget")
  If CreateGadgetList(WindowID(0)) 
    PanelGadget     (0,8,8,306,203) 
    AddGadgetItem (0,-1,"Panel 1") 
    AddGadgetItem (0,-1,"Panel 2") 
    ButtonGadget(2, 10, 15, 80, 24,"Button 1") 
    ButtonGadget(3, 95, 15, 80, 24,"Button 2") 
    CloseGadgetList() 
  EndIf
  
  ;- On met le style du PanelGadget à #TCS_FIXEDWIDTH
  SetWindowLong_(GadgetID(0), #GWL_STYLE,GetWindowLong_(GadgetID(0), #GWL_STYLE)|#TCS_FIXEDWIDTH)
  
  ;- On récupère la largeur et la hauteur de l'onglet à l'origine
  SendMessage_(GadgetID(0),#TCM_GETITEMRECT,0,@prc.RECT)
  
  HauteurOrigine$ = "Hauteur de l'onglet 0 : "+Str(prc\bottom - prc\top)
  LargeurOrigine$ = "Largeur de l'onglet 0 : "+Str(prc\right - prc\left)
  
  ;- On modifie ensuite la taille des onglets
  SendMessage_(GadgetID(0),#TCM_SETITEMSIZE, 0, MakeLong(150,70))
  
  ;- Et on récupère les nouvelles dimensions
  SendMessage_(GadgetID(0),#TCM_GETITEMRECT,0,@prc.RECT)
  
  HauteurModifiee$ = "Maintenant, la hauteur de l'onglet 0 est de : "+Str(prc\bottom - prc\top)
  LargeurModifiee$ = "Maintenant, la largeur de l'onglet 0 est de : "+Str(prc\right - prc\left)
  
  ;- On sélectionne le premier onglet
  SetGadgetState(0, 0)
  
  ;-On affiche les résultats dans le débugger
  Debug HauteurOrigine$
  Debug LargeurOrigine$
  Debug ""
  Debug HauteurModifiee$
  Debug LargeurModifiee$
  
  Repeat
  Until WaitWindowEvent()=#PB_Event_CloseWindow 
EndIf
La procédure MakeLong() a été pompée dans les includes de jaPBe

Publié : jeu. 21/oct./2004 17:45
par Dr. Dri
Salut, finalement j'ai à nouveau le net ^^
donc je m'excuse d'avoir demandé une réponse rapide lol

pour la barre d'outils, ca ne marche pas (surement à coz du gadgetID())
pour l'autre, ca fonctionne, mais la solution que j'ai trouvée sur codearchive convient mieux, comme à la base la hauteur de l'onglet devait me servir à trouver la taille "intérieure" du panel...

avec tout ca j'ai même réussi à oublier la seule question pour laquelle je n'ai pas encore de réponse, à savoir : comment connaitre la taille d'une barre de statut ?

Autre gros probleme :
(attention, ceux qui ont l'habitude de ne rien comprendre à ce que je dis, s'abstenir)
  • -Mon gadget panel correspond pour chaque onglet à un fichier
    -Je voudrais afficher dans chaque onglet l'icone du fichier
    -Pour l'icone j'utilise la fonction de Regis (simlpe et efficace)
    -J'ai pour ca cherché sur codearchiv (un peu trouvé par hasard) de quoi faire
    -J'ai trouvé une solution mais à chaque ouverture de fichier ce sont tous les onglets qui prennent l'icone
J'ai isolé cette partie du code, pour en faire une petite source d'exemple, j'ai à peine modifié les fonction trouvées sur codearchiv

Code : Tout sélectionner

Procedure GetFileSmallIconID(Location.s)
  Protected Info.SHFILEINFO
  SHGetFileInfo_(Location, 0, @Info, SizeOf(SHFILEINFO), #SHGFI_ICON|#SHGFI_SMALLICON)
  ProcedureReturn Info\hIcon
EndProcedure

Procedure PanelImageEnabled(PanelGadget.l, MaxOnglets.l)
  Protected hImgList.l
  ;Sous XP ça plante (Envoyer le rapport, pas méchant)
  ;Pour tester sous XP faut virer les 3 lignes d'en dessous
  If OSVersion() = #PB_OS_Windows_XP
    ProcedureReturn #FALSE
  EndIf
  
  If hImgList=0
    hImgList = ImageList_Create_(16, 16, #ILC_COLOR32|#ILC_MASK, MaxOnglets, MaxOnglets)
  EndIf
  
  If hImgList
    SendMessage_(GadgetID(PanelGadget), #TCM_SETIMAGELIST, 0, hImgList)
    ProcedureReturn #TRUE
  EndIf
  
  ProcedureReturn #FALSE
EndProcedure

Procedure SetPanelImage(PanelGadget.l, Position.l, ImageID.l)
  Protected hImgList.l, pItem.TC_ITEM, ID.l
  ID = GadgetID(PanelGadget)
  hImgList = SendMessage_(ID, #TCM_GETIMAGELIST, 0, 0)
  pItem\mask = #TCIF_IMAGE
  SendMessage_(ID, #TCM_GETITEM, Position, @pItem)
  If pItem\iImage = 0
    ;PB ne reconnait pas ImageList_AddIcon_ :(
    ;De toute façon ça fonctionne sans...
    ;pItem\iImage = ImageList_AddIcon_(hImgList, ImageID)
  Else
    pItem\iImage = ImageList_ReplaceIcon_(hImgList, pItem\iImage, ImageID)
  EndIf
  SendMessage_(ID, #TCM_SETITEM, Position, @pItem)
EndProcedure


If OpenWindow(0, 0, 0, 400, 400, #PB_Window_SystemMenu, "")

  If CreateGadgetList(WindowID(0))
    PanelGadget(0, 0, 0, 400, 370)
    CloseGadgetList()
  EndIf
  
  hMenu = CreateMenu(0, WindowID(0))
  If hMenu
    MenuTitle("Menu")
    MenuItem(0, "Ouvrir")
    MenuItem(1, "Fermer")
  EndIf
  
  #MaxOnglets = 3
  
  Repeat
  
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Menu
    
      MenuID = EventMenuID()
      
      If MenuID=0
        Fichier$ = OpenFileRequester("", "", "Tout (*.*)|*.*", 0)
        If OpenFile(0, Fichier$)
          CloseFile(0)
          AddGadgetItem(0, -1, GetFilePart(Fichier$))
          ;Si on ouvre un fichier on met dans l'onglet
          ;l'icône correspondante, ca en jette un max ^^
          If PanelImageEnabled(0, #MaxOnglets)
            IconID.l = GetFileSmallIconID(Fichier$)
            Num.l = CountGadgetItems(0)-1
            SetPanelImage(0, Num, IconID)
          EndIf
        Else
          MessageRequester("", "Impossible d'ouvrir le fichier", 16)
        EndIf
      Else
        Num = GetGadgetState(0)
        If Num>=0
          RemoveGadgetItem(0, Num)
        EndIf
      EndIf
    
    EndIf
    
  Until Event = #PB_Event_CloseWindow
  
EndIf
Dri

Publié : jeu. 21/oct./2004 18:00
par Anonyme2
Dri, tu as parlé de barre d'outil (j'ai donc compris Toolbar) puis dans ton dernier post tu parle de la barre de status 8O

Pour la barre de status, Chris a posté un code. Il faut faire une recherche sur le forum.


J'ai posté il y a pas longtemps un message avec un lien sur le code qui comportait cette procédure adapté du code de Chris

Code : Tout sélectionner

Procedure StatusBarheight(StatusBarHandle)
  BordureHorizontale.l
  BordureVerticale.l
  BordureInterRectangle.l
  ; **********************************************************
  ; Récupération de la hauteur et de la largeur de la StatusBar
  ; Code de Chris
  SendMessage_(StatusBarHandle, #SB_GETRECT, 0, @Value.RECT)
  Hauteur = Value\bottom - Value\top
  ; **********************************************************
  ; dimensions de la bordure
  SendMessage_(StatusBarHandle, #SB_GETBORDERS, 0, @BordureHorizontale)
  ProcedureReturn Value\bottom - Value\top + BordureVerticale
EndProcedure

Publié : jeu. 21/oct./2004 18:10
par Dr. Dri
erreur de ma part ^^
comme j'avais ma question à poser sur la barre de statut je n'ai pas écri toolbar là où j'aurais du ^^, je vais donc le modifier...

pour la fonction sur la barre de statut, merci, je jetterai un coup d'oeil :)
(et puis comme ca à l'air de fonctionner je vais la garder :p)

Dri

Publié : sam. 23/oct./2004 14:19
par Dr. Dri
je crois que j'en ai découragé certains avec mon dernier bout de code...
au cas où ca servirait à quelqu'un, j'ai trouvé la réponse tout seul comme un grand...

il manquait une ligne dans une des procédures, je la réécris ici

Code : Tout sélectionner

Procedure PanelImageEnabled(PanelGadget.l, MaxOnglets.l)
  Protected hImgList.l
  ;Sous XP ça plante (Envoyer le rapport, pas méchant)
  ;Pour tester sous XP faut virer les 3 lignes d'en dessous
  If OSVersion() = #PB_OS_Windows_XP
    ProcedureReturn #FALSE
  EndIf
 
  hImgList = SendMessage_(ID, #TCM_GETIMAGELIST, 0, 0)
  If hImgList=0
    hImgList = ImageList_Create_(16, 16, #ILC_COLOR32|#ILC_MASK, MaxOnglets, MaxOnglets)
  EndIf
 
  If hImgList
    SendMessage_(GadgetID(PanelGadget), #TCM_SETIMAGELIST, 0, hImgList)
    ProcedureReturn #TRUE
  EndIf
 
  ProcedureReturn #FALSE
EndProcedure
Dri

Publié : sam. 23/oct./2004 18:52
par Le Soldat Inconnu
AddGadgetItem(#Gadget, Position, Texte$ [, ImageID])

Ajoute un élément au gadget spécifié par #Gadget. Le paramètre 'ImageID' est facultatif et est utilisé pour afficher une image (icone) à coté de l'élément inséré. 'ImageID' peut être récupéré facilement grâce à la commande ImageID().

donc lors de la création du panel gadget, il suffit d'indiquer l'icone

voir dans ce sujet la réponse de Fred :
http://purebasic.hmt-forum.com/viewtopi ... gadgetitem

Publié : sam. 23/oct./2004 20:51
par Dr. Dri
Merci beaucoup
j'ai plus qu'à aller chercher un pistolet et à me le coller sur la tempe
ca doit ere parce que j'ai trouvé ca sur codearchiv ke j'ai voulu l'ajouter sans savoir si ca existait ou pas directement en pure...

Dri :)

Publié : dim. 24/oct./2004 9:42
par Le Soldat Inconnu
bah, on avait tous fait l'erreur sur l'autre poste :lol:

Publié : lun. 25/oct./2004 9:19
par Dr. Dri
par contre je n'ai pas trouvé comment changer cette icone, en attendant je reste à la méthode api

Dri