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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top