Changer le texte du StatusBar de l'éxtérieur
Bonjour,
Je suis entrain de développez une application MFC.
J'ai voulu appeler la barre d'état dans un autre classe(c'est à dire j'ai voulu changer le texte de la barre d'état dans une classe autre que CmainFrame)
y a t il une solution pour faire ça.:cry::cry::cry::cry::cry::cry::cry::cry:
J'ai utilisé Visual Studio 2008.
Merci pour votre aide
Utilisation d'un message personnalisé
Hello,
J'ai eu ce problème et j'ai utilisé un message personnalisé, je ne sais pas si c'est la meilleure solution mais ça marche bien.
J'ai défini un ID pour mon message (MainFrm.h):
Code:
#define WM_STATUS_CHANGE WM_USER+100
(voir http://cpp.developpez.com/faq/vc/?pa...PrivateMessage)
Ensuite j'ai défini une fonction qui intercepte le message dans CMainFrm.cpp.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
//{{AFX_MSG_MAP(CMainFrame)
//}}AFX_MSG_MAP
ON_WM_CREATE()
...
//Private message
ON_MESSAGE(WM_STATUS_CHANGE, &CMainFrame::OnStatusChange)
END_MESSAGE_MAP()
...
//ON STATUS CHANGE MESSAGE
//This message is received from other class for change Status bar text
// wparam [in]: Contains the string for update the status bar
// lparam [in]: Contains the status bar pane index to update.
long CMainFrame::OnStatusChange(WPARAM wparam,LPARAM lparam)
{
//Get the string
CString *stStatus = (CString*) wparam;
//get the index
int iIndex = (int) lparam;
//Check parameters and, if there are OK, update the status bar
if(!stStatus->IsEmpty() && (iIndex >= ST_STATUS) && (iIndex <= ST_ATR))
this->SetStatus(*stStatus, iIndex);
return 0L;
} |
Voici "l'appel" depuis une autre fonction, il faut préalablement récuperer un pointeur sur la MainFrame afin de pouvoir lui envoyer un message, d'autres possibilités sont dispos dans la FAQ.
Code:
1 2 3 4 5 6 7 8 9
|
//Get a pointer to the mainframe for send message
m_pTheFrame = (CMainFrame*)( AfxGetMainWnd()) ;
if(m_pTheFrame != NULL)
{
//post message
m_csString = "Text à mettre dans la status bar";
m_pTheFrame->PostMessageA(WM_STATUS_CHANGE, (WPARAM)&m_csString, STATUS_BAR_INDEX1);
} |
Voici encore le code de ma fonction SetStatus (que j'aurais pu appelé SetStatusText si j'étais un bon programmeur ;)):
Tu pourra noter que j'ai ajouter un flag qui se met à TRUE uniquement lorsque la barre de status est crée ( dans CMainFrame::OnCreate), afin d'éviter une erreur si un appel a SetStatus est fait trop rapidement.
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
void CMainFrame::SetStatus(CString st, int iIndex)
{
if(!m_bIsStatusBarReady) return; //Flag set to TRUE when status bar is created
//Ici tu peux placer du code pour éventuellement modifier le texte
//dans un certain format, vérifier la validité de l'index,
//ou encore d'autres traitements.
m_wndStatusBar.SetPaneText(iIndex, st);
} |
En ésperant avoir pu t'aider. Désolé pour la conjugaison et l'orthographe, j'ai écrit ça rapidement