Pregunta

Tengo un cuadro de diálogo en MFC con un CStatusBar. En un hilo separado, quiero cambiar el texto del panel de la barra de estado. Sin embargo MFC se queja con afirma? ¿Cómo se hace? Un código de ejemplo podría ser grande.

¿Fue útil?

Solución

Se puede publicar un mensaje privado a la ventana de marco principal y 'pedir' para actualizar la barra de estado. El hilo necesitaría el mango principal ventana (no use el objeto CWnd, ya que no será hilo de seguridad). Aquí hay un código de ejemplo:

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

El código es de la memoria, ya que no tengo acceso a compilador aquí en casa, por lo que ahora disculpas por cualquier error.

En lugar de utilizar WM_USER se podría registrar su propio mensaje de Windows:

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

Hacer la encima de un miembro estático de CMainFrame por ejemplo.

Si se utiliza recursos de cadena es demasiado básico, entonces tienen el hilo asignar la cadena en el montón y asegúrese de que la función de actualización CMainFrame lo elimina, por ejemplo:.

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

No es perfecto, pero es un comienzo.

Otros consejos

Tal vez esto le puede ayudar: ¿Cómo acceder a elementos de la interfaz de un hilo en MFC.

Yo no codifican C ++ / MFC mí mismo, sino que había experimentado el problema similar en C # que se conoce como actualización de interfaz gráfica de usuario se crucen.

Debe utilizar un mensaje (ya sea con o Enviar- PostMessage) para notificar al hilo de interfaz de usuario que el texto de la barra de estado debe ser actualizada. No trate de actualizar elementos de la interfaz de un subproceso de trabajo, es obligado a darle dolor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top