Frage

Ich habe einen Dialog in MFC mit einer Cstatusbar. In einem separaten Thread möchte ich den Fenstertext der Statusleiste ändern. MFC beschwert sich jedoch mit Asserts? Wie wird es gemacht? Ein Beispielcode wäre großartig.

War es hilfreich?

Lösung

Sie können eine private Nachricht im Hauptbildfenster veröffentlichen und sie "fragen", um die Statusleiste zu aktualisieren. Der Thread würde den Hauptfenstergriff benötigen (verwenden Sie das CWND -Objekt nicht, da er nicht sicher ist). Hier ist ein Beispielcode:

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;
}

Der Code stammt aus dem Speicher, da ich hier zu Hause keinen Zugriff auf den Compiler habe. Entschuldige sich jetzt für Fehler.

Anstatt zu verwenden WM_USER Sie können Ihre eigene Windows -Nachricht registrieren:

UINT WM_MY_MESSAGE = ::RegisterWindowsMessage(_T("WM_MY_MESSAGE"));

Machen Sie das oben genannte statische Mitglied von CMainFrame zum Beispiel.

Wenn die Verwendung von String -Ressourcen zu grundlegend ist, lassen Sie den Thread die Zeichenfolge auf dem Heap zuweisen und stellen Sie sicher, dass die Funktion "CMainFrame Update" sie löscht, z. B.:

// 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;
}

Nicht perfekt, aber es ist ein Anfang.

Andere Tipps

Vielleicht kann das Ihnen helfen: So greifen Sie von einem Thread in MFC von UI -Elementen zu.

Ich habe selbst keinen Codes C ++/MFC selbst, aber ich hatte das ähnliche Problem in C# erlebt, das als Cross-Thread-GUI-Update bezeichnet wird.

Sie sollten eine Nachricht (entweder mit Send- oder Postmessage) verwenden, um den UI-Thread zu informieren, dass der Statusleistentext aktualisiert werden sollte. Versuchen Sie nicht, UI -Elemente aus einem Arbeiter -Thread zu aktualisieren. Es ist verpflichtet, Ihnen Schmerzen zu geben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top