J'ai un dialogue dans MFC avec un CStatusBar. Dans un fil séparé, je souhaite modifier le texte du volet de la barre d'état. Cependant MFC se plaint des affirmations? Comment est-il fait? Un exemple de code serait génial.Comment modifier le texte du volet de la barre d'état d'un thread dans MFC?
Répondre
Vous pouvez envoyer un message privé à la fenêtre du cadre principal et le 'demander' pour mettre à jour la barre d'état. Le thread aurait besoin de la poignée de la fenêtre principale (n'utilisez pas l'objet CWnd car il ne sera pas thread-safe). Voici quelques exemples 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 la mémoire que je n'ai pas accès au compilateur ici à la maison, donc maintenant des excuses pour les erreurs éventuelles.
Au lieu d'utiliser WM_USER
vous pouvez enregistrer votre propre message Windows:
UINT WM_MY_MESSAGE = ::RegisterWindowsMessage(_T("WM_MY_MESSAGE"));
Faire ce qui précède un membre statique de CMainFrame
par exemple.
Si vous utilisez des ressources de chaîne est trop basique ont alors le fil d'allouer la chaîne sur le tas et assurez-vous que la fonction de mise à jour CMainFrame 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 il est un bon début.
Peut-être que cela peut vous aider: How to access UI elements from a thread in MFC.
Je ne pas de code C++/MFC moi, mais je l'avais connu le même problème en C# qui est connu comme la mise à jour de l'interface Cross-fil.
Vous devez utiliser un message (avec Send- ou PostMessage) pour notifier 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 de l'interface utilisateur à partir d'un thread de travail, cela risque de vous faire mal.
Vous devriez PostMessage, pas SendMessage. La raison pour laquelle MFC et C# se plaignent de ces choses est que SendMessage est un appel bloquant et peut provoquer des blocages. – Joel
- 1. Comment modifier l'icône de la barre d'outils pour afficher le texte dans FCKEditor
- 2. Comment tuer un thread MFC?
- 3. Division d'un volet déjà divisé (MFC)
- 4. Comment exclure une barre MFC de l'état du Dock
- 5. Comment modifier l'emplacement du texte dans UITableView?
- 6. Définir le texte de la barre d'état du parent?
- 7. Bouton Fermer dans la barre de titre dans MFC
- 8. Texte dans la barre de titre
- 9. Supprimer la barre de ruban dans MFC C++
- 10. Remplacement du volet de l'explorateur dans Windows?
- 11. Modifier la couleur de surbrillance du texte sélectionné dans RichEdit
- 12. Comment modifier les couleurs de la barre de défilement du navigateur à l'aide de CSS?
- 13. Supprimer le texte de la barre de titre d'une fenêtre mais conserver le texte de la barre d'état
- 14. Comment afficher le texte dans l'icône de la barre d'état système avec l'API win32?
- 15. Modifier le texte dans GKPeerPickerController
- 16. Modifier la position du texte dynamique dans Flash via AS
- 17. Comment modifier le texte du bouton de navigation dans le contrôle FileUpload (System.Web.UI.WebControls)
- 18. Modifier la largeur d'une barre de défilement
- 19. Masquer le texte du lien de la barre d'état dans wordpress
- 20. Comment lire la zone de texte. Valeur de texte d'un autre thread dans WPF?
- 21. Dans WPF/XAML, comment modifier la taille d'un paragraphe de texte à l'aide d'une barre de défilement?
- 22. Comment placer plusieurs contrôles dans un seul volet
- 23. Comment modifier la propriété showInPanes dans XtraCharts
- 24. comment changer le style de police du texte dans la zone de texte sur le clic?
- 25. Comment modifier le nom de la valeur supérieure dans une zone de texte d'un rapport Cognos?
- 26. Comment implémenter la barre d'outils du navigateur dans Cocoa?
- 27. Masquage de la barre de défilement verticale dans wx.TextCtrl
- 28. Comment modifier dynamiquement la couleur du texte à l'aide de VB.NET dans SSRS?
- 29. Comment modifier le texte au premier plan d'un onglet WPF avec du texte imbriqué?
- 30. Pour modifier le texte de LinkButton dans EditItemTemplate
La plage de messages WM_USER est la bonne réponse ici. RegisterWindowMessage est un peu lourd pour un message d'application privée, car il garantit l'unicité dans tout le système, et ce n'est pas nécessaire ici. – Joel
La gamme de messages WM_APP est encore meilleure. –