Barre d'état (rajout icones)

Barre d'état (rajout icones) - C++ - Programmation

Marsh Posté le 17-05-2004 à 12:20:31    

J'arrive à rajouter des éléments à ma barre d'état mais ce n'est que du texte. J'aimerais pouvoir rajouter une icone ou une image dans cette barre d'état.
J'ai cherché mais il n'y a pas de fonction SetIcon() ou SetBitmap() membre pour la classe CStatusBar.
Est-ce que quelqu'un sait comment faire? :??:

Reply

Marsh Posté le 17-05-2004 à 12:20:31   

Reply

Marsh Posté le 17-05-2004 à 13:20:03    

Il faut commencer par modifier le tableau static indicators présent (typiquement) dans le .cpp de la fenêtre cadre principale.
 
Par exemple, si tu veux rajouter une icone, rajoute une zone nommée ID_INDICATOR_MYICON au tableau(n'oublie pas de rajouter le symbole ID_INDICATOR_MYICON dans ta string table dans le resource manager)
 

Code :
  1. static UINT indicators[] =
  2. {
  3. ID_INDICATOR_TEXT, // 4 zones de texte séparées
  4. ID_INDICATOR_TEXT,
  5. ID_INDICATOR_TEXT,
  6. ID_INDICATOR_TEXT,
  7. ID_INDICATOR_MYICON, // notre icone
  8. };


 
Ensuite, il suffit de récupérer le rectangle qui entoure la zone que tu as crée dans ta statusbar -> CStatusBar::GetItemRect() + CStatusBar::CommandToIndex()
 
Par exemple:
 

Code :
  1. CRect br;
  2. m_wndStatus.GetItemRect(m_wndStatus.CommandToIndex(ID_INDICATOR_MYICON), &br);


 
Il ne te reste plus qu'a créer le controle à placer dans la statusbar (la statusbar est la fenêtre parent de ce controle...)
 
Ex:
 

Code :
  1. m_staticLed.Create(NULL, WS_CHILD | WS_VISIBLE | SS_ICON | SS_CENTER, br, &m_wndStatus);
  2. m_staticLed.SetIcon(LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_LEDON)));
  3. m_staticLed.SetWindowPos(NULL, 0,0, br.Width(), br.Height(), SWP_NOMOVE | SWP_NOZORDER);


 
Note que j'ai positionné (lors de sa création) et dimensionné (SetWindowPos) mon controle à l'aide du rectangle renvoyé précdemment  (br).
 
Le pb est que ce rectangle a pour dimension la taille maximale de la zone de texte ( symbole ID_INDICATOR_MYICON) qui a été définie dans le resource manager -> 0*0 si tu n'as pas défini de texte associé à ce symbole.
 
Pour que ce rectangle ait des dimensions correctes, il faut donc associer un texte au symbole ID_INDICATOR_MYICON, par exemple: une chaine de " " de la longueur que ton controle aura...
 
Cette solution est brouillon, la meilleure solution est de récupérer les dimensions de ton controle et/ou de les fixer indépendamment des dimensions du symbole...
 
edit: La méthode CStatusBar::SetPaneInfo() peut t'être très utile...


Message édité par pedro-2480 le 17-05-2004 à 13:38:05

---------------
- Pierre Baudelet -
Reply

Marsh Posté le 17-05-2004 à 14:24:48    

Merci beaucoup

Reply

Marsh Posté le 17-05-2004 à 14:40:31    

Question a la con mais c'est quoi ton m_staticLed?
Tu le défini comment?

Reply

Marsh Posté le 17-05-2004 à 14:48:50    

C'est un CStatic qui me sert à afficher une belle LED (comme Winzip) ;)


---------------
- Pierre Baudelet -
Reply

Marsh Posté le 17-05-2004 à 15:40:43    

Ca marche mais c'est pas terrible.
En fait le texte défini dans la string table passe au-dessus de l'icone.
Je vois donc l'icone que très brèvement et seulement quand je fais quelquechose (bouger souris par ex)

Reply

Marsh Posté le 17-05-2004 à 21:09:10    

Dans ce cas c'est que tu n'as pas fait les opérations au bon moment (genre dans OnCreate ou OnInitDialog)
 
Cela marche parfaitement normalement...
 
Si le pb est encore la, positionne ton icone en top du Z order de l'ensemble des éléments de la status bar (::SetWindowPos(m_wndStatusBar.m_hWnd, m_superbeIcone.m_hWnd, 0,0,0,0, SWP_NOMOVE |SWP_NOSIZE) )


---------------
- Pierre Baudelet -
Reply

Marsh Posté le 18-05-2004 à 14:36:57    

Non désolé même avec ca ca marche pas.
J'utilise ces lignes de code ailleurs.
En fait je l'utilise dans une fonction permettant de mettre à jour continuellement la barre d'état :

Code :
  1. void CMainFrame::OnUpdate....(CCmdUI *pCmdUI)
  2. {
  3.        //les lignes de code
  4. }


Quand je fais ça, le texte que j'ai rajouté dans ma string table s'affiche par-dessus l'icone.
Et ta dernière fonction n'y change rien.
C'est le fait que les lignes soient mal placées?
Parce qu'en fait il faut absolument que cette icone soit mise à jour régulièrement (affichage de 2 icones différentes dans le même espace)

Reply

Marsh Posté le 19-05-2004 à 12:42:08    

up

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed