Comment modifier le texte du volet de la barre d'état à partir d'un fil dans MFC?
-
23-08-2019 - |
Question
J'ai une boîte de dialogue dans MFC avec un cStatusbar. Dans un fil séparé, je veux modifier le texte du volet de la barre d'état. Cependant, MFC se plaint avec les affirmations? Comment est-il fait? Un exemple de code serait génial.
La solution
Vous pouvez publier un message privé dans la fenêtre du cadre principal et «demander» de mettre à jour la barre d'état. Le fil aurait besoin de la poignée de fenêtre principale (n'utilisez pas l'objet CWND car il ne sera pas sûr de fil). Voici un exemple de code:
static UINT CMainFrame::UpdateStatusBarProc(LPVOID pParam);
void CMainFrame::OnCreateTestThread()
{
// Create the thread and pass the window handle
AfxBeginThread(UpdateStatusBarProc, m_hWnd);
}
LRESULT CMainFrame::OnUser(WPARAM wParam, LPARAM)
{
// Load string and update status bar
CString str;
VERIFY(str.LoadString(wParam));
m_wndStatusBar.SetPaneText(0, str);
return 0;
}
// Thread proc
UINT CMainFrame::UpdateStatusBarProc(LPVOID pParam)
{
const HWND hMainFrame = reinterpret_cast<HWND>(pParam);
ASSERT(hMainFrame != NULL);
::PostMessage(hMainFrame, WM_USER, IDS_STATUS_STRING);
return 0;
}
Le code est de mémoire car je n'ai pas accès au compilateur ici à la maison, alors je s'excuse maintenant pour les erreurs.
À la place d'utiliser WM_USER
Vous pouvez enregistrer votre propre message Windows:
UINT WM_MY_MESSAGE = ::RegisterWindowsMessage(_T("WM_MY_MESSAGE"));
Faire de ce qui précède un membre statique de CMainFrame
par exemple.
Si l'utilisation des ressources de chaîne est trop basique, demandez au thread d'allouer la chaîne sur le tas et assurez-vous que la fonction de mise à jour CMainFrame le supprime, par exemple:
// Thread proc
UINT CMainFrame::UpdateStatusBarProc(LPVOID pParam)
{
const HWND hMainFrame = reinterpret_cast<HWND>(pParam);
ASSERT(hMainFrame != NULL);
CString* pString = new CString;
*pString = _T("Hello, world!");
::PostMessage(hMainFrame, WM_USER, 0, reinterpret_cast<LPARAM>(pString));
return 0;
}
LRESULT CMainFrame::OnUser(WPARAM, LPARAM lParam)
{
CString* pString = reinterpret_cast<CString*>(lParam);
ASSERT(pString != NULL);
m_wndStatusBar.SetPaneText(0, *pString);
delete pString;
return 0;
}
Pas parfait, mais c'est un début.
Autres conseils
Peut-être que cela peut vous aider: Comment accéder à des éléments d'interface utilisateur à partir d'un fil dans MFC.
Je ne code pas moi-même C ++ / MFC, mais j'avais rencontré le problème similaire en C # qui est connu sous le nom de mise à jour de l'interface graphique.
Vous devez utiliser un message (avec Send ou PostMessage) pour informer le thread d'interface utilisateur que le texte de la barre d'état doit être mis à jour. N'essayez pas de mettre à jour les éléments d'interface utilisateur d'un fil de travail, il est forcément de vous donner de la douleur.