Page 1 sur 1

Bouton de la barre de titre

Publié : jeu. 06/mai/2004 7:14
par Le Soldat Inconnu
Salut,

encore une question tordu :

on peut retrouver quelque part le handle des boutons fermer, réduire, agrandir de la barre de titre ?
mon but étant de trouver leur position sur la barre de titre.

merci et bravo à celui qui aura la réponse parce que moi, la je cale sec :roll: :mrgreen:

Publié : jeu. 06/mai/2004 14:02
par Chris
Il y a une fonction "GetTitleBarInfo()" dans l'Api, mais je ne l'ai jamais utilisée. Je ne sais donc pas ce qu'elle donne exactement :?

Chris :)

*** Ajouté ***
A priori, elle ne retourne pas les dimensions, ou la position des boutons :(.

Publié : jeu. 06/mai/2004 16:20
par Chris
Je t'ai déjà récupéré ça, ça donne des infos sur la barre de titre, et la taille des boutons, mais pas sur le handle ou la position. :?

Code : Tout sélectionner

;- Constantes
#CCHILDREN_TITLEBAR         = 5

#STATE_SYSTEM_FOCUSABLE     = $00100000
#STATE_SYSTEM_INVISIBLE     = $00008000
#STATE_SYSTEM_OFFSCREEN     = $00010000
#STATE_SYSTEM_UNAVAILABLE   = $00000001
#STATE_SYSTEM_PRESSED       = $00000008

;- Structures
Structure TITLEBARINFO
  cbSize.l
  rcTitleBar.RECT
  rgstate.l[#CCHILDREN_TITLEBAR+1]
EndStructure

pti.TITLEBARINFO
pti\cbSize = SizeOf(TITLEBARINFO)

;- On va récupérer des infos sur la barre du Bloc-Notes à Billou
If RunProgram("Notepad.exe")
  Delay(100)                            ; Pour lui laisser le temps de s'ouvrir
  Handle = FindWindow_("Notepad",#Null)

  If GetTitleBarInfo_(Handle,@pti)<> 0
    Debug "J'la tiens !!!"
  Else
    Debug " Merde!! Loupé !!!"
  EndIf
  CloseWindow_(Handle)
  Debug"---------------------------------------"
  Debug"---------------------------------------"
EndIf


;- Affichage des résultats
Debug "Gauche = "+Str(pti\rcTitleBar\left)
Debug "Haut   = "+Str(pti\rcTitleBar\top)
Debug "Droite = "+Str(pti\rcTitleBar\right)
Debug "Bas    = "+Str(pti\rcTitleBar\bottom)
Debug ""

;- Bon, là, je comprends pas trop ce que ça représente, ni comment ça fonctionne,
;- alors j'essaye d'isoler les constantes avec un "ET" logique (&)
For i = 0 To 5
  If i = 0 : T$ = "TitleBar " : EndIf
  If i = 1 : T$ = "Reserved " : EndIf
  If i = 2 : T$ = "Minimize " : EndIf
  If i = 3 : T$ = "Maximize " : EndIf
  If i = 4 : T$ = "Help "     : EndIf
  If i = 5 : T$ = "Close "    : EndIf

  If pti\rgstate[i] & #STATE_SYSTEM_FOCUSABLE   : Debug T$+"Focusable : Oui" : Else : Debug T$+"Focusable : Non" : EndIf
  If pti\rgstate[i] & #STATE_SYSTEM_INVISIBLE   : Debug T$+"Invisible : Oui" : Else : Debug T$+"Invisible : Non" : EndIf
  If pti\rgstate[i] & #STATE_SYSTEM_OFFSCREEN   : Debug T$+"OffScreen : Oui" : Else : Debug T$+"OffScreen : Non" : EndIf
  If pti\rgstate[i] & #STATE_SYSTEM_UNAVAILABLE : Debug T$+"Unavailable : Oui" : Else : Debug T$+"Unavailable : Non" : EndIf
  If pti\rgstate[i] & #STATE_SYSTEM_PRESSED     : Debug T$+"Pressed : Oui" : Else : Debug T$+"Pressed : Non" : EndIf
  Debug"---------------------------------------"
Next
;-   J'ai tenté avec "&", ça donne des résultats, mais est-ce qu'ils sont corrects ?

;- Voilà ce que dit la doc sur RgState
;/ rgstate
;/ Pointer to an array that receives a DWORD value for each element of the title bar.
;/ the following are the title bar elements represented by the array.
;/
;/ Index   title bar element
;/   0     the title bar itself.
;/   1     Reserved.
;/   2     Minimize button.
;/   3     Maximize button.
;/   4     Help button.
;/   5     Close button.
;/
;/   each array element is a combination of one or more of the following values.
;/
;/   value                      Meaning
;/   STATE_SYSTEM_FOCUSABLE     the element can accept the focus.
;/   STATE_SYSTEM_INVISIBLE     the element is invisible.
;/   STATE_SYSTEM_OFFSCREEN     the element has no visible representation.
;/   STATE_SYSTEM_UNAVAILABLE   the element is unavailable.
;/   STATE_SYSTEM_PRESSED       the element is in the pressed state.
;-

;- Dimensions des boutons
Debug "Largeur des boutons : "+ Str(GetSystemMetrics_(#SM_CXSMSIZE ))
Debug "Hauteur des boutons : "+ Str(GetSystemMetrics_(#SM_CYSMSIZE ))
;- Il y a aussi #SM_CXSIZE et #SM_CYSIZE, mais qui m'annoncent 25 x 25
C'est tout pour le moment :oops:

Chris :)

Publié : jeu. 06/mai/2004 17:23
par Le Soldat Inconnu
Ben, c'est déjà pas mal :D merci

Publié : jeu. 06/mai/2004 17:33
par Chris
Le Soldat Inconnu a écrit :Ben, c'est déjà pas mal :D merci
Ben oui, on fait ce qu'on peut :lol:

Par contre, je viens de faire une capture d'écran des boutons de la barre de titre, et je l'ai passée dans Paint Shop Pro avec une grille à 1 pixel.

Les boutons font 21 x 21 pixels.

#SM_CXSIZE et #SM_CYSIZE me donnent 25 x 25 pixels.
#SM_CXSMSIZE, #SM_CYSMSIZE me donnent 17 x 17 pixels.

Y a un truc qui cloche un peu, là :?

Chris :)

Publié : jeu. 06/mai/2004 18:04
par Heis Spiter
Fais la moyenne des deux ;)

Publié : jeu. 06/mai/2004 18:12
par Chris
Heis Spiter a écrit :Fais la moyenne des deux ;)
Vi, bien sûr ! :lol:

Dans ce cas précis, ça marche, mais ça m'étonnerait que ce soit toujours le cas :lol:

Chris :)

Publié : jeu. 06/mai/2004 22:34
par Chris
Nouveau petit code, pour déterminer quels sont les boutons qui sont présents sur la barre d'outils, et leur état : Et toujours pas la position :lol:

Il a l'air un peu long, à première vue, mais il y a beaucoup de commentaires.

Code : Tout sélectionner

 ;/Constantes Window
Enumeration
  #Window_0
EndEnumeration

;/Constantes Gadget
Enumeration
  #Btn_Quit
EndEnumeration

;- Selon le type de construction, on trouvera un résultat différent:

;/ Type 1 : #PB_Window_TitleBar tout seul: pas de boutons
;/ Type 2 : #PB_Window_SystemMenu tout seul : La barre à au moins un bouton : "Fermer"
;/ Type 3 : #PB_Window_TitleBar ou #PB_Window_SystemMenu, + 1 bouton
;/ Les trois boutons son présents sur la barre, le bouton qui n'est pas nommé
;/ est désactivé

;- Sous PureBasic, quand une fenêtre est construite avec l'attribut #PB_Window_TitleBar,
;- et qu'on lui ajoute un bouton, par exemple #PB_Window_MinimizeGadget, elle prend
;- automatiquement l'attribut #PB_Window_SystemMenu. 
;- On peut utiliser cette propriété pour savoir quels sont les boutons présents
;- sur la barre de titre, en utilisant les constantes de windows selon les 
;- equivalences ci dessous.
;-
;- Equivalences Microsoft - PureBasic (Rien à voir avec la valeur des constantes)

;/ #PB_Window_SystemMenu = #WS_SYSMENU : La barre contient au moins le bouton "Fermer"
;/ #PB_Window_TitleBar   = #WS_CAPTION : La barre ne contient aucun bouton

;- Décommenter une des quatres lignes qui suivent, et commenter les trois autres
;If OpenWindow(#Window_0, 300, 300, 300, 200, #PB_Window_TitleBar|#PB_Window_ScreenCentered, "Fenêtre 1",0)
If OpenWindow(#Window_0, 300, 300, 300, 200, #PB_Window_SystemMenu|#PB_Window_ScreenCentered, "Fenêtre 1",0)  
;If OpenWindow(#Window_0, 300, 500, 300, 200, #PB_Window_TitleBar|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered, "Fenêtre 1",0)
;If OpenWindow(#Window_0, 300, 500, 300, 200, #PB_Window_TitleBar|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered, "Fenêtre 1",0)
    
  hWnd = WindowID(#Window_0)
  
  ;- On recupère d'abord le style de la fenêtre
  Style = GetWindowLong_(hWnd, #GWL_STYLE)
  
  ;- Si la barre de titre possède l'attribut #WS_SYSMENU, (soit #PB_Window_SystemMenu) 
  ;- elle a obligatoirement au moins un bouton: le bouton "Quitter"
  ;- Reste à déterminer si elle a les autre boutons, et si ils sont activés
  StartDrawing(WindowOutput())
  DrawingMode(1) 
  
  If Style & #WS_SYSMENU And Style & #WS_MINIMIZEBOX = 0 And Style & #WS_MAXIMIZEBOX = 0
    Locate(10,20):DrawText("Barre de titre type "+Chr(34)+"SystemMenu"+Chr(34))
    Locate(10,40) : DrawText("Pas de bouton auxiliaire")
    
  ElseIf Style & #WS_SYSMENU 
    Locate(10,20):DrawText("Barre de titre type "+Chr(34)+"SystemMenu"+Chr(34))
    
    If Style & #WS_MINIMIZEBOX
      Locate(10,40):DrawText("Bouton "+Chr(34)+"Minimize"+Chr(34)+" : Activé")
    Else
      Locate(10,40):DrawText("Bouton "+Chr(34)+"Minimize"+Chr(34)+" : Désactivé")
    EndIf
    
    If Style & #WS_MAXIMIZEBOX
      Locate(10,60):DrawText("Bouton "+Chr(34)+"Maximise"+Chr(34)+" : Activé")
    Else
      Locate(10,60):DrawText("Bouton "+Chr(34)+"Maximise"+Chr(34)+" : Désactivé")
    EndIf
    
  ElseIf Style & #WS_SYSMENU =0
    Locate(10,20):DrawText("Barre de titre type "+Chr(34)+"TitleBar"+Chr(34))
  EndIf
  
  StopDrawing()
  UpdateWindow_(hWnd)
  
  If CreateGadgetList(WindowID(#Window_0))
    ButtonGadget(#Btn_Quit, 100, 170, 100, 25, "Quitter")
  EndIf
  
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_EventGadget
        Select EventGadgetID()
          Case #Btn_Quit : quit = 1
        EndSelect
      Case #PB_EventCloseWindow : quit = 1
    EndSelect
  Until quit = 1
  End
EndIf
Voilà :D

Chris :)

Publié : ven. 07/mai/2004 7:46
par Le Soldat Inconnu
oui, ça je l'avait déjà (cf sujet "retirer les bordures et la barre de titre d'une fenêtre) mais merci quand même

pour la taille des bouton, je l'ai déjà trouver par hazard en passant toutes les constantes de GetSystemMetric_() à la moulinette.
faut que je reregarde.