ptits problèmes

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

ptits problèmes

Message 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 
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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???
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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:
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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:
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Dernière modification par Dr. Dri le jeu. 21/oct./2004 18:11, modifié 1 fois.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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 :)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

bah, on avait tous fait l'erreur sur l'autre poste :lol:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

par contre je n'ai pas trouvé comment changer cette icone, en attendant je reste à la méthode api

Dri
Répondre