Récupérer le texte d'une StatusBar

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

Récupérer le texte d'une StatusBar

Message par Le Soldat Inconnu »

Salut,

un ch'tit problème pour récupérer le texte d'un statusbar. je n'arrive pour l'instant qu'a récupérer le texte du premier field mais pas du second.

Code : Tout sélectionner

#SizeWindowX = 300
#SizeWindowY = 200

Procedure Open_Window()
  If OpenWindow(0, 0, 0, #SizeWindowX, #SizeWindowY, #PB_Window_ScreenCentered, "Fenêtre")
    If CreateGadgetList(WindowID())
      TextGadget(1 ,3, #SizeWindowY - 40, #SizeWindowX - 6, 15, "Alt + F4 pour quitter")
      
      H = CreateStatusBar(2, WindowID())
      AddStatusBarField(100)
      AddStatusBarField(100)
      StatusBarText(2, 0, "truc")
      StatusBarText(2, 1, "machin")
      
      Txt.s = Space(200)
      GetWindowText_(H, @txt, 200)
      Debug txt
      
    EndIf
  EndIf
EndProcedure

; Debut du programme

Open_Window()

Repeat
  Event = WaitWindowEvent()
  
Until Event = #PB_EventCloseWindow
Merci d'avance.
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)]
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Pour les StatusBAr, les messages à utiliser commencent par

SB

Pour récupérer le texte utilise SB_GETTEXT

Text.s = space(256)
SendMessage_(#StatuSBar, #SB_GETTEXT, Index_Du_Champ, Text)


et SB_GETTEXT = 1026
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

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)]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

J'arrive trop tard,mais je poste quand même:

Code : Tout sélectionner

#SizeWindowX = 300 
#SizeWindowY = 200 

Procedure Open_Window() 
  If OpenWindow(0, 0, 0, #SizeWindowX, #SizeWindowY, #PB_Window_ScreenCentered, "Fenêtre") 
    If CreateGadgetList(WindowID()) 
      TextGadget(1 ,3, #SizeWindowY - 40, #SizeWindowX - 6, 15, "Alt + F4 pour quitter") 
      
      Hstatusbar = CreateStatusBar(2, WindowID()) 
      AddStatusBarField(100) 
      AddStatusBarField(100) 
      StatusBarText(2, 0, "truc") 
      StatusBarText(2, 1, "machin") 
      
      result.l=SendMessage_(hwndStatus, #SB_GETTEXTLENGTH, 0, 0)
      longueur=result&$FFFF
      text$=Space(longueur)
      SendMessage_(Hstatusbar, #SB_GETTEXT, 0,@text$)
      Debug text$
      result.l=SendMessage_(hwndStatus, #SB_GETTEXTLENGTH, 0, 0)
      longueur=result&$FFFF
      text$=Space(longueur)
      SendMessage_(Hstatusbar, #SB_GETTEXT, 0,@text$)
      SendMessage_(Hstatusbar, #SB_GETTEXT, 1,@text$)
      Debug text$

    EndIf 
  EndIf 
EndProcedure 

; Debut du programme 

Open_Window() 

Repeat 
  Event = WaitWindowEvent() 
  
Until Event = #PB_EventCloseWindow 
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Ouin, ça marche pas avec l'explorateur window, j'arrive pas à choper le texte de la statusbar. pourtant, j'arrive bien à récupérer le handle de cette statusbar.

je poste un exemple pour illustrer mon prob d'ici peu
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)]
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

y'a des functions sur les gadgets qui verifient si tu es dans le meme process, pour des raisons de sécurité. C'est peut etre le cas ici ?
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

ha zut, et je fais comment alors ?

le code pour tester :

Code : Tout sélectionner

Delay(1000)
WindowE = GetForegroundWindow_()


hwndStatus = FindWindowEx_(WindowE, 0,"msctls_statusbar32" , 0)

Texte.s = Space(100) 
SendMessage_(hwndStatus, #SB_GETTEXT, 0, @Texte)
Debug Texte
SendMessage_(hwndStatus, #SB_GETTEXT, 1, @Texte)
Debug Texte
la aussi, ça marche pas pour récupérer le texte de la statusbar avec l'éditeur de pb
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)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

bon si personne n'arrive à m'aider pour choper le texte, est-ce que quelqu'un peut m'aider à faire une copie d'image de la statusbar, un peu comme un printscreen sauf que je veux récupérer ce qui est dessiner sur la fenêtre même si c'est pas visible à l'écran. 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 »

J'ai essayé de faire ce code pour récupérer les textes des champs:

J'ai le handle de la StatusBar, mais pas moyen de récupérer les textes.

C'est quand même bizarre, cette affaire :(

Code : Tout sélectionner

; Handle de l'explorer
hWnd = FindWindow_("ExploreWClass",#NULL)
If hWnd <> 0
  
  ; Handle de la StatusBar
  hStatus = FindWindowEx_(hWnd, 0,"msctls_statusbar32" , 0)
  
  ; Nombre de champs
  NbParts = SendMessage_(hStatus,#SB_GETPARTS,50,0) ;50 = Nbre maxi de champs. On met ce qu'on veut!
  
  ; Recupération du texte des champs : MARCHE PAS , FAIT Ch..... :)
  For i = 0 To NbParts -1
    lng.l = SendMessage_(hStatus, #SB_GETTEXTLENGTH, i, 0)
    Txt.s = Space(lng)
    SendMessage_(hStatus, #SB_GETTEXT, i,@Txt)
    Debug Txt
  Next
EndIf
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 oui, ça fait ch... comme tu dis dans ton code. Fred a dit qu'il y a avait un truc de sécurité sur certain gadget. si on peut même pas lire le texte, c'est quand même grave, il ont bu quoi chez microchiote ?

qaund on fait #SB_GetText à la place de #Sb_SetText, ça efface la barre d'état. pas mal aussi

Code : Tout sélectionner

Delay(1000)

WindowE = GetForegroundWindow_()

hwndStatus = FindWindowEx_(WindowE, 0, "msctls_statusbar32", 0)

NbField = SendMessage_(hwndStatus, #SB_GETPARTS, 50, 0)

Debug NbField

Texte.s = Space(100)

For n = 0 To NbField - 1
  Debug SendMessage_(hwndStatus, #SB_GETTEXT, n, Texte)
  Debug Texte
Next
Dernière modification par Le Soldat Inconnu le sam. 20/mars/2004 16:17, modifié 1 fois.
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)]
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Oui, j'ai testé le code de CHris, on retrouve le handle, le nombre de champs et la longueur du texte de chaque champs, mais pas le texte.

Y protège tout le monsieur MS
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

la longueur, y'a un truc avec ça :
Return Values

Returns a 32-bit value that consists of two 16-bit values. The low word specifies the length, in characters, of the text. The high word specifies the type of operation used to draw the text. The type can be one of the following values:

Value Description
0 The text is drawn with a border to appear lower than the plane of the window.
SBT_NOBORDERS The text is drawn without borders.
SBT_POPOUT The text is drawn with a border to appear higher than the plane of the window.
SBT_RTLREADING Displays text using right-to-left reading order on Hebrew or Arabic systems.
On fait comment pour décomposer un long en 2 Word ?
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 »

Pour récupérer le HighWord:

Valeur.l >>16&$FFFF

Pour le LowWord

Valeur.l &$FFFF

Exemple :

Code : Tout sélectionner

Valeur.l = 65885265

Low = Valeur&$FFFF : Debug Low
High = Valeur>>16&$FFFF : Debug High
Chris :)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

trouver le problème :
CreateStatusWindow
This function creates a status window, which is typically used to display the status of an application. The window generally appears at the bottom of the parent window, and it contains the specified text.

HWND CreateStatusWindow(
LONG style,
LPSTR lpszText,
HWND hwndParent,
WORD wID );
Parameters

style
Window styles for the status window. This parameter must include the WS_CHILD style and should also include the WS_VISIBLE style.
lpszText
Long pointer to a null-terminated string that contains the status text for the first part.
hwndParent
Handle to the parent window.
wID
Control identifier for the status window. The window procedure uses this value to identify messages it sends to the parent window
.
voir ce qui est souligné.

on fait comment pour changer le wID :wink:
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)]
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

La fonction d'après la doc MS SDK est obsolète et doit être remplacée par CreateWIndow. Cà c'est pour la petite histoire..


Sinon essaye SetWindowLong avec nIndex valant GWL_ID et dwNewLong ayant la nouvelle valeur.

Je ne sais pas si ca va aller.
Répondre