Bouton de la barre de titre

Programmation d'applications complexes
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Bouton de la barre de titre

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

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

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

Message par Le Soldat Inconnu »

Ben, c'est déjà pas mal :D merci
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)]
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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 :)
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message par Heis Spiter »

Fais la moyenne des deux ;)
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

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

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

Message 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.
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)]
Répondre